From 03445eef45d9fba66d48ea5ca86742685d91faa5 Mon Sep 17 00:00:00 2001 From: rafael Date: Wed, 22 Apr 2026 10:14:29 -0300 Subject: [PATCH 01/87] update group chat lexicons (#4876) --- .changeset/tall-suits-yell.md | 5 + lexicons/chat/bsky/actor/defs.json | 14 ++- lexicons/chat/bsky/convo/defs.json | 97 +++++++++++--- lexicons/chat/bsky/convo/getMessages.json | 8 ++ packages/api/src/client/lexicons.ts | 119 +++++++++++++++--- .../src/client/types/chat/bsky/actor/defs.ts | 18 ++- .../src/client/types/chat/bsky/convo/defs.ts | 53 ++++++-- .../types/chat/bsky/convo/getMessages.ts | 3 + packages/ozone/src/lexicon/lexicons.ts | 119 +++++++++++++++--- .../src/lexicon/types/chat/bsky/actor/defs.ts | 18 ++- .../src/lexicon/types/chat/bsky/convo/defs.ts | 53 ++++++-- .../types/chat/bsky/convo/getMessages.ts | 3 + 12 files changed, 433 insertions(+), 77 deletions(-) create mode 100644 .changeset/tall-suits-yell.md diff --git a/.changeset/tall-suits-yell.md b/.changeset/tall-suits-yell.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/tall-suits-yell.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/actor/defs.json b/lexicons/chat/bsky/actor/defs.json index c1756545bed..39532b6e8da 100644 --- a/lexicons/chat/bsky/actor/defs.json +++ b/lexicons/chat/bsky/actor/defs.json @@ -39,7 +39,11 @@ "kind": { "description": "Union field that has data specific to different kinds of convos.", "type": "union", - "refs": ["#directConvoMember", "#groupConvoMember"] + "refs": [ + "#directConvoMember", + "#groupConvoMember", + "#pastGroupConvoMember" + ] } } }, @@ -49,7 +53,7 @@ "properties": {} }, "groupConvoMember": { - "description": "[NOTE: This is under active development and should be considered unstable while this note is here].", + "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member.", "type": "object", "required": ["role"], "properties": { @@ -64,6 +68,12 @@ "ref": "#memberRole" } } + }, + "pastGroupConvoMember": { + "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member.", + "type": "object", + "required": [], + "properties": {} } } } diff --git a/lexicons/chat/bsky/convo/defs.json b/lexicons/chat/bsky/convo/defs.json index cbbf30ae020..e7ac9be926f 100644 --- a/lexicons/chat/bsky/convo/defs.json +++ b/lexicons/chat/bsky/convo/defs.json @@ -72,6 +72,13 @@ "sentAt": { "type": "string", "format": "datetime" } } }, + "systemMessageReferredUser": { + "type": "object", + "required": ["did"], + "properties": { + "did": { "type": "string", "format": "did" } + } + }, "systemMessageView": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here].", "type": "object", @@ -107,7 +114,7 @@ "member": { "description": "Current view of the member who was added.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" }, "role": { "description": "Role the user was added to the group with. The role from 'member' will reflect the current data, not historical.", @@ -116,7 +123,7 @@ }, "addedBy": { "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -128,11 +135,11 @@ "member": { "description": "Current view of the member who was removed.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" }, "removedBy": { "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -144,7 +151,7 @@ "member": { "description": "Current view of the member who joined.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" }, "role": { "description": "Role the user was added to the group with. The role from 'member' will reflect the current data, not historical.", @@ -154,7 +161,7 @@ "approvedBy": { "description": "If join link was configured to require approval, this will be set to who approved the request. Undefined if approval was not required.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -166,7 +173,7 @@ "member": { "description": "Current view of the member who left the group.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -178,7 +185,7 @@ "lockedBy": { "description": "Current view of the member who locked the group.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -190,7 +197,7 @@ "unlockedBy": { "description": "Current view of the member who unlocked the group.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -202,7 +209,7 @@ "lockedBy": { "description": "Current view of the member who locked the group.", "type": "ref", - "ref": "chat.bsky.actor.defs#profileViewBasic" + "ref": "#systemMessageReferredUser" } } }, @@ -476,7 +483,7 @@ "logAddMember": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was added to a group convo. The member who was added gets a logBeginConvo (to create the convo) but also a logAddMember (to show the system message as the first message the user sees).", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -484,13 +491,21 @@ "description": "A system message with data of type #systemMessageDataAddMember", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, "logRemoveMember": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was removed from a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logRemoveMember (because they already left, so can't see the system message).", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -498,13 +513,21 @@ "description": "A system message with data of type #systemMessageDataRemoveMember", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, "logMemberJoin": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member joined a group convo via join link. The member who was added gets a logBeginConvo (to create the convo) but also a logMemberJoin (to show the system message as the first message the user sees).", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -512,13 +535,21 @@ "description": "A system message with data of type #systemMessageDataMemberJoin", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, "logMemberLeave": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member voluntarily left a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logMemberLeave (because they already left, so can't see the system message).", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -526,13 +557,21 @@ "description": "A system message with data of type #systemMessageDataMemberLeave", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, "logLockConvo": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked.", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -540,13 +579,21 @@ "description": "A system message with data of type #systemMessageDataLockConvo", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, "logUnlockConvo": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was unlocked.", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -554,13 +601,21 @@ "description": "A system message with data of type #systemMessageDataUnlockConvo", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, "logLockConvoPermanently": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked permanently.", "type": "object", - "required": ["rev", "convoId", "message"], + "required": ["rev", "convoId", "message", "relatedProfiles"], "properties": { "rev": { "type": "string" }, "convoId": { "type": "string" }, @@ -568,6 +623,14 @@ "description": "A system message with data of type #systemMessageDataLockConvoPermanently", "type": "ref", "ref": "#systemMessageView" + }, + "relatedProfiles": { + "description": "Profiles referred in the system message.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, diff --git a/lexicons/chat/bsky/convo/getMessages.json b/lexicons/chat/bsky/convo/getMessages.json index 67be547a82c..dc5d2d78d20 100644 --- a/lexicons/chat/bsky/convo/getMessages.json +++ b/lexicons/chat/bsky/convo/getMessages.json @@ -37,6 +37,14 @@ "chat.bsky.convo.defs#systemMessageView" ] } + }, + "relatedProfiles": { + "description": "Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } } diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 49912fef345..a2dc102bd80 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -9739,6 +9739,7 @@ export const schemaDict = { refs: [ 'lex:chat.bsky.actor.defs#directConvoMember', 'lex:chat.bsky.actor.defs#groupConvoMember', + 'lex:chat.bsky.actor.defs#pastGroupConvoMember', ], }, }, @@ -9751,7 +9752,7 @@ export const schemaDict = { }, groupConvoMember: { description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', + '[NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member.', type: 'object', required: ['role'], properties: { @@ -9769,6 +9770,13 @@ export const schemaDict = { }, }, }, + pastGroupConvoMember: { + description: + '[NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member.', + type: 'object', + required: [], + properties: {}, + }, }, }, ChatBskyActorDeleteAccount: { @@ -10012,6 +10020,16 @@ export const schemaDict = { }, }, }, + systemMessageReferredUser: { + type: 'object', + required: ['did'], + properties: { + did: { + type: 'string', + format: 'did', + }, + }, + }, systemMessageView: { description: '[NOTE: This is under active development and should be considered unstable while this note is here].', @@ -10056,7 +10074,7 @@ export const schemaDict = { member: { description: 'Current view of the member who was added.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, role: { description: @@ -10066,7 +10084,7 @@ export const schemaDict = { }, addedBy: { type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10079,11 +10097,11 @@ export const schemaDict = { member: { description: 'Current view of the member who was removed.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, removedBy: { type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10096,7 +10114,7 @@ export const schemaDict = { member: { description: 'Current view of the member who joined.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, role: { description: @@ -10108,7 +10126,7 @@ export const schemaDict = { description: 'If join link was configured to require approval, this will be set to who approved the request. Undefined if approval was not required.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10121,7 +10139,7 @@ export const schemaDict = { member: { description: 'Current view of the member who left the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10134,7 +10152,7 @@ export const schemaDict = { lockedBy: { description: 'Current view of the member who locked the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10147,7 +10165,7 @@ export const schemaDict = { unlockedBy: { description: 'Current view of the member who unlocked the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10160,7 +10178,7 @@ export const schemaDict = { lockedBy: { description: 'Current view of the member who locked the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10570,7 +10588,7 @@ export const schemaDict = { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was added to a group convo. The member who was added gets a logBeginConvo (to create the convo) but also a logAddMember (to show the system message as the first message the user sees).', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10584,13 +10602,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logRemoveMember: { description: "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was removed from a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logRemoveMember (because they already left, so can't see the system message).", type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10604,13 +10630,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logMemberJoin: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member joined a group convo via join link. The member who was added gets a logBeginConvo (to create the convo) but also a logMemberJoin (to show the system message as the first message the user sees).', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10624,13 +10658,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logMemberLeave: { description: "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member voluntarily left a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logMemberLeave (because they already left, so can't see the system message).", type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10644,13 +10686,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logLockConvo: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked.', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10664,13 +10714,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logUnlockConvo: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was unlocked.', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10684,13 +10742,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logLockConvoPermanently: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked permanently.', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10704,6 +10770,14 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logEditGroup: { @@ -11224,6 +11298,15 @@ export const schemaDict = { ], }, }, + relatedProfiles: { + description: + 'Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, }, diff --git a/packages/api/src/client/types/chat/bsky/actor/defs.ts b/packages/api/src/client/types/chat/bsky/actor/defs.ts index eaeb3c58942..67081735bf8 100644 --- a/packages/api/src/client/types/chat/bsky/actor/defs.ts +++ b/packages/api/src/client/types/chat/bsky/actor/defs.ts @@ -34,6 +34,7 @@ export interface ProfileViewBasic { kind?: | $Typed | $Typed + | $Typed | { $type: string } } @@ -62,7 +63,7 @@ export function validateDirectConvoMember(v: V) { return validate(v, id, hashDirectConvoMember) } -/** [NOTE: This is under active development and should be considered unstable while this note is here]. */ +/** [NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member. */ export interface GroupConvoMember { $type?: 'chat.bsky.actor.defs#groupConvoMember' addedBy?: ProfileViewBasic @@ -78,3 +79,18 @@ export function isGroupConvoMember(v: V) { export function validateGroupConvoMember(v: V) { return validate(v, id, hashGroupConvoMember) } + +/** [NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member. */ +export interface PastGroupConvoMember { + $type?: 'chat.bsky.actor.defs#pastGroupConvoMember' +} + +const hashPastGroupConvoMember = 'pastGroupConvoMember' + +export function isPastGroupConvoMember(v: V) { + return is$typed(v, id, hashPastGroupConvoMember) +} + +export function validatePastGroupConvoMember(v: V) { + return validate(v, id, hashPastGroupConvoMember) +} diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index 2e69c3cbc85..e340fe0c6fb 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -85,6 +85,25 @@ export function validateMessageView(v: V) { return validate(v, id, hashMessageView) } +export interface SystemMessageReferredUser { + $type?: 'chat.bsky.convo.defs#systemMessageReferredUser' + did: string +} + +const hashSystemMessageReferredUser = 'systemMessageReferredUser' + +export function isSystemMessageReferredUser(v: V) { + return is$typed(v, id, hashSystemMessageReferredUser) +} + +export function validateSystemMessageReferredUser(v: V) { + return validate( + v, + id, + hashSystemMessageReferredUser, + ) +} + /** [NOTE: This is under active development and should be considered unstable while this note is here]. */ export interface SystemMessageView { $type?: 'chat.bsky.convo.defs#systemMessageView' @@ -120,9 +139,9 @@ export function validateSystemMessageView(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was added to the group convo. */ export interface SystemMessageDataAddMember { $type?: 'chat.bsky.convo.defs#systemMessageDataAddMember' - member: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser role: ChatBskyActorDefs.MemberRole - addedBy: ChatBskyActorDefs.ProfileViewBasic + addedBy: SystemMessageReferredUser } const hashSystemMessageDataAddMember = 'systemMessageDataAddMember' @@ -142,8 +161,8 @@ export function validateSystemMessageDataAddMember(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was removed from the group convo. */ export interface SystemMessageDataRemoveMember { $type?: 'chat.bsky.convo.defs#systemMessageDataRemoveMember' - member: ChatBskyActorDefs.ProfileViewBasic - removedBy: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser + removedBy: SystemMessageReferredUser } const hashSystemMessageDataRemoveMember = 'systemMessageDataRemoveMember' @@ -163,9 +182,9 @@ export function validateSystemMessageDataRemoveMember(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user joined the group convo via join link. */ export interface SystemMessageDataMemberJoin { $type?: 'chat.bsky.convo.defs#systemMessageDataMemberJoin' - member: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser role: ChatBskyActorDefs.MemberRole - approvedBy?: ChatBskyActorDefs.ProfileViewBasic + approvedBy?: SystemMessageReferredUser } const hashSystemMessageDataMemberJoin = 'systemMessageDataMemberJoin' @@ -185,7 +204,7 @@ export function validateSystemMessageDataMemberJoin(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user voluntarily left the group convo. */ export interface SystemMessageDataMemberLeave { $type?: 'chat.bsky.convo.defs#systemMessageDataMemberLeave' - member: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser } const hashSystemMessageDataMemberLeave = 'systemMessageDataMemberLeave' @@ -205,7 +224,7 @@ export function validateSystemMessageDataMemberLeave(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked. */ export interface SystemMessageDataLockConvo { $type?: 'chat.bsky.convo.defs#systemMessageDataLockConvo' - lockedBy: ChatBskyActorDefs.ProfileViewBasic + lockedBy: SystemMessageReferredUser } const hashSystemMessageDataLockConvo = 'systemMessageDataLockConvo' @@ -225,7 +244,7 @@ export function validateSystemMessageDataLockConvo(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was unlocked. */ export interface SystemMessageDataUnlockConvo { $type?: 'chat.bsky.convo.defs#systemMessageDataUnlockConvo' - unlockedBy: ChatBskyActorDefs.ProfileViewBasic + unlockedBy: SystemMessageReferredUser } const hashSystemMessageDataUnlockConvo = 'systemMessageDataUnlockConvo' @@ -245,7 +264,7 @@ export function validateSystemMessageDataUnlockConvo(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked permanently. */ export interface SystemMessageDataLockConvoPermanently { $type?: 'chat.bsky.convo.defs#systemMessageDataLockConvoPermanently' - lockedBy: ChatBskyActorDefs.ProfileViewBasic + lockedBy: SystemMessageReferredUser } const hashSystemMessageDataLockConvoPermanently = @@ -716,6 +735,8 @@ export interface LogAddMember { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogAddMember = 'logAddMember' @@ -734,6 +755,8 @@ export interface LogRemoveMember { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogRemoveMember = 'logRemoveMember' @@ -752,6 +775,8 @@ export interface LogMemberJoin { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogMemberJoin = 'logMemberJoin' @@ -770,6 +795,8 @@ export interface LogMemberLeave { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogMemberLeave = 'logMemberLeave' @@ -788,6 +815,8 @@ export interface LogLockConvo { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogLockConvo = 'logLockConvo' @@ -806,6 +835,8 @@ export interface LogUnlockConvo { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogUnlockConvo = 'logUnlockConvo' @@ -824,6 +855,8 @@ export interface LogLockConvoPermanently { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogLockConvoPermanently = 'logLockConvoPermanently' diff --git a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts index 47f5021487d..c97e2e0c2d8 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts @@ -11,6 +11,7 @@ import { type OmitKey, } from '../../../../util' import type * as ChatBskyConvoDefs from './defs.js' +import type * as ChatBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, validate = _validate @@ -31,6 +32,8 @@ export interface OutputSchema { | $Typed | { $type: string } )[] + /** Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } export interface CallOptions { diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index ed2949718f3..ffa031a34e3 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -9739,6 +9739,7 @@ export const schemaDict = { refs: [ 'lex:chat.bsky.actor.defs#directConvoMember', 'lex:chat.bsky.actor.defs#groupConvoMember', + 'lex:chat.bsky.actor.defs#pastGroupConvoMember', ], }, }, @@ -9751,7 +9752,7 @@ export const schemaDict = { }, groupConvoMember: { description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', + '[NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member.', type: 'object', required: ['role'], properties: { @@ -9769,6 +9770,13 @@ export const schemaDict = { }, }, }, + pastGroupConvoMember: { + description: + '[NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member.', + type: 'object', + required: [], + properties: {}, + }, }, }, ChatBskyActorDeleteAccount: { @@ -10012,6 +10020,16 @@ export const schemaDict = { }, }, }, + systemMessageReferredUser: { + type: 'object', + required: ['did'], + properties: { + did: { + type: 'string', + format: 'did', + }, + }, + }, systemMessageView: { description: '[NOTE: This is under active development and should be considered unstable while this note is here].', @@ -10056,7 +10074,7 @@ export const schemaDict = { member: { description: 'Current view of the member who was added.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, role: { description: @@ -10066,7 +10084,7 @@ export const schemaDict = { }, addedBy: { type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10079,11 +10097,11 @@ export const schemaDict = { member: { description: 'Current view of the member who was removed.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, removedBy: { type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10096,7 +10114,7 @@ export const schemaDict = { member: { description: 'Current view of the member who joined.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, role: { description: @@ -10108,7 +10126,7 @@ export const schemaDict = { description: 'If join link was configured to require approval, this will be set to who approved the request. Undefined if approval was not required.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10121,7 +10139,7 @@ export const schemaDict = { member: { description: 'Current view of the member who left the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10134,7 +10152,7 @@ export const schemaDict = { lockedBy: { description: 'Current view of the member who locked the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10147,7 +10165,7 @@ export const schemaDict = { unlockedBy: { description: 'Current view of the member who unlocked the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10160,7 +10178,7 @@ export const schemaDict = { lockedBy: { description: 'Current view of the member who locked the group.', type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', }, }, }, @@ -10570,7 +10588,7 @@ export const schemaDict = { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was added to a group convo. The member who was added gets a logBeginConvo (to create the convo) but also a logAddMember (to show the system message as the first message the user sees).', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10584,13 +10602,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logRemoveMember: { description: "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was removed from a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logRemoveMember (because they already left, so can't see the system message).", type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10604,13 +10630,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logMemberJoin: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member joined a group convo via join link. The member who was added gets a logBeginConvo (to create the convo) but also a logMemberJoin (to show the system message as the first message the user sees).', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10624,13 +10658,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logMemberLeave: { description: "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member voluntarily left a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logMemberLeave (because they already left, so can't see the system message).", type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10644,13 +10686,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logLockConvo: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked.', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10664,13 +10714,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logUnlockConvo: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was unlocked.', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10684,13 +10742,21 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logLockConvoPermanently: { description: '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked permanently.', type: 'object', - required: ['rev', 'convoId', 'message'], + required: ['rev', 'convoId', 'message', 'relatedProfiles'], properties: { rev: { type: 'string', @@ -10704,6 +10770,14 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#systemMessageView', }, + relatedProfiles: { + description: 'Profiles referred in the system message.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logEditGroup: { @@ -11224,6 +11298,15 @@ export const schemaDict = { ], }, }, + relatedProfiles: { + description: + 'Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included.', + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, }, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/actor/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/actor/defs.ts index eaeb3c58942..67081735bf8 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/actor/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/actor/defs.ts @@ -34,6 +34,7 @@ export interface ProfileViewBasic { kind?: | $Typed | $Typed + | $Typed | { $type: string } } @@ -62,7 +63,7 @@ export function validateDirectConvoMember(v: V) { return validate(v, id, hashDirectConvoMember) } -/** [NOTE: This is under active development and should be considered unstable while this note is here]. */ +/** [NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member. */ export interface GroupConvoMember { $type?: 'chat.bsky.actor.defs#groupConvoMember' addedBy?: ProfileViewBasic @@ -78,3 +79,18 @@ export function isGroupConvoMember(v: V) { export function validateGroupConvoMember(v: V) { return validate(v, id, hashGroupConvoMember) } + +/** [NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member. */ +export interface PastGroupConvoMember { + $type?: 'chat.bsky.actor.defs#pastGroupConvoMember' +} + +const hashPastGroupConvoMember = 'pastGroupConvoMember' + +export function isPastGroupConvoMember(v: V) { + return is$typed(v, id, hashPastGroupConvoMember) +} + +export function validatePastGroupConvoMember(v: V) { + return validate(v, id, hashPastGroupConvoMember) +} diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts index 2e69c3cbc85..e340fe0c6fb 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts @@ -85,6 +85,25 @@ export function validateMessageView(v: V) { return validate(v, id, hashMessageView) } +export interface SystemMessageReferredUser { + $type?: 'chat.bsky.convo.defs#systemMessageReferredUser' + did: string +} + +const hashSystemMessageReferredUser = 'systemMessageReferredUser' + +export function isSystemMessageReferredUser(v: V) { + return is$typed(v, id, hashSystemMessageReferredUser) +} + +export function validateSystemMessageReferredUser(v: V) { + return validate( + v, + id, + hashSystemMessageReferredUser, + ) +} + /** [NOTE: This is under active development and should be considered unstable while this note is here]. */ export interface SystemMessageView { $type?: 'chat.bsky.convo.defs#systemMessageView' @@ -120,9 +139,9 @@ export function validateSystemMessageView(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was added to the group convo. */ export interface SystemMessageDataAddMember { $type?: 'chat.bsky.convo.defs#systemMessageDataAddMember' - member: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser role: ChatBskyActorDefs.MemberRole - addedBy: ChatBskyActorDefs.ProfileViewBasic + addedBy: SystemMessageReferredUser } const hashSystemMessageDataAddMember = 'systemMessageDataAddMember' @@ -142,8 +161,8 @@ export function validateSystemMessageDataAddMember(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was removed from the group convo. */ export interface SystemMessageDataRemoveMember { $type?: 'chat.bsky.convo.defs#systemMessageDataRemoveMember' - member: ChatBskyActorDefs.ProfileViewBasic - removedBy: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser + removedBy: SystemMessageReferredUser } const hashSystemMessageDataRemoveMember = 'systemMessageDataRemoveMember' @@ -163,9 +182,9 @@ export function validateSystemMessageDataRemoveMember(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user joined the group convo via join link. */ export interface SystemMessageDataMemberJoin { $type?: 'chat.bsky.convo.defs#systemMessageDataMemberJoin' - member: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser role: ChatBskyActorDefs.MemberRole - approvedBy?: ChatBskyActorDefs.ProfileViewBasic + approvedBy?: SystemMessageReferredUser } const hashSystemMessageDataMemberJoin = 'systemMessageDataMemberJoin' @@ -185,7 +204,7 @@ export function validateSystemMessageDataMemberJoin(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user voluntarily left the group convo. */ export interface SystemMessageDataMemberLeave { $type?: 'chat.bsky.convo.defs#systemMessageDataMemberLeave' - member: ChatBskyActorDefs.ProfileViewBasic + member: SystemMessageReferredUser } const hashSystemMessageDataMemberLeave = 'systemMessageDataMemberLeave' @@ -205,7 +224,7 @@ export function validateSystemMessageDataMemberLeave(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked. */ export interface SystemMessageDataLockConvo { $type?: 'chat.bsky.convo.defs#systemMessageDataLockConvo' - lockedBy: ChatBskyActorDefs.ProfileViewBasic + lockedBy: SystemMessageReferredUser } const hashSystemMessageDataLockConvo = 'systemMessageDataLockConvo' @@ -225,7 +244,7 @@ export function validateSystemMessageDataLockConvo(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was unlocked. */ export interface SystemMessageDataUnlockConvo { $type?: 'chat.bsky.convo.defs#systemMessageDataUnlockConvo' - unlockedBy: ChatBskyActorDefs.ProfileViewBasic + unlockedBy: SystemMessageReferredUser } const hashSystemMessageDataUnlockConvo = 'systemMessageDataUnlockConvo' @@ -245,7 +264,7 @@ export function validateSystemMessageDataUnlockConvo(v: V) { /** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked permanently. */ export interface SystemMessageDataLockConvoPermanently { $type?: 'chat.bsky.convo.defs#systemMessageDataLockConvoPermanently' - lockedBy: ChatBskyActorDefs.ProfileViewBasic + lockedBy: SystemMessageReferredUser } const hashSystemMessageDataLockConvoPermanently = @@ -716,6 +735,8 @@ export interface LogAddMember { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogAddMember = 'logAddMember' @@ -734,6 +755,8 @@ export interface LogRemoveMember { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogRemoveMember = 'logRemoveMember' @@ -752,6 +775,8 @@ export interface LogMemberJoin { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogMemberJoin = 'logMemberJoin' @@ -770,6 +795,8 @@ export interface LogMemberLeave { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogMemberLeave = 'logMemberLeave' @@ -788,6 +815,8 @@ export interface LogLockConvo { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogLockConvo = 'logLockConvo' @@ -806,6 +835,8 @@ export interface LogUnlockConvo { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogUnlockConvo = 'logUnlockConvo' @@ -824,6 +855,8 @@ export interface LogLockConvoPermanently { rev: string convoId: string message: SystemMessageView + /** Profiles referred in the system message. */ + relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogLockConvoPermanently = 'logLockConvoPermanently' diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts index 1b356bca746..6d480208aa5 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts @@ -10,6 +10,7 @@ import { type OmitKey, } from '../../../../util' import type * as ChatBskyConvoDefs from './defs.js' +import type * as ChatBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, validate = _validate @@ -30,6 +31,8 @@ export interface OutputSchema { | $Typed | { $type: string } )[] + /** Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } export type HandlerInput = void From 17c394d9b1d13eb070ff2da375f13489973fa5a2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 10:19:29 -0300 Subject: [PATCH 02/87] Version packages (#4878) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/tall-suits-yell.md | 5 ----- packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/tall-suits-yell.md diff --git a/.changeset/tall-suits-yell.md b/.changeset/tall-suits-yell.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/tall-suits-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 39a25cc3467..e6dc7a6b5c2 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.19.11 + +### Patch Changes + +- [#4876](https://github.com/bluesky-social/atproto/pull/4876) [`03445ee`](https://github.com/bluesky-social/atproto/commit/03445eef45d9fba66d48ea5ca86742685d91faa5) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + ## 0.19.10 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index d917de07b1e..1ab6fb26599 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.10", + "version": "0.19.11", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ From 6467208918b0588802ad1b0d8356cae1a61c1795 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Wed, 22 Apr 2026 17:55:30 +0200 Subject: [PATCH 03/87] Add documentation for requestLock throwing errors (#4879) --- packages/oauth/oauth-client-node/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/oauth/oauth-client-node/README.md b/packages/oauth/oauth-client-node/README.md index 572da02f75f..ddeedd359d2 100644 --- a/packages/oauth/oauth-client-node/README.md +++ b/packages/oauth/oauth-client-node/README.md @@ -263,7 +263,8 @@ after a short period of time (one hour should be more than enough). #### `requestLock` When multiple instances of the client are running, this lock will prevent -concurrent refreshes of the same session. +concurrent refreshes of the same session. If the lock fails to be acquired an +error should be thrown. Here is an example implementation based on [`redlock`](https://www.npmjs.com/package/redlock): From 5d3e248c262f45e3ca471d8d2381830a4cd896ae Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Thu, 23 Apr 2026 17:58:22 +0200 Subject: [PATCH 04/87] Fix `/.well-known/change-password` page (#4880) * Fix /account/reset-password route * changeset * tidy * improve error reporting * messages * name all providers --- .changeset/breezy-dolls-throw.md | 6 + .../oauth-provider-ui/src/account-page.tsx | 158 +------------ .../src/components/error-view.tsx | 11 +- .../src/components/forms/button-cooldown.tsx | 14 +- .../src/components/forms/button.tsx | 17 +- .../src/components/forms/form-card-async.tsx | 8 +- .../src/components/forms/form-card.tsx | 63 +++-- .../src/components/forms/form-field.tsx | 10 +- .../src/components/forms/input-checkbox.tsx | 6 +- .../src/components/forms/input-container.tsx | 2 +- .../src/components/forms/input-text.tsx | 9 +- .../src/components/layouts/layout-app.tsx | 5 +- .../src/components/layouts/layout-page.tsx | 132 +++++++++++ .../src/components/reset-password-view.tsx | 16 +- .../src/components/sign-in-form.tsx | 2 +- .../src/components/utils/admonition.tsx | 147 ++++++++---- .../src/components/utils/error-card.tsx | 82 +++---- .../src/components/utils/error-details.tsx | 115 +++++++++ .../src/contexts/authentication.tsx | 1 + .../src/contexts/customization.tsx | 1 + .../src/contexts/notifications.tsx | 15 +- .../src/contexts/session.tsx | 1 + .../src/cookie-error-page.tsx | 6 +- .../oauth-provider-ui/src/lib/json-client.ts | 2 + .../oauth/oauth-provider-ui/src/lib/util.ts | 1 + .../src/locales/an/messages.po | 127 +++++----- .../src/locales/ast/messages.po | 127 +++++----- .../src/locales/ca/messages.po | 127 +++++----- .../src/locales/da/messages.po | 127 +++++----- .../src/locales/de/messages.po | 127 +++++----- .../src/locales/el/messages.po | 127 +++++----- .../src/locales/en-GB/messages.po | 127 +++++----- .../src/locales/en/messages.po | 129 +++++----- .../src/locales/es/messages.po | 127 +++++----- .../src/locales/eu/messages.po | 127 +++++----- .../src/locales/fi/messages.po | 127 +++++----- .../src/locales/fr/messages.po | 127 +++++----- .../src/locales/ga/messages.po | 127 +++++----- .../src/locales/gl/messages.po | 127 +++++----- .../src/locales/hi/messages.po | 127 +++++----- .../src/locales/hu/messages.po | 127 +++++----- .../src/locales/ia/messages.po | 127 +++++----- .../src/locales/id/messages.po | 127 +++++----- .../src/locales/it/messages.po | 127 +++++----- .../src/locales/ja/messages.po | 127 +++++----- .../src/locales/km/messages.po | 127 +++++----- .../src/locales/ko/messages.po | 127 +++++----- .../src/locales/locale-provider.tsx | 5 +- .../src/locales/ne/messages.po | 127 +++++----- .../src/locales/nl/messages.po | 127 +++++----- .../src/locales/pl/messages.po | 127 +++++----- .../src/locales/pt-BR/messages.po | 127 +++++----- .../src/locales/ro/messages.po | 127 +++++----- .../src/locales/ru/messages.po | 127 +++++----- .../src/locales/sv/messages.po | 127 +++++----- .../src/locales/th/messages.po | 127 +++++----- .../src/locales/tr/messages.po | 127 +++++----- .../src/locales/uk/messages.po | 127 +++++----- .../src/locales/vi/messages.po | 127 +++++----- .../src/locales/zh-CN/messages.po | 127 +++++----- .../src/locales/zh-HK/messages.po | 127 +++++----- .../src/locales/zh-TW/messages.po | 127 +++++----- .../(authenticated)}/about/page.fr.tsx | 0 .../account/(authenticated)}/about/page.tsx | 0 .../account/(authenticated)}/apps/page.tsx | 9 +- .../account/(authenticated)}/devices/page.tsx | 9 +- .../account/(authenticated)}/page.tsx | 0 .../(authenticated)}/password/page.tsx | 6 +- .../pages/account/(authenticated)/route.tsx | 222 ++++++++++++++++++ .../reset-password/route.tsx | 37 +++ .../account/(unauthenticated)/routes.tsx | 13 + .../{routes/account.tsx => pages/route.tsx} | 2 +- .../oauth-provider-ui/src/pages/router.tsx | 37 +++ .../src/routes/account/layout.tsx | 193 --------------- .../router/create-account-page-middleware.ts | 2 +- 75 files changed, 3295 insertions(+), 2644 deletions(-) create mode 100644 .changeset/breezy-dolls-throw.md create mode 100644 packages/oauth/oauth-provider-ui/src/components/layouts/layout-page.tsx create mode 100644 packages/oauth/oauth-provider-ui/src/components/utils/error-details.tsx rename packages/oauth/oauth-provider-ui/src/{routes/account => pages/account/(authenticated)}/about/page.fr.tsx (100%) rename packages/oauth/oauth-provider-ui/src/{routes/account => pages/account/(authenticated)}/about/page.tsx (100%) rename packages/oauth/oauth-provider-ui/src/{routes/account => pages/account/(authenticated)}/apps/page.tsx (95%) rename packages/oauth/oauth-provider-ui/src/{routes/account => pages/account/(authenticated)}/devices/page.tsx (94%) rename packages/oauth/oauth-provider-ui/src/{routes/account => pages/account/(authenticated)}/page.tsx (100%) rename packages/oauth/oauth-provider-ui/src/{routes/account => pages/account/(authenticated)}/password/page.tsx (90%) create mode 100644 packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/route.tsx create mode 100644 packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/reset-password/route.tsx create mode 100644 packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/routes.tsx rename packages/oauth/oauth-provider-ui/src/{routes/account.tsx => pages/route.tsx} (86%) create mode 100644 packages/oauth/oauth-provider-ui/src/pages/router.tsx delete mode 100644 packages/oauth/oauth-provider-ui/src/routes/account/layout.tsx diff --git a/.changeset/breezy-dolls-throw.md b/.changeset/breezy-dolls-throw.md new file mode 100644 index 00000000000..e4fd6f98e76 --- /dev/null +++ b/.changeset/breezy-dolls-throw.md @@ -0,0 +1,6 @@ +--- +'@atproto/oauth-provider-ui': patch +'@atproto/oauth-provider': patch +--- + +Fix `/.well-known/change-password` page diff --git a/packages/oauth/oauth-provider-ui/src/account-page.tsx b/packages/oauth/oauth-provider-ui/src/account-page.tsx index a36200be2bb..d09a1c72783 100644 --- a/packages/oauth/oauth-provider-ui/src/account-page.tsx +++ b/packages/oauth/oauth-provider-ui/src/account-page.tsx @@ -1,109 +1,25 @@ import './style.css' -import { msg } from '@lingui/core/macro' -import { - DevicesIcon, - GlobeIcon, - HouseSimpleIcon, - KeyIcon, - PaintBucketIcon, - QuestionIcon, -} from '@phosphor-icons/react' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' -import { RouterProvider, createRouter } from '@tanstack/react-router' -import { StrictMode, useEffect, useMemo, useRef } from 'react' +import { RouterProvider } from '@tanstack/react-router' +import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import { ErrorBoundary } from 'react-error-boundary' import { errorViewRender } from '#/components/error-view.tsx' -import { Palette } from '#/components/utils/palette.tsx' -import { AuthenticationProvider } from '#/contexts/authentication.tsx' import { CustomizationProvider } from '#/contexts/customization.tsx' import { NotificationsProvider } from '#/contexts/notifications.tsx' -import { - InitialSelectedSession, - SessionProvider, - useSessionContext, -} from '#/contexts/session.tsx' +import { InitialSelectedSession, SessionProvider } from '#/contexts/session.tsx' import type { HydrationData } from '#/hydration-data.d.ts' import { LocaleProvider } from '#/locales/locale-provider.tsx' -import { Page as AccountAboutPage } from '#/routes/account/about/page.tsx' -import { Page as AccountOAuthPage } from '#/routes/account/apps/page' -import { Page as AccountDevicesPage } from '#/routes/account/devices/page.tsx' -import { createLayoutRoute } from '#/routes/account/layout.tsx' -import { Page as AccountIndexPage } from '#/routes/account/page.tsx' -import { Page as AccountPasswordPage } from '#/routes/account/password/page.tsx' -import { RootRoute } from '#/routes/account.tsx' +import { router } from '#/pages/router' const { __customizationData: customizationData, __deviceSessions: deviceSessions, } = window as typeof window & HydrationData['account-page'] -const initialUrl = new URL(window.location.href) - const qc = new QueryClient() -const childRoutes = createLayoutRoute({ - getParentRoute: () => RootRoute, - - path: '/account', - title: msg`My Atmosphere account`, - pages: { - '/': { - icon: HouseSimpleIcon, - position: 0, - title: msg`Account`, - component: AccountIndexPage, - }, - '/devices': { - icon: DevicesIcon, - position: 10, - title: msg`Devices`, - description: msg`Manage your active sessions`, - component: AccountDevicesPage, - }, - '/apps': { - icon: GlobeIcon, - position: 20, - title: msg`Apps`, - description: msg`Manage applications that have access to your account`, - component: AccountOAuthPage, - }, - '/password': { - icon: KeyIcon, - position: 30, - title: msg`Password`, - description: msg`Change your account password`, - component: AccountPasswordPage, - }, - '/branding': { - icon: PaintBucketIcon, - hidden: true, - position: 40, - title: msg`Branding`, - component: Palette, - }, - '/about': { - icon: QuestionIcon, - position: 50, - title: msg`About`, - component: AccountAboutPage, - description: msg`What is an Atmosphere Account?`, - }, - }, -}) - -const router = createRouter({ - routeTree: RootRoute.addChildren(childRoutes), -}) - -// Register the router instance for type safety -declare module '@tanstack/react-router' { - interface Register { - router: typeof router - } -} - const container = document.getElementById('root')! createRoot(container).render( @@ -117,7 +33,7 @@ createRoot(container).render( initialSelected={InitialSelectedSession.Only} > - + @@ -126,67 +42,3 @@ createRoot(container).render( , ) - -function App() { - // This page supports a mode where it is loaded, by an app, in a webview or - // popup, to let the user manage their atmosphere account without leaving the - // app. In that case, we constrain the user to only use the account for which - // they opened the page, and we send a signal to the opener when they perform - // actions that signal the user is done with the page (like logging out, or - // explicitly "canceling" the sign-in). - - // @NOTE The VERY EXPERIMENTAL API used here **WILL** change in the future as - // it gets specified (or not) in the AT Protocol specification. It MUST NOT be - // used in places where security is a concern and is ONLY there for testing - // and experimentation purposes. DO NOT USE. - - const { session } = useSessionContext() - const hasSession = useRef(session != null) - - const isPopup = initialUrl.searchParams.get('display') === 'popup' - const identifier = initialUrl.searchParams.get('login_hint') || undefined - const nonce = initialUrl.searchParams.get('nonce') || undefined - const callbackUrl = initialUrl.searchParams.get('redirect_uri') || undefined - - const done = useMemo void)>(() => { - if (callbackUrl && nonce) { - return () => { - const url = new URL(callbackUrl) - window.location.href = url.toString() - } - } else if (isPopup) { - return () => { - // Due to the various ways this page can be embedded (e.g. webview in a - // mobile app, a popup in a browser), and the fact that the opener might - // be on a different origin, we post the message on various targets to - // ensure it is received. We might want to configure this based on - // query params. - - // @NOTE We might want to restrict the targetOrigin based on the client - // metadata. - window.opener?.postMessage({ nonce, event: 'done' }, '*') - window.postMessage({ nonce, event: 'done' }, '*') - window.close() - } - } - }, [isPopup, callbackUrl, nonce]) - - useEffect(() => { - if (session && !hasSession.current) { - hasSession.current = true - } else if (!session && hasSession.current) { - hasSession.current = false - done?.() - } - }, [session, done]) - - return ( - - - - ) -} diff --git a/packages/oauth/oauth-provider-ui/src/components/error-view.tsx b/packages/oauth/oauth-provider-ui/src/components/error-view.tsx index 9ac32a44afd..fc445f7bbcf 100644 --- a/packages/oauth/oauth-provider-ui/src/components/error-view.tsx +++ b/packages/oauth/oauth-provider-ui/src/components/error-view.tsx @@ -20,13 +20,16 @@ export function ErrorView({ title = msg`An error occurred`, ...props }: ErrorViewProps) { + // @TODO improve error page return ( - +
+ +
) } -export function errorViewRender(props: ErrorViewProps) { - return -} +export const errorViewRender = (props: ErrorViewProps) => ( + +) diff --git a/packages/oauth/oauth-provider-ui/src/components/forms/button-cooldown.tsx b/packages/oauth/oauth-provider-ui/src/components/forms/button-cooldown.tsx index 7474b6e0aab..78d769e0916 100644 --- a/packages/oauth/oauth-provider-ui/src/components/forms/button-cooldown.tsx +++ b/packages/oauth/oauth-provider-ui/src/components/forms/button-cooldown.tsx @@ -18,7 +18,7 @@ export function ButtonCooldown({ // button children, onClick, - disabled, + disabled = false, className, ...props }: ButtonCooldownProps) { @@ -29,7 +29,7 @@ export function ButtonCooldown({ }) const [isHovered, setIsHovered] = useState(false) const remainingSeconds = Math.ceil(action.remaining) - const isDisabledByCooldown = action.disabled + const isCoolingDown = !disabled && action.disabled return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > - + + {onBack && ( + + )} ) diff --git a/packages/oauth/oauth-provider-ui/src/components/sign-in-form.tsx b/packages/oauth/oauth-provider-ui/src/components/sign-in-form.tsx index 1dd6ea614bd..c7205189442 100644 --- a/packages/oauth/oauth-provider-ui/src/components/sign-in-form.tsx +++ b/packages/oauth/oauth-provider-ui/src/components/sign-in-form.tsx @@ -222,7 +222,7 @@ export function SignInForm({ /> - Warning}> + Warning}> Verify the website address before entering your password. Only sign in on sites you recognize and trust. diff --git a/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx b/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx index 3fa08079595..290c3e7ec5a 100644 --- a/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx +++ b/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx @@ -1,83 +1,138 @@ import { + CheckCircleIcon, type Icon, InfoIcon, ProhibitIcon, WarningIcon, } from '@phosphor-icons/react' import { clsx } from 'clsx' -import { AriaRole, JSX, ReactNode } from 'react' +import { + AriaRole, + JSX, + ReactNode, + createContext, + useContext, + useMemo, +} from 'react' import { Override } from '#/lib/util.ts' import { Button, ButtonProps } from '../forms/button.tsx' -type Role = AriaRole & ('note' | 'status' | 'alert') +const VARIANTS = ['info', 'warning', 'error', 'success'] as const +type Variant = (typeof VARIANTS)[number] + +const ROLE_VARIANT_MAP: ReadonlyMap = new Map([ + ['note', 'info'], + ['status', 'warning'], + ['alert', 'error'], +]) + +const roleToVariant = (role?: AriaRole): Variant => { + return (ROLE_VARIANT_MAP as ReadonlyMap).get(role) ?? 'info' +} -const icons: Record = { +const icons: Record = { // @ts-expect-error __proto__: null, - note: InfoIcon, - status: WarningIcon, - alert: ProhibitIcon, + info: InfoIcon, + success: CheckCircleIcon, + warning: WarningIcon, + error: ProhibitIcon, } -const cardColors: Record = { +const cardColors: Record = { // @ts-expect-error __proto__: null, - note: 'bg-info-100 dark:bg-info-800 border-info-500 dark:border-info-700', - status: + info: 'bg-info-100 dark:bg-info-800 border-info-500 dark:border-info-700', + warning: 'bg-warning-100 dark:bg-warning-800 border-warning-500 dark:border-warning-700', - alert: + error: 'bg-error-100 dark:bg-error-800 border-error-500 dark:border-error-400', + success: + 'bg-success-100 dark:bg-success-800 border-success-500 dark:border-success-700', } -const iconColors: Record = { + +const iconColors: Record = { // @ts-expect-error __proto__: null, - note: 'text-info-500', - status: 'text-warning-600 dark:text-warning-500', - alert: 'text-error-500 dark:text-error-400', + info: 'text-info-500', + warning: 'text-warning-600 dark:text-warning-500', + error: 'text-error-500 dark:text-error-400', + success: 'text-success-500 dark:text-success-400', } -const buttonColors: Record = { +const buttonColors: Record = { // @ts-expect-error __proto__: null, - note: 'info', - status: 'warning', - alert: 'error', + info: 'info', + warning: 'warning', + error: 'error', + success: 'success', } -export type CardProps = JSX.IntrinsicElements['div'] & { - role: Role -} +export type CardProps = Override< + JSX.IntrinsicElements['div'], + { + role: AriaRole + variant?: Variant + } +> -export function Card({ children, role, className, ...props }: CardProps) { +export type AdmonitionContextValue = { + variant: Variant +} +export const AdmonitionContext = createContext({ + variant: 'info', +}) +AdmonitionContext.displayName = 'AdmonitionContext' + +export function Card({ + role, + className, + variant = roleToVariant(role), + children, + ...props +}: CardProps) { + const value = useMemo(() => ({ variant }), [variant]) return (
- {children} + + {children} +
) } -export function Icon({ role }: { role: Role }) { - const Icon = icons[role] - if (!Icon) return null // Fool proof +export function Icon({ + variant: variantProp, + children, +}: { + variant?: Variant + children?: ReactNode +}) { + const ctx = useContext(AdmonitionContext) + const variant: Variant = variantProp ?? ctx.variant + + const Icon = icons[variant] - const color = iconColors[role] return ( -
- +
+ {children || }
) } @@ -94,13 +149,22 @@ export function Text({ children }: { children: ReactNode }) { return

{children}

} -export function Action({ children, ...props }: ButtonProps) { +export function Actions({ children }: { children: ReactNode }) { + return
{children}
+} + +export function Action({ + children, + size = 'sm', + color, + ...props +}: ButtonProps) { + const { variant } = useContext(AdmonitionContext) + return ( -
- -
+ ) } @@ -108,13 +172,12 @@ export type AdmonitionProps = Override< CardProps, { title?: ReactNode - action?: ButtonProps + action?: ReactNode append?: ReactNode } > export function Admonition({ - role = 'note', title, action, append, @@ -122,14 +185,14 @@ export function Admonition({ ...props }: AdmonitionProps) { return ( - - + + {title && {title}} {children && {children}} {append} - {action && } + {action && {action}} ) } diff --git a/packages/oauth/oauth-provider-ui/src/components/utils/error-card.tsx b/packages/oauth/oauth-provider-ui/src/components/utils/error-card.tsx index 212607173d1..158fcb9c2fb 100644 --- a/packages/oauth/oauth-provider-ui/src/components/utils/error-card.tsx +++ b/packages/oauth/oauth-provider-ui/src/components/utils/error-card.tsx @@ -1,82 +1,56 @@ import { Trans } from '@lingui/react/macro' -import { useEffect, useMemo, useState } from 'react' +import { ReactNode, useEffect, useState } from 'react' import { useErrorMessage } from '#/hooks/use-error-message.ts' -import { Api } from '#/lib/api.ts' -import { JsonErrorResponse } from '#/lib/json-client.ts' -import { Admonition } from './admonition.tsx' +import { Action, Admonition } from './admonition.tsx' +import { ErrorDetails } from './error-details.tsx' export type ErrorCardProps = { + className?: string + children?: ReactNode error: unknown reset?: () => void } -export function ErrorCard({ error, reset }: ErrorCardProps) { +export function ErrorCard({ + error, + reset, + className, + children, +}: ErrorCardProps) { const [inputCount, setInputCount] = useState(0) // Every 5th input will toggle showing the details const showDetails = ((inputCount / 5) | 0) % 2 === 1 const errorMessage = useErrorMessage(error) - const parsedError = useMemo( - () => - error instanceof JsonErrorResponse - ? // Already parsed: - error - : // If "error" is a json object, try parsing it as a JsonErrorResponse: - Api.parseError(error) ?? error, - [error], - ) - useEffect(() => { // For debugging purposes - console.warn('Displayed error details:', parsedError) + console.warn('Displayed error details:', error) // Reset the input count when the error changes setInputCount(0) - }, [parsedError]) + }, [error]) return ( { - if (!event.defaultPrevented) { - setInputCount((c) => c + 1) - } - }} role="alert" + className={className} + onClick={() => setInputCount((c) => c + 1)} title={errorMessage} + append={showDetails && } action={ - reset != null - ? { - children: Retry, - onClick: (event) => { - if (!event.defaultPrevented) { - event.preventDefault() - reset() - } - }, - } - : undefined + reset != null && ( + reset()}> + Retry + + ) } - append={ - showDetails && - (parsedError instanceof JsonErrorResponse ? ( -
-
- Code -
-
- {parsedError.error} -
- -
- Description -
-
{parsedError.description}
-
- ) : ( -
{JSON.stringify(parsedError, null, 2)}
- )) - } - /> + > + {children} +
) } + +export const errorCardRender = (props: ErrorCardProps) => ( + +) diff --git a/packages/oauth/oauth-provider-ui/src/components/utils/error-details.tsx b/packages/oauth/oauth-provider-ui/src/components/utils/error-details.tsx new file mode 100644 index 00000000000..89b7722475b --- /dev/null +++ b/packages/oauth/oauth-provider-ui/src/components/utils/error-details.tsx @@ -0,0 +1,115 @@ +import { Trans } from '@lingui/react/macro' +import { clsx } from 'clsx' +import { JSX, useMemo } from 'react' +import { JsonErrorResponse } from '#/lib/json-client.ts' +import { Override } from '#/lib/util.ts' + +export type ParsedError = { + name: string + code?: string + message?: string + details?: string +} + +// @TODO this should me moved out of utils and be more specific to API errors +export function apiErrorParser(error: unknown): ParsedError | void { + if (error instanceof JsonErrorResponse) { + return { + name: error.name, + code: error.error, + message: error.description, + details: toJsonSafe(error.payload), + } + } +} + +export type ErrorDetailsProps = Override< + JSX.IntrinsicElements['dl'], + { + error: unknown + parser?: (error: unknown) => ParsedError | void + } +> + +export function ErrorDetails({ + error, + parser = apiErrorParser, + className, + ...props +}: ErrorDetailsProps) { + const parsed = useMemo(() => { + const parsed = parser?.(error) + if (parsed) return parsed + + if (error instanceof Error) { + return { + name: error.name, + message: error.message, + details: error.stack, + } + } + + return { + name: 'UnknownError', + details: toJsonSafe(error), + } + }, [error, parser]) + + return ( +
+
+ Name +
+
+ {parsed.name} +
+ + {parsed.code && ( + <> +
+ Code +
+
+ {parsed.code} +
+ + )} + + {parsed.message && ( + <> +
+ Message +
+
{parsed.message}
+ + )} + + {parsed.details && ( + <> +
+ Stack +
+
+ +
{parsed.details}
+
+
+ + )} +
+ ) +} + +function toJsonSafe(value: unknown): string | undefined { + try { + return JSON.stringify(value, null, 2) + } catch { + return undefined + } +} diff --git a/packages/oauth/oauth-provider-ui/src/contexts/authentication.tsx b/packages/oauth/oauth-provider-ui/src/contexts/authentication.tsx index f34cde85c80..bcf7440be09 100644 --- a/packages/oauth/oauth-provider-ui/src/contexts/authentication.tsx +++ b/packages/oauth/oauth-provider-ui/src/contexts/authentication.tsx @@ -32,6 +32,7 @@ export type AuthenticationContextType = { const AuthenticationContext = createContext( null, ) +AuthenticationContext.displayName = 'AuthenticationContext' export type AuthenticationProviderProps = { disableRemember?: boolean diff --git a/packages/oauth/oauth-provider-ui/src/contexts/customization.tsx b/packages/oauth/oauth-provider-ui/src/contexts/customization.tsx index cef3568d905..cfa1a42e935 100644 --- a/packages/oauth/oauth-provider-ui/src/contexts/customization.tsx +++ b/packages/oauth/oauth-provider-ui/src/contexts/customization.tsx @@ -2,6 +2,7 @@ import { ReactNode, createContext, useContext } from 'react' import type { CustomizationData } from '@atproto/oauth-provider-api' const CustomizationContext = createContext({}) +CustomizationContext.displayName = 'CustomizationContext' export function CustomizationProvider({ children, diff --git a/packages/oauth/oauth-provider-ui/src/contexts/notifications.tsx b/packages/oauth/oauth-provider-ui/src/contexts/notifications.tsx index a15c9105d62..e6fa1c15d06 100644 --- a/packages/oauth/oauth-provider-ui/src/contexts/notifications.tsx +++ b/packages/oauth/oauth-provider-ui/src/contexts/notifications.tsx @@ -17,18 +17,17 @@ export interface NotificationHandler { close(): void } -const dummyHandler: NotificationHandler = Object.freeze({ - update() {}, - close() {}, -}) - export type NotificationsValue = { notify(options: NotificationOptions): NotificationHandler } const NotificationsContext = createContext({ - notify: () => dummyHandler, + notify: (options) => { + console.warn('Notification triggered without a provider:', options) + return { update() {}, close() {} } + }, }) +NotificationsContext.displayName = 'NotificationsContext' const borderColors: Record = { success: 'border-success-200 dark:border-success-900', @@ -102,9 +101,7 @@ export function NotificationsProvider({ return ( - - {children} - + {children} {notifications.map( ({ id, handler, options: { description, title, variant } }) => ( diff --git a/packages/oauth/oauth-provider-ui/src/contexts/session.tsx b/packages/oauth/oauth-provider-ui/src/contexts/session.tsx index c4979f6aabf..a77f025e943 100644 --- a/packages/oauth/oauth-provider-ui/src/contexts/session.tsx +++ b/packages/oauth/oauth-provider-ui/src/contexts/session.tsx @@ -52,6 +52,7 @@ export type SessionContextType = { } const SessionContext = createContext(null) +SessionContext.displayName = 'SessionContext' export enum InitialSelectedSession { First, diff --git a/packages/oauth/oauth-provider-ui/src/cookie-error-page.tsx b/packages/oauth/oauth-provider-ui/src/cookie-error-page.tsx index 0a70b6889f1..d2efb6db97e 100644 --- a/packages/oauth/oauth-provider-ui/src/cookie-error-page.tsx +++ b/packages/oauth/oauth-provider-ui/src/cookie-error-page.tsx @@ -48,7 +48,11 @@ function CookieErrorView() { {Array.from(new Map(url.searchParams)).map(([key, value]) => ( ))} - + Cookie Error} + > It seems that your browser is not accepting cookies. Press "Continue" to try again. If the error persists, please ensure that diff --git a/packages/oauth/oauth-provider-ui/src/lib/json-client.ts b/packages/oauth/oauth-provider-ui/src/lib/json-client.ts index 4e2360a8fc3..251a8e96371 100644 --- a/packages/oauth/oauth-provider-ui/src/lib/json-client.ts +++ b/packages/oauth/oauth-provider-ui/src/lib/json-client.ts @@ -130,6 +130,8 @@ export type JsonErrorPayload = { export class JsonErrorResponse< P extends JsonErrorPayload = JsonErrorPayload, > extends Error { + name = 'JsonErrorResponse' + constructor( public readonly payload: P, message = payload.error_description, diff --git a/packages/oauth/oauth-provider-ui/src/lib/util.ts b/packages/oauth/oauth-provider-ui/src/lib/util.ts index 9904a42e674..489f0f7da65 100644 --- a/packages/oauth/oauth-provider-ui/src/lib/util.ts +++ b/packages/oauth/oauth-provider-ui/src/lib/util.ts @@ -10,5 +10,6 @@ export function upsert( : [...arr.slice(0, idx), item, ...arr.slice(idx + 1)] } +export type Explicit = { [K in keyof T & string]: T[K] } export type Simplify = { [K in keyof T]: T[K] } & NonNullable export type Override = Simplify & U> diff --git a/packages/oauth/oauth-provider-ui/src/locales/an/messages.po b/packages/oauth/oauth-provider-ui/src/locales/an/messages.po index cd9b33867ea..2445a5a36f1 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/an/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/an/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ast/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ast/messages.po index 8924871cc05..dd4258b2d5b 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ast/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ast/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ca/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ca/messages.po index 3f142717b4d..f34fa969eaf 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ca/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ca/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/da/messages.po b/packages/oauth/oauth-provider-ui/src/locales/da/messages.po index a9e02596df9..d2c08ef130e 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/da/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/da/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/de/messages.po b/packages/oauth/oauth-provider-ui/src/locales/de/messages.po index 80b9f8a377f..d63f1a2ee13 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/de/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/de/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/el/messages.po b/packages/oauth/oauth-provider-ui/src/locales/el/messages.po index 0dd27251066..b7c6efcf09a 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/el/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/el/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/en-GB/messages.po b/packages/oauth/oauth-provider-ui/src/locales/en-GB/messages.po index 88912d185d7..0dc34b88abf 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/en-GB/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/en-GB/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/en/messages.po b/packages/oauth/oauth-provider-ui/src/locales/en/messages.po index cb8aa70b571..0532a716e58 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/en/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/en/messages.po @@ -25,31 +25,31 @@ msgstr "{deltaHours} hours ago" msgid "{deltaMinutes} minutes ago" msgstr "{deltaMinutes} minutes ago" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "<0>AT Protocol — Technical documentation for developers" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "<0>Bluesky Social — General information about the network" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" @@ -77,11 +77,11 @@ msgstr "A second authentication factor is required" msgid "A service controlled by <0>{domain}" msgstr "A service controlled by <0>{domain}" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "About" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "Account" @@ -138,11 +138,11 @@ msgstr "Any method" msgid "Any service" msgstr "Any service" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "Apps" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "Authorize" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "Authorized on {0}" @@ -194,7 +194,7 @@ msgstr "Bluesky App services" msgid "Bluesky Chat services" msgstr "Bluesky Chat services" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "Branding" @@ -215,11 +215,11 @@ msgstr "Call" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "Cancel" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "Cannot remove current device" @@ -227,7 +227,7 @@ msgstr "Cannot remove current device" msgid "Change your <0>@handle" msgstr "Change your <0>@handle" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "Change your account password" @@ -256,7 +256,7 @@ msgstr "Close account selector" msgid "Close details" msgstr "Close details" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "Code" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "Continue" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "Cookie Error" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "Deny access" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "Description" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "Details" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "Devices" @@ -370,12 +367,12 @@ msgstr "Expand details" msgid "Extra" msgstr "Extra" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "Failed to load connected apps" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "Failed to remove device" @@ -383,11 +380,11 @@ msgstr "Failed to remove device" msgid "Failed to request password reset" msgstr "Failed to request password reset" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "Failed to reset password" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "Failed to revoke access" @@ -436,12 +433,12 @@ msgstr "Invalid" msgid "Invite code" msgstr "Invite code" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "It appears that you haven’t used this account to sign in to any apps yet." #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." @@ -449,12 +446,12 @@ msgstr "It seems that your browser is not accepting cookies. Press \"Continue\" msgid "just now" msgstr "just now" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "Last accessed <0/>" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "Last seen {lastUsedAgo}" @@ -471,11 +468,11 @@ msgstr "Login complete" msgid "Login to account that is not listed" msgstr "Login to account that is not listed" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "Logo" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "Looks like you aren't logged in on any other devices." @@ -487,7 +484,7 @@ msgstr "loopback" msgid "Make visible" msgstr "Make visible" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "Manage applications that have access to your account" @@ -495,7 +492,7 @@ msgstr "Manage applications that have access to your account" msgid "Manage your <0>full identity including your <1>@handle" msgstr "Manage your <0>full identity including your <1>@handle" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "Manage your active sessions" @@ -507,6 +504,10 @@ msgstr "Manage your profile, posts, likes and follows" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "Manage your profile, posts, likes and follows as well as read your private preferences" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "Message" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "Missing" @@ -515,9 +516,13 @@ msgstr "Missing" msgid "Moderate" msgstr "Moderate" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" -msgstr "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "My Atmosphere Account" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" +msgstr "Name" #: src/components/reset-password-confirm-form.tsx:60 msgid "New password" @@ -529,12 +534,12 @@ msgstr "New password" msgid "Next" msgstr "Next" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "No email associated with this account. Password reset is unavailable." -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "Okay" @@ -542,7 +547,7 @@ msgstr "Okay" msgid "Only letters, numbers, and hyphens" msgstr "Only letters, numbers, and hyphens" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "Password" msgid "Password reset email sent" msgstr "Password reset email sent" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "Password reset successful" @@ -593,7 +598,7 @@ msgstr "Please authenticate to continue" msgid "Please check the email address and try again." msgstr "Please check the email address and try again." -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "Please check your reset code and try again." @@ -645,9 +650,9 @@ msgstr "Reset Password" msgid "Reset your password" msgstr "Reset your password" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "Retry" @@ -655,7 +660,7 @@ msgstr "Retry" msgid "Retry in {remainingSeconds}s" msgstr "Retry in {remainingSeconds}s" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "Revoke access" @@ -672,7 +677,7 @@ msgstr "Select domain" msgid "Select from an existing account" msgstr "Select from an existing account" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "Send reset code" @@ -697,7 +702,7 @@ msgstr "Sign in as {0}" msgid "Sign in as..." msgstr "Sign in as..." -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "Sign out" @@ -712,6 +717,10 @@ msgstr "Sign out" msgid "Sign up" msgstr "Sign up" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "Stack" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "Step {currentPosition} of {count}" @@ -720,15 +729,15 @@ msgstr "Step {currentPosition} of {count}" msgid "Strong" msgstr "Strong" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "Submit" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "Successfully removed device" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "Successfully revoked access" @@ -790,7 +799,7 @@ msgstr "The handle is invalid" msgid "The invite code is not valid" msgstr "The invite code is not valid" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." @@ -814,7 +823,7 @@ msgstr "This handle is reserved" msgid "This sign-in session has expired" msgstr "This sign-in session has expired" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." @@ -836,7 +845,7 @@ msgstr "Unauthorized" msgid "Unexpected server response" msgstr "Unexpected server response" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "Unknown user agent" @@ -889,11 +898,11 @@ msgstr "Weak" msgid "Welcome" msgstr "Welcome" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "What does this mean?" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "What is an Atmosphere Account?" @@ -913,7 +922,7 @@ msgstr "You are being redirected..." msgid "You can change this username to any domain name you control after your account is set up." msgstr "You can change this username to any domain name you control after your account is set up." -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "You can now sign in with your new password." @@ -926,11 +935,11 @@ msgstr "You will receive an email with a \"reset code\". Enter that code here th msgid "Your account" msgstr "Your account" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "Your Atmosphere account is hosted by <0/>." diff --git a/packages/oauth/oauth-provider-ui/src/locales/es/messages.po b/packages/oauth/oauth-provider-ui/src/locales/es/messages.po index 9e4361ae4b9..fab972a72c7 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/es/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/es/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/eu/messages.po b/packages/oauth/oauth-provider-ui/src/locales/eu/messages.po index c03dd3a5522..f2d0e45bf37 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/eu/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/eu/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/fi/messages.po b/packages/oauth/oauth-provider-ui/src/locales/fi/messages.po index e9792d104b8..82a0ec6803a 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/fi/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/fi/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/fr/messages.po b/packages/oauth/oauth-provider-ui/src/locales/fr/messages.po index 0491014caf3..b653c46ac62 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/fr/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/fr/messages.po @@ -25,31 +25,31 @@ msgstr "il y a {deltaHours} heures" msgid "{deltaMinutes} minutes ago" msgstr "il y a {deltaMinutes} minutes" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "<0>AT Protocol — Documentation technique pour les développeurs" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "<0>Bluesky Social — Informations générales sur le réseau" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "<0>En savoir plus<1>Vous voulez en savoir plus sur la technologie et le réseau derrière votre compte Atmosphère ?" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "<0>Ce site web : le centre de contrôle de votre compte<1>Le site web sur lequel vous êtes actuellement est votre <2>centre de gestion de compte. Ici, vous pouvez :<3><4>Mettre à jour votre adresse e-mail et votre mot de passe<5>Gérer vos données personnelles et les paramètres de sécurité<6>Afficher et gérer les sessions actives sur tous les appareils (navigateurs où vous êtes connecté)<7>C'est ici que vous pouvez contrôler les aspects fondamentaux de votre identité Atmosphère, indépendamment des aspects spécifiques liés à une application, comme par exemple le profil que vous avez sur <8>Bluesky.<9>Votre compte Atmosphère est actuellement hébergé par <10/>, l'un des nombreux fournisseurs d'hébergement du réseau Atmosphère. Vous pouvez à tout moment changer de fournisseur sans perdre votre compte, votre identité ou vos données." -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "<0>Utilisez-le avec plusieurs applications<1>Votre compte Atmosphère fonctionne avec le réseau social <2>Bluesky ainsi que toutes les autres applications sociales construites sur le même réseau.<3>De la même manière que vous pouvez utiliser la même adresse e-mail pour vous connecter à différents sites web, votre compte Atmosphère vous permet de vous connecter à différentes applications sociales tout en conservant la même identité, les mêmes connexions et le même contenu.<4>Lorsque vous voyez des options pour vous connecter avec un \"compte Atmosphère\" ou un \"pseudo Internet\" sur d'autres applications, vous pouvez utiliser votre compte existant <5><6/> plutôt que d'en créer un nouveau." -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "<0>Qu'est-ce qu'un compte Atmosphère ?<1>Un <2>compte Atmosphère est votre identité personnelle sur l'Atmosphère. Pensez-y comme à un passeport numérique que vous possédez vraiment, pas lié à une seule application ou entreprise." -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "<0>Qu'est-ce qui le rend spécial<1>La grande différence : vos données ne sont pas enfermées dans une seule application. Contrairement aux comptes de médias sociaux traditionnels, où vos données appartiennent à la plateforme, avec un compte Atmosphère, vous possédez véritablement votre identité et vos données :<2><3><4>Vous possédez votre identité : Votre identifiant permanent vous appartient, et vous pouvez utiliser un nom de domaine que vous possédez comme pseudo si vous le souhaitez<5><6>Vos données sont portables : Les publications, abonnements (\"follows\"), \"likes\" et autres contenus vivent dans votre stockage de données personnel<7><8>Vous pouvez vous déplacer librement : Changez de fournisseur d'hébergement sans perdre vos abonnés, publications ou connexions. Cela vous permet également de choisir un fournisseur dans votre pays si l'emplacement de vos données est important.<9><10>Plusieurs applications, une identité : Utilisez le même compte sur différentes applications construites sur le même réseau" @@ -77,11 +77,11 @@ msgstr "Un second facteur d'authentification est requis" msgid "A service controlled by <0>{domain}" msgstr "Un service contrôlé par <0>{domain}" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "À propos" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "Compte utilisateur" @@ -138,11 +138,11 @@ msgstr "N'importe quelle action" msgid "Any service" msgstr "N'importe quel service" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "Applications" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "Les applications peuvent accéder à votre compte en arrière-plan (pour vérifier les notifications, synchroniser les données, etc.) même lorsque vous ne les utilisez pas activement. C'est un comportement normal qui sera reflété dans l'heure de \"dernier accès\" affichée ci-dessus." @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "Autoriser" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "Autorisé le {0}" @@ -194,7 +194,7 @@ msgstr "Services de l'application Bluesky" msgid "Bluesky Chat services" msgstr "Services de discussion de Bluesky" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "Personnalisation" @@ -215,11 +215,11 @@ msgstr "Appeler" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "Annuler" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "Impossible de supprimer l'appareil en cours d'utilisation" @@ -227,7 +227,7 @@ msgstr "Impossible de supprimer l'appareil en cours d'utilisation" msgid "Change your <0>@handle" msgstr "Modifier votre <0>@pseudo" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "Changer le mot de passe de votre compte" @@ -256,7 +256,7 @@ msgstr "Fermer le sélecteur de compte" msgid "Close details" msgstr "Fermer les détails" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "Code" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "Continuer" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "Erreur de cookies" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "Refuser l'accès" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "Description" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "Détails" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "Appareils" @@ -370,12 +367,12 @@ msgstr "Développer les détails" msgid "Extra" msgstr "Extra" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "Échec du chargement des applications connectées" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "Échec de la suppression de l'appareil" @@ -383,11 +380,11 @@ msgstr "Échec de la suppression de l'appareil" msgid "Failed to request password reset" msgstr "Échec de la demande de réinitialisation du mot de passe" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "Échec de la réinitialisation du mot de passe" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "Échec de la révocation de l'accès" @@ -436,12 +433,12 @@ msgstr "Invalide" msgid "Invite code" msgstr "Code d'invitation" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "Il semble que vous n'ayez pas encore utilisé ce compte pour vous connecter à des applications." #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "Il semble que votre navigateur n'accepte pas les cookies. Appuyez sur \"Continuer\" pour réessayer. Si l'erreur persiste, veuillez vous assurer que vos paramètres de confidentialité autorisent les cookies pour le site \"{0}\"." @@ -449,12 +446,12 @@ msgstr "Il semble que votre navigateur n'accepte pas les cookies. Appuyez sur \" msgid "just now" msgstr "à l'instant" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "Dernier accès <0/>" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "Dernière connexion {lastUsedAgo}" @@ -471,11 +468,11 @@ msgstr "Connexion terminée" msgid "Login to account that is not listed" msgstr "Se connecter à un compte qui n'est pas listé" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "Logo" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "Il semble que vous ne soyez connecté sur aucun autre appareil." @@ -487,7 +484,7 @@ msgstr "loopback" msgid "Make visible" msgstr "Rendre visible" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "Gérer les applications qui ont accès à votre compte" @@ -495,7 +492,7 @@ msgstr "Gérer les applications qui ont accès à votre compte" msgid "Manage your <0>full identity including your <1>@handle" msgstr "Gérer votre <0>identité complète y compris votre <1>@pseudo" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "Gérer vos sessions actives" @@ -507,6 +504,10 @@ msgstr "Gérer votre profil, vos posts, vos likes et vos abonnements" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "Gérer votre profil, vos posts, vos likes et vos abonnements ainsi que lire vos préférences privées" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "Message" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "Manquant" @@ -515,10 +516,14 @@ msgstr "Manquant" msgid "Moderate" msgstr "Modéré" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" msgstr "Mon compte Atmosphère" +#: src/components/utils/error-details.tsx:67 +msgid "Name" +msgstr "Nom" + #: src/components/reset-password-confirm-form.tsx:60 msgid "New password" msgstr "Nouveau mot de passe" @@ -529,12 +534,12 @@ msgstr "Nouveau mot de passe" msgid "Next" msgstr "Suivant" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "Aucun email associé à ce compte. La réinitialisation du mot de passe n'est pas disponible." -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "OK" @@ -542,7 +547,7 @@ msgstr "OK" msgid "Only letters, numbers, and hyphens" msgstr "Uniquement des lettres, des chiffres et des traits d'union" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "Mot de passe" msgid "Password reset email sent" msgstr "E-mail de réinitialisation du mot de passe envoyé" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "Réinitialisation du mot de passe réussie" @@ -593,7 +598,7 @@ msgstr "Veuillez vous identifier pour continuer" msgid "Please check the email address and try again." msgstr "Veuillez vérifier l'adresse e-mail et réessayer." -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "Veuillez vérifier votre code de réinitialisation et réessayer." @@ -645,9 +650,9 @@ msgstr "Réinitialiser le mot de passe" msgid "Reset your password" msgstr "Réinitialisez votre mot de passe" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "Réessayer" @@ -655,7 +660,7 @@ msgstr "Réessayer" msgid "Retry in {remainingSeconds}s" msgstr "Réessayer dans {remainingSeconds}s" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "Révoquer l'accès" @@ -672,7 +677,7 @@ msgstr "Sélectionner le domaine" msgid "Select from an existing account" msgstr "Sélectionner un compte" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "Envoyer le code" @@ -697,7 +702,7 @@ msgstr "Se connecter en tant que {0}" msgid "Sign in as..." msgstr "Se connecter en tant que..." -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "Déconnecter" @@ -712,6 +717,10 @@ msgstr "Se déconnecter" msgid "Sign up" msgstr "S'inscrire" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "Pile d'appels" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "Étape {currentPosition} sur {count}" @@ -720,15 +729,15 @@ msgstr "Étape {currentPosition} sur {count}" msgid "Strong" msgstr "Fort" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "Soumettre" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "Appareil supprimé avec succès" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "Accès révoqué avec succès" @@ -790,7 +799,7 @@ msgstr "Le pseudonyme est invalide" msgid "The invite code is not valid" msgstr "Le code d'invitation n'est pas valide" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "Ces applications ont accès à votre compte. Une application peut apparaître plusieurs fois si vous l'utilisez sur différents appareils. Vous pouvez révoquer l'accès pour déconnecter l'application jusqu'à ce que vous vous reconnectiez." @@ -814,7 +823,7 @@ msgstr "Ce pseudonyme est réservé" msgid "This sign-in session has expired" msgstr "Cette session de connexion a expiré" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "Pour réinitialiser votre mot de passe, nous enverrons un code de vérification à <0>{email}. Saisissez le code ci-dessous pour définir un nouveau mot de passe." @@ -836,7 +845,7 @@ msgstr "Déconnecté" msgid "Unexpected server response" msgstr "Réponse inattendue du serveur" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "Agent utilisateur inconnu" @@ -889,11 +898,11 @@ msgstr "Faible" msgid "Welcome" msgstr "Bienvenue" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "Qu'est-ce que ça signifie ?" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "Qu'est-ce qu'un compte Atmosphère ?" @@ -913,7 +922,7 @@ msgstr "Vous êtes redirigé..." msgid "You can change this username to any domain name you control after your account is set up." msgstr "Vous pourrez changer ce nom d'utilisateur pour n'importe quel nom de domaine sous votre contrôle une fois votre compte créé." -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "Vous pouvez maintenant vous connecter avec votre nouveau mot de passe." @@ -926,11 +935,11 @@ msgstr "Vous avez reçu un email avec un \"code de réinitialisation\". Saisisse msgid "Your account" msgstr "Votre compte" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "Votre compte est connecté sur les appareils listés ci-dessous. Si votre compte a été compromis, déconnectez tous les appareils, changez votre mot de passe et vérifiez vos <0>applications connectées." -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "Votre compte Atmosphère est hébergé chez <0/>." diff --git a/packages/oauth/oauth-provider-ui/src/locales/ga/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ga/messages.po index 8488a41180e..ac2ffe37583 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ga/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ga/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/gl/messages.po b/packages/oauth/oauth-provider-ui/src/locales/gl/messages.po index 7677eec3e61..8224d1ed7e6 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/gl/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/gl/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/hi/messages.po b/packages/oauth/oauth-provider-ui/src/locales/hi/messages.po index e76147c75a8..85833db3e79 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/hi/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/hi/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/hu/messages.po b/packages/oauth/oauth-provider-ui/src/locales/hu/messages.po index 287545f316a..0591f63e423 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/hu/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/hu/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ia/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ia/messages.po index 2087833c76f..6f844b3a31f 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ia/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ia/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/id/messages.po b/packages/oauth/oauth-provider-ui/src/locales/id/messages.po index 41cd44536d7..b6ead65cdce 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/id/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/id/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/it/messages.po b/packages/oauth/oauth-provider-ui/src/locales/it/messages.po index 3830afc71df..ef25bc637ea 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/it/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/it/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ja/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ja/messages.po index 8641ea84a7c..9290aca10f0 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ja/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ja/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "2番目の認証要素が必要です" msgid "A service controlled by <0>{domain}" msgstr "<0>{domain} によって管理されているサービス" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "アカウント" @@ -138,11 +138,11 @@ msgstr "すべてのメソッド" msgid "Any service" msgstr "すべてのサービス" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "Blueksyアプリサービス" msgid "Bluesky Chat services" msgstr "Blueskyチャットサービス" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "呼び出し" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "キャンセル" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "<0>@handle を変更" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "コード" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "説明" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "詳細を開く" msgid "Extra" msgstr "最強" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "無効" msgid "Invite code" msgstr "招待コード" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "ログイン完了" msgid "Login to account that is not listed" msgstr "リストにないアカウントにログイン" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "ロゴ" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "表示する" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "あなたの <1>@handle を含む <0>すべての識別情報 を管理する" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "あなたのプロフィール、投稿、いいね、フォローを管 msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "あなたのプロフィール、投稿、いいね、フォローを管理し、あなたのプライベートな設定を読み取る" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "無し" @@ -515,8 +516,12 @@ msgstr "無し" msgid "Moderate" msgstr "中程度" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "新しいパスワード" msgid "Next" msgstr "次へ" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "OK" @@ -542,7 +547,7 @@ msgstr "OK" msgid "Only letters, numbers, and hyphens" msgstr "英数字とハイフンのみ" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "パスワード" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "パスワードをリセット" msgid "Reset your password" msgstr "パスワードをリセット" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "ドメインを選択" msgid "Select from an existing account" msgstr "既存のアカウントから選択" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "{0} でサインイン" msgid "Sign in as..." msgstr "アカウントの選択" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "サインアップ" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "ステップ {currentPosition} / {count}" @@ -720,15 +729,15 @@ msgstr "ステップ {currentPosition} / {count}" msgid "Strong" msgstr "強い" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "送信" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "ハンドルは無効です" msgid "The invite code is not valid" msgstr "招待コードが有効ではありません" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "このハンドルは予約されています" msgid "This sign-in session has expired" msgstr "このサインインセッションの有効期限が切れました" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "予期しないサーバー応答" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "弱い" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "リダイレクトしています…" msgid "You can change this username to any domain name you control after your account is set up." msgstr "アカウントのセットアップ後にユーザー名を自分がコントロールしているドメイン名に変更することができます。" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "新しいパスワードでサインインできるようになりました。" @@ -926,11 +935,11 @@ msgstr "「リセットコード」が記載されたメールが届きます。 msgid "Your account" msgstr "あなたのアカウント" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/km/messages.po b/packages/oauth/oauth-provider-ui/src/locales/km/messages.po index 6ca682ad265..94850e9cc45 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/km/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/km/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ko/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ko/messages.po index 135146b6a0a..c7ef57ff583 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ko/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ko/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/locale-provider.tsx b/packages/oauth/oauth-provider-ui/src/locales/locale-provider.tsx index 1c4b8bd2d0e..8b3a564d94b 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/locale-provider.tsx +++ b/packages/oauth/oauth-provider-ui/src/locales/locale-provider.tsx @@ -20,6 +20,7 @@ export type LocaleContextValue = { } const LocaleContext = createContext(null) +LocaleContext.displayName = 'LocaleContext' export function useLocaleContext(): LocaleContextValue { const context = useContext(LocaleContext) @@ -105,8 +106,8 @@ export function LocaleProvider({ ) return ( - + {initialized && children} - + ) } diff --git a/packages/oauth/oauth-provider-ui/src/locales/ne/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ne/messages.po index 587867a2d38..f5c5adf3050 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ne/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ne/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/nl/messages.po b/packages/oauth/oauth-provider-ui/src/locales/nl/messages.po index 4b44af338e5..14b746a0a34 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/nl/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/nl/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/pl/messages.po b/packages/oauth/oauth-provider-ui/src/locales/pl/messages.po index a29dd6f64f7..b0e0b517942 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/pl/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/pl/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/pt-BR/messages.po b/packages/oauth/oauth-provider-ui/src/locales/pt-BR/messages.po index cb8aa2bb31e..4fa93e4650a 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/pt-BR/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/pt-BR/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ro/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ro/messages.po index 4ef78e11b50..ed0f9b40538 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ro/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ro/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/ru/messages.po b/packages/oauth/oauth-provider-ui/src/locales/ru/messages.po index 89626bc8445..3a066c0914e 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/ru/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/ru/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/sv/messages.po b/packages/oauth/oauth-provider-ui/src/locales/sv/messages.po index 522b80e9df5..025ec04fc2c 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/sv/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/sv/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/th/messages.po b/packages/oauth/oauth-provider-ui/src/locales/th/messages.po index e59271ec9d1..49e13cdb43d 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/th/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/th/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/tr/messages.po b/packages/oauth/oauth-provider-ui/src/locales/tr/messages.po index 523751455fc..adbf1421357 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/tr/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/tr/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/uk/messages.po b/packages/oauth/oauth-provider-ui/src/locales/uk/messages.po index f3ef778df00..b1990aff7c6 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/uk/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/uk/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/vi/messages.po b/packages/oauth/oauth-provider-ui/src/locales/vi/messages.po index 6fea269454a..c7e6264e825 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/vi/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/vi/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/zh-CN/messages.po b/packages/oauth/oauth-provider-ui/src/locales/zh-CN/messages.po index 24b9542352e..0333dc8cf32 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/zh-CN/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/zh-CN/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/zh-HK/messages.po b/packages/oauth/oauth-provider-ui/src/locales/zh-HK/messages.po index cb82fd562ba..81eda931c69 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/zh-HK/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/zh-HK/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/locales/zh-TW/messages.po b/packages/oauth/oauth-provider-ui/src/locales/zh-TW/messages.po index c2bb42aeeb2..503d4f8b6c0 100644 --- a/packages/oauth/oauth-provider-ui/src/locales/zh-TW/messages.po +++ b/packages/oauth/oauth-provider-ui/src/locales/zh-TW/messages.po @@ -25,31 +25,31 @@ msgstr "" msgid "{deltaMinutes} minutes ago" msgstr "" -#: src/routes/account/about/page.tsx:136 +#: src/pages/account/(authenticated)/about/page.tsx:136 msgid "<0>AT Protocol — Technical documentation for developers" msgstr "" -#: src/routes/account/about/page.tsx:128 +#: src/pages/account/(authenticated)/about/page.tsx:128 msgid "<0>Bluesky Social — General information about the network" msgstr "" -#: src/routes/account/about/page.tsx:119 +#: src/pages/account/(authenticated)/about/page.tsx:119 msgid "<0>Learn more<1>Want to learn more about the technology and network behind your Atmosphere account?" msgstr "" -#: src/routes/account/about/page.tsx:84 +#: src/pages/account/(authenticated)/about/page.tsx:84 msgid "<0>This website: your account control center<1>The website you're on right now is your <2>account management hub. Here you can:<3><4>Update your email address and password<5>Manage your personal data and security settings<6>View and manage active sessions across devices (browsers where you're signed in)<7>This place is where you control the fundamental aspects of your Atmosphere identity, independently of any app-specific details like the profile you have on the <8>Bluesky social app.<9>Your Atmosphere account is currently hosted by <10/>, one of many hosting providers in the Atmosphere network. You can switch to a different one at any time without losing your account, identity, or data." msgstr "" -#: src/routes/account/about/page.tsx:24 +#: src/pages/account/(authenticated)/about/page.tsx:24 msgid "<0>Use it across multiple apps<1>Your Atmosphere account works with the <2>Bluesky Social App and any other social apps built on the same network.<3>Just like you can use the same email address to sign into different websites, your Atmosphere account lets you sign into different social apps while keeping the same identity, connections, and content.<4>When you see options to log in with an Atmosphere account or \"internet handle\" on other apps, you can use your existing account <5><6/> instead of creating a new one." msgstr "" -#: src/routes/account/about/page.tsx:13 +#: src/pages/account/(authenticated)/about/page.tsx:13 msgid "<0>What is an Atmosphere account?<1>An <2>Atmosphere account is your personal identity on the Atmosphere. Think of it as a digital passport that you truly own, not locked to any single app or company." msgstr "" -#: src/routes/account/about/page.tsx:51 +#: src/pages/account/(authenticated)/about/page.tsx:51 msgid "<0>What makes it special<1>The key difference: your data isn't trapped in any one app. Unlike traditional social media accounts, where your data belongs to the platform, with an Atmosphere account you genuinely own your identity and data:<2><3><4>You own your identity: Your username (handle) and permanent ID belong to you<5><6>Your data is portable: Posts, follows, and content live in your personal data storage, not locked in an app's database<7><8>You can move freely: Switch hosting providers without losing your followers, posts, or connections. This also lets you choose a provider in your country if it matters where your data is stored.<9><10>Multiple apps, one identity: Use the same account across different apps built on the same network" msgstr "" @@ -77,11 +77,11 @@ msgstr "" msgid "A service controlled by <0>{domain}" msgstr "" -#: src/account-page.tsx:89 +#: src/pages/account/(authenticated)/route.tsx:77 msgid "About" msgstr "" -#: src/account-page.tsx:55 +#: src/pages/account/(authenticated)/route.tsx:50 #: src/components/utils/scope-description.tsx:266 msgid "Account" msgstr "" @@ -138,11 +138,11 @@ msgstr "" msgid "Any service" msgstr "" -#: src/account-page.tsx:68 +#: src/pages/account/(authenticated)/route.tsx:63 msgid "Apps" msgstr "" -#: src/routes/account/apps/page.tsx:56 +#: src/pages/account/(authenticated)/apps/page.tsx:59 msgid "Apps may access your account in the background (to check notifications, sync data, etc.) even when you're not actively using them. This is normal behavior and will update the \"last accessed\" time shown above." msgstr "" @@ -164,7 +164,7 @@ msgid "Authorize" msgstr "" #. placeholder {0}: i18n.date(createdAt, { year: 'numeric', month: 'short', day: 'numeric', }) -#: src/routes/account/apps/page.tsx:128 +#: src/pages/account/(authenticated)/apps/page.tsx:131 msgctxt "OAuthApp" msgid "Authorized on {0}" msgstr "" @@ -194,7 +194,7 @@ msgstr "" msgid "Bluesky Chat services" msgstr "" -#: src/account-page.tsx:83 +#: src/pages/router.tsx:20 msgid "Branding" msgstr "" @@ -215,11 +215,11 @@ msgstr "" #: src/contexts/authentication.tsx:173 #: src/components/authenticate-welcome-view.tsx:57 -#: src/components/forms/form-card-async.tsx:44 +#: src/components/forms/form-card-async.tsx:42 msgid "Cancel" msgstr "" -#: src/routes/account/devices/page.tsx:117 +#: src/pages/account/(authenticated)/devices/page.tsx:120 msgid "Cannot remove current device" msgstr "" @@ -227,7 +227,7 @@ msgstr "" msgid "Change your <0>@handle" msgstr "" -#: src/account-page.tsx:76 +#: src/pages/account/(authenticated)/route.tsx:71 msgid "Change your account password" msgstr "" @@ -256,7 +256,7 @@ msgstr "" msgid "Close details" msgstr "" -#: src/components/utils/error-card.tsx:65 +#: src/components/utils/error-details.tsx:76 msgid "Code" msgstr "" @@ -278,6 +278,7 @@ msgid "Continue" msgstr "" #: src/cookie-error-page.tsx:37 +#: src/cookie-error-page.tsx:54 msgid "Cookie Error" msgstr "" @@ -306,15 +307,11 @@ msgctxt "OAuthConsent" msgid "Deny access" msgstr "" -#: src/components/utils/error-card.tsx:72 -msgid "Description" -msgstr "" - #: src/components/utils/description-card.tsx:70 msgid "Details" msgstr "" -#: src/account-page.tsx:61 +#: src/pages/account/(authenticated)/route.tsx:56 msgid "Devices" msgstr "" @@ -370,12 +367,12 @@ msgstr "" msgid "Extra" msgstr "" -#: src/routes/account/devices/page.tsx:31 -#: src/routes/account/apps/page.tsx:32 +#: src/pages/account/(authenticated)/devices/page.tsx:34 +#: src/pages/account/(authenticated)/apps/page.tsx:35 msgid "Failed to load connected apps" msgstr "" -#: src/routes/account/devices/page.tsx:91 +#: src/pages/account/(authenticated)/devices/page.tsx:94 msgid "Failed to remove device" msgstr "" @@ -383,11 +380,11 @@ msgstr "" msgid "Failed to request password reset" msgstr "" -#: src/data/password.ts:64 +#: src/data/password.ts:63 msgid "Failed to reset password" msgstr "" -#: src/routes/account/apps/page.tsx:113 +#: src/pages/account/(authenticated)/apps/page.tsx:116 msgid "Failed to revoke access" msgstr "" @@ -436,12 +433,12 @@ msgstr "" msgid "Invite code" msgstr "" -#: src/routes/account/apps/page.tsx:66 +#: src/pages/account/(authenticated)/apps/page.tsx:69 msgid "It appears that you haven’t used this account to sign in to any apps yet." msgstr "" #. placeholder {0}: url.hostname -#: src/cookie-error-page.tsx:52 +#: src/cookie-error-page.tsx:56 msgid "It seems that your browser is not accepting cookies. Press \"Continue\" to try again. If the error persists, please ensure that your privacy settings allow cookies for the \"{0}\" website." msgstr "" @@ -449,12 +446,12 @@ msgstr "" msgid "just now" msgstr "" -#: src/routes/account/apps/page.tsx:137 +#: src/pages/account/(authenticated)/apps/page.tsx:140 msgctxt "OAuthApp" msgid "Last accessed <0/>" msgstr "" -#: src/routes/account/devices/page.tsx:107 +#: src/pages/account/(authenticated)/devices/page.tsx:110 msgctxt "device list" msgid "Last seen {lastUsedAgo}" msgstr "" @@ -471,11 +468,11 @@ msgstr "" msgid "Login to account that is not listed" msgstr "" -#: src/components/layouts/layout-app.tsx:29 +#: src/components/layouts/layout-app.tsx:28 msgid "Logo" msgstr "" -#: src/routes/account/devices/page.tsx:60 +#: src/pages/account/(authenticated)/devices/page.tsx:63 msgid "Looks like you aren't logged in on any other devices." msgstr "" @@ -487,7 +484,7 @@ msgstr "" msgid "Make visible" msgstr "" -#: src/account-page.tsx:69 +#: src/pages/account/(authenticated)/route.tsx:64 msgid "Manage applications that have access to your account" msgstr "" @@ -495,7 +492,7 @@ msgstr "" msgid "Manage your <0>full identity including your <1>@handle" msgstr "" -#: src/account-page.tsx:62 +#: src/pages/account/(authenticated)/route.tsx:57 msgid "Manage your active sessions" msgstr "" @@ -507,6 +504,10 @@ msgstr "" msgid "Manage your profile, posts, likes and follows as well as read your private preferences" msgstr "" +#: src/components/utils/error-details.tsx:87 +msgid "Message" +msgstr "" + #: src/components/utils/password-strength-label.tsx:33 msgid "Missing" msgstr "" @@ -515,8 +516,12 @@ msgstr "" msgid "Moderate" msgstr "" -#: src/account-page.tsx:50 -msgid "My Atmosphere account" +#: src/pages/account/(authenticated)/route.tsx:140 +msgid "My Atmosphere Account" +msgstr "" + +#: src/components/utils/error-details.tsx:67 +msgid "Name" msgstr "" #: src/components/reset-password-confirm-form.tsx:60 @@ -529,12 +534,12 @@ msgstr "" msgid "Next" msgstr "" -#: src/routes/account/password/page.tsx:19 +#: src/pages/account/(authenticated)/password/page.tsx:21 msgctxt "PasswordReset" msgid "No email associated with this account. Password reset is unavailable." msgstr "" -#: src/components/reset-password-view.tsx:115 +#: src/components/reset-password-view.tsx:116 msgid "Okay" msgstr "" @@ -542,7 +547,7 @@ msgstr "" msgid "Only letters, numbers, and hyphens" msgstr "" -#: src/account-page.tsx:75 +#: src/pages/account/(authenticated)/route.tsx:70 #: src/components/sign-up-account-form.tsx:128 #: src/components/sign-in-form.tsx:194 #: src/components/forms/input-password.tsx:53 @@ -553,7 +558,7 @@ msgstr "" msgid "Password reset email sent" msgstr "" -#: src/data/password.ts:56 +#: src/data/password.ts:55 msgid "Password reset successful" msgstr "" @@ -593,7 +598,7 @@ msgstr "" msgid "Please check the email address and try again." msgstr "" -#: src/data/password.ts:65 +#: src/data/password.ts:64 msgid "Please check your reset code and try again." msgstr "" @@ -645,9 +650,9 @@ msgstr "" msgid "Reset your password" msgstr "" -#: src/routes/account/devices/page.tsx:29 -#: src/routes/account/apps/page.tsx:30 -#: src/components/utils/error-card.tsx:50 +#: src/pages/account/(authenticated)/devices/page.tsx:30 +#: src/pages/account/(authenticated)/apps/page.tsx:31 +#: src/components/utils/error-card.tsx:44 msgid "Retry" msgstr "" @@ -655,7 +660,7 @@ msgstr "" msgid "Retry in {remainingSeconds}s" msgstr "" -#: src/routes/account/apps/page.tsx:148 +#: src/pages/account/(authenticated)/apps/page.tsx:151 msgctxt "OAuthApp" msgid "Revoke access" msgstr "" @@ -672,7 +677,7 @@ msgstr "" msgid "Select from an existing account" msgstr "" -#: src/routes/account/password/page.tsx:48 +#: src/pages/account/(authenticated)/password/page.tsx:51 msgctxt "PasswordReset" msgid "Send reset code" msgstr "" @@ -697,7 +702,7 @@ msgstr "" msgid "Sign in as..." msgstr "" -#: src/routes/account/devices/page.tsx:120 +#: src/pages/account/(authenticated)/devices/page.tsx:123 msgctxt "device list" msgid "Sign out" msgstr "" @@ -712,6 +717,10 @@ msgstr "" msgid "Sign up" msgstr "" +#: src/components/utils/error-details.tsx:96 +msgid "Stack" +msgstr "" + #: src/components/forms/wizard-card.tsx:106 msgid "Step {currentPosition} of {count}" msgstr "" @@ -720,15 +729,15 @@ msgstr "" msgid "Strong" msgstr "" -#: src/components/forms/form-card-async.tsx:41 +#: src/components/forms/form-card-async.tsx:39 msgid "Submit" msgstr "" -#: src/routes/account/devices/page.tsx:85 +#: src/pages/account/(authenticated)/devices/page.tsx:88 msgid "Successfully removed device" msgstr "" -#: src/routes/account/apps/page.tsx:106 +#: src/pages/account/(authenticated)/apps/page.tsx:109 msgid "Successfully revoked access" msgstr "" @@ -790,7 +799,7 @@ msgstr "" msgid "The invite code is not valid" msgstr "" -#: src/routes/account/apps/page.tsx:40 +#: src/pages/account/(authenticated)/apps/page.tsx:43 msgid "These apps have access to your account. An app may appear multiple times if you use it on different devices. You can revoke access to log out the app until you sign in again." msgstr "" @@ -814,7 +823,7 @@ msgstr "" msgid "This sign-in session has expired" msgstr "" -#: src/routes/account/password/page.tsx:32 +#: src/pages/account/(authenticated)/password/page.tsx:34 msgctxt "PasswordReset" msgid "To reset your password, we'll send a verification code to <0>{email}. Enter the code below to set a new password." msgstr "" @@ -836,7 +845,7 @@ msgstr "" msgid "Unexpected server response" msgstr "" -#: src/routes/account/devices/page.tsx:102 +#: src/pages/account/(authenticated)/devices/page.tsx:105 msgctxt "device list" msgid "Unknown user agent" msgstr "" @@ -889,11 +898,11 @@ msgstr "" msgid "Welcome" msgstr "" -#: src/routes/account/page.tsx:30 +#: src/pages/account/(authenticated)/page.tsx:30 msgid "What does this mean?" msgstr "" -#: src/account-page.tsx:91 +#: src/pages/account/(authenticated)/route.tsx:79 msgid "What is an Atmosphere Account?" msgstr "" @@ -913,7 +922,7 @@ msgstr "" msgid "You can change this username to any domain name you control after your account is set up." msgstr "" -#: src/data/password.ts:57 +#: src/data/password.ts:56 #: src/components/reset-password-view.tsx:112 msgid "You can now sign in with your new password." msgstr "" @@ -926,11 +935,11 @@ msgstr "" msgid "Your account" msgstr "" -#: src/routes/account/devices/page.tsx:39 +#: src/pages/account/(authenticated)/devices/page.tsx:42 msgid "Your account is signed in on the devices listed below. If your account was compromised, sign out all devices, change your password, and check your connected <0>apps." msgstr "" -#: src/routes/account/page.tsx:23 +#: src/pages/account/(authenticated)/page.tsx:23 msgid "Your Atmosphere account is hosted by <0/>." msgstr "" diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/about/page.fr.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/about/page.fr.tsx similarity index 100% rename from packages/oauth/oauth-provider-ui/src/routes/account/about/page.fr.tsx rename to packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/about/page.fr.tsx diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/about/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/about/page.tsx similarity index 100% rename from packages/oauth/oauth-provider-ui/src/routes/account/about/page.tsx rename to packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/about/page.tsx diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/apps/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx similarity index 95% rename from packages/oauth/oauth-provider-ui/src/routes/account/apps/page.tsx rename to packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx index 324d3d0385b..040d2b5b36e 100644 --- a/packages/oauth/oauth-provider-ui/src/routes/account/apps/page.tsx +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx @@ -1,7 +1,7 @@ import { Trans, useLingui } from '@lingui/react/macro' import type { ActiveOAuthSession } from '@atproto/oauth-provider-api' import { Button } from '#/components/forms/button' -import { Admonition } from '#/components/utils/admonition.tsx' +import { Action, Admonition } from '#/components/utils/admonition.tsx' import { CircularProgress } from '#/components/utils/circular-progress' import { DateAgo } from '#/components/utils/date-ago' import { useAuthenticatedSession } from '#/contexts/authentication.tsx' @@ -14,7 +14,6 @@ import { useOAuthClientIdentifier } from '#/hooks/use-oauth-client-identifier.ts import { useOauthClientName } from '#/hooks/use-oauth-client-name.ts' export function Page() { - const { t } = useLingui() const { account } = useAuthenticatedSession() const { sub } = account const { data, isLoading, refetch } = useOAuthSessionsQuery({ sub }) @@ -27,7 +26,11 @@ export function Page() { return ( refetch() }} + action={ + refetch()}> + Retry + + } > Failed to load connected apps diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/devices/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx similarity index 94% rename from packages/oauth/oauth-provider-ui/src/routes/account/devices/page.tsx rename to packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx index d437e3f81c5..eb328be6f48 100644 --- a/packages/oauth/oauth-provider-ui/src/routes/account/devices/page.tsx +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx @@ -2,7 +2,7 @@ import { Trans, useLingui } from '@lingui/react/macro' import { Link } from '@tanstack/react-router' import type { ActiveAccountSession } from '@atproto/oauth-provider-api' import { Button } from '#/components/forms/button' -import { Admonition } from '#/components/utils/admonition.tsx' +import { Action, Admonition } from '#/components/utils/admonition.tsx' import { CircularProgress } from '#/components/utils/circular-progress' import { useAuthenticatedSession } from '#/contexts/authentication.tsx' import { useNotificationsContext } from '#/contexts/notifications.tsx' @@ -14,7 +14,6 @@ import { useBrowserName } from '#/hooks/use-browser-name' import { useDateAgo } from '#/hooks/use-date-ago' export function Page() { - const { t } = useLingui() const { account } = useAuthenticatedSession() const { data, refetch, isLoading } = useAccountSessionsQuery(account) @@ -26,7 +25,11 @@ export function Page() { return ( refetch() }} + action={ + refetch()}> + Retry + + } > Failed to load connected apps diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/page.tsx similarity index 100% rename from packages/oauth/oauth-provider-ui/src/routes/account/page.tsx rename to packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/page.tsx diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/password/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/password/page.tsx similarity index 90% rename from packages/oauth/oauth-provider-ui/src/routes/account/password/page.tsx rename to packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/password/page.tsx index dd552a1cfed..cd2fb3c169a 100644 --- a/packages/oauth/oauth-provider-ui/src/routes/account/password/page.tsx +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/password/page.tsx @@ -1,5 +1,6 @@ import { Trans } from '@lingui/react/macro' import { PaperPlaneTiltIcon } from '@phosphor-icons/react' +import { useState } from 'react' import { ButtonCooldown } from '#/components/forms/button-cooldown.tsx' import { ResetPasswordConfirmForm } from '#/components/reset-password-confirm-form.tsx' import { Admonition } from '#/components/utils/admonition.tsx' @@ -10,6 +11,7 @@ import { } from '#/data/password.ts' export function Page() { + const [success, setSuccess] = useState(false) const { account } = useAuthenticatedSession() const { email } = account @@ -41,6 +43,7 @@ export function Page() { }} cooldownSeconds={30} loading={resetPasswordRequest.isPending} + disabled={success} className="max-w-full" > @@ -50,9 +53,10 @@ export function Page() { { await resetPasswordConfirm.mutateAsync(data) + setSuccess(true) }} />
diff --git a/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/route.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/route.tsx new file mode 100644 index 00000000000..b840ef0017b --- /dev/null +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/route.tsx @@ -0,0 +1,222 @@ +import { MessageDescriptor } from '@lingui/core' +import { msg } from '@lingui/core/macro' +import { + DevicesIcon, + GlobeIcon, + HouseSimpleIcon, + IconProps, + KeyIcon, + QuestionIcon, +} from '@phosphor-icons/react' +import { + Outlet, + RegisteredRouter, + ToPathOption, + createRoute, + useRouter, +} from '@tanstack/react-router' +import { FunctionComponent, ReactNode, useEffect, useMemo, useRef } from 'react' +import { + LayoutPage, + LayoutPageLink, +} from '#/components/layouts/layout-page.tsx' +import { AuthenticationProvider } from '#/contexts/authentication.tsx' +import { useSessionContext } from '#/contexts/session.tsx' +import { Explicit } from '#/lib/util.ts' +import { RootRoute } from '../../route.tsx' +import { Page as AccountAboutPage } from './about/page.tsx' +import { Page as AccountOAuthPage } from './apps/page.tsx' +import { Page as AccountDevicesPage } from './devices/page.tsx' +import { Page as AccountIndexPage } from './page.tsx' +import { Page as AccountPasswordPage } from './password/page.tsx' + +type SubPage = { + title: string | MessageDescriptor + icon?: FunctionComponent + hidden?: boolean + position?: number + description?: string | MessageDescriptor + component: FunctionComponent +} + +type SubPages = { + [K in T]: SubPage +} + +const DEFAULT_PAGES = { + '/': { + icon: HouseSimpleIcon, + position: 0, + title: msg`Account`, + component: AccountIndexPage, + }, + '/devices': { + icon: DevicesIcon, + position: 10, + title: msg`Devices`, + description: msg`Manage your active sessions`, + component: AccountDevicesPage, + }, + '/apps': { + icon: GlobeIcon, + position: 20, + title: msg`Apps`, + description: msg`Manage applications that have access to your account`, + component: AccountOAuthPage, + }, + '/password': { + icon: KeyIcon, + position: 30, + title: msg`Password`, + description: msg`Change your account password`, + component: AccountPasswordPage, + }, + '/about': { + icon: QuestionIcon, + position: 50, + title: msg`About`, + component: AccountAboutPage, + description: msg`What is an Atmosphere Account?`, + }, +} satisfies SubPages + +export function buildRoutes( + path: T, + customPages?: SubPages, +) { + const subPages = { ...DEFAULT_PAGES, ...customPages } + + const route = createRoute({ + path, + component: (props) => ( + + ), + getParentRoute: () => RootRoute, + }) + + const childRoutes = ( + Object.entries(subPages) as [keyof typeof subPages, SubPage][] + ).map(([path, { component }]) => { + return createRoute({ getParentRoute: () => route, path, component }) + }) + + return [route, ...childRoutes] as const +} + +function Page({ + basePath, + subPages, +}: { + basePath: ToPathOption + subPages: SubPages +}) { + const links = useMemo(() => { + return Object.entries(subPages) + .sort(([ap, a], [bp, b]) => { + if (a.position != null && b.position != null) { + const diff = a.position - b.position + if (diff !== 0) return diff + } + return ap.localeCompare(bp) + }) + .map( + ([subPath, page]): Explicit => ({ + to: ((basePath as string) === '/' + ? subPath + : subPath === '/' + ? basePath + : `${basePath}${subPath}`) as any, + title: page.title, + description: page.description, + hidden: page.hidden, + icon: page.icon, + }), + ) + }, [subPages, basePath]) + + return ( + + + + + + ) +} + +const initialUrl = new URL(window.location.href) + +function AuthGate({ + children, + signOutTo, +}: { + children?: ReactNode + signOutTo?: ToPathOption +}) { + // This page supports a mode where it is loaded, by an app, in a webview or + // popup, to let the user manage their atmosphere account without leaving the + // app. In that case, we constrain the user to only use the account for which + // they opened the page, and we send a signal to the opener when they perform + // actions that signal the user is done with the page (like logging out, or + // explicitly "canceling" the sign-in). + + // @NOTE The VERY EXPERIMENTAL API used here **WILL** change in the future as + // it gets specified (or not) in the AT Protocol specification. It MUST NOT be + // used in places where security is a concern and is ONLY there for testing + // and experimentation purposes. DO NOT USE. + + const router = useRouter() + const { session } = useSessionContext() + const hasSession = useRef(session != null) + + const isPopup = initialUrl.searchParams.get('display') === 'popup' + const identifier = initialUrl.searchParams.get('login_hint') || undefined + const nonce = initialUrl.searchParams.get('nonce') || undefined + const callbackUrl = initialUrl.searchParams.get('redirect_uri') || undefined + + const done = useMemo void)>(() => { + if (callbackUrl && nonce) { + return () => { + const url = new URL(callbackUrl) + window.location.href = url.toString() + } + } else if (isPopup) { + return () => { + // Due to the various ways this page can be embedded (e.g. webview in a + // mobile app, a popup in a browser), and the fact that the opener might + // be on a different origin, we post the message on various targets to + // ensure it is received. We might want to configure this based on + // query params. + + // @NOTE We might want to restrict the targetOrigin based on the client + // metadata. + window.opener?.postMessage({ nonce, event: 'done' }, '*') + window.postMessage({ nonce, event: 'done' }, '*') + window.close() + } + } + }, [isPopup, callbackUrl, nonce]) + + useEffect(() => { + if (session && !hasSession.current) { + hasSession.current = true + } else if (!session && hasSession.current) { + hasSession.current = false + if (signOutTo) router.navigate({ to: signOutTo }) + done?.() + } + }, [session, done]) + + return ( + + {children} + + ) +} diff --git a/packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/reset-password/route.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/reset-password/route.tsx new file mode 100644 index 00000000000..1e933da3d10 --- /dev/null +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/reset-password/route.tsx @@ -0,0 +1,37 @@ +import { createRoute, useRouter } from '@tanstack/react-router' +import { ErrorView } from '#/components/error-view' +import { ResetPasswordView } from '#/components/reset-password-view' +import { useSessionContext } from '#/contexts/session' +import { RootRoute } from '../../../route.tsx' + +export const Route = createRoute({ + getParentRoute: () => RootRoute, + path: '/account/reset-password', + component: Page, + errorComponent: ErrorView, +}) + +export function Page() { + const { doInitiatePasswordReset, doConfirmResetPassword } = + useSessionContext() + + const router = useRouter() + + return ( + { + // Try to send them back to wherever they came from + window.history.back() + + // If they didn't move, send them to the account page + setTimeout(() => { + if (router.state.location.pathname === '/account/reset-password') { + router.navigate({ to: '/account' }) + } + }, 1_000) + }} + /> + ) +} diff --git a/packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/routes.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/routes.tsx new file mode 100644 index 00000000000..92702796f3d --- /dev/null +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(unauthenticated)/routes.tsx @@ -0,0 +1,13 @@ +// @NOTE "/account" already has a dedicated route (in +// ../(authenticated)/route.tsx) so we can't have a "parent" route defined here +// for all the unauthenticated routes. Instead, unauthenticated routes will just +// reference the RootRoute directly, and use full paths +// ("/account/reset-password") instead. We could create a hierarchical route +// structure for unauthenticated routes if we wanted to, but it would require to +// make at least some paths more complex (e.g. +// "/account/unauthenticated/reset-password"), without much value. + +// Note that we may eventually want to allow "/" to be a user-facing page (e.g. +// a landing page for the PDS), at which point the comment above would become +// irrelevant as unauthenticated routes would be natural children of the +// RootRoute. diff --git a/packages/oauth/oauth-provider-ui/src/routes/account.tsx b/packages/oauth/oauth-provider-ui/src/pages/route.tsx similarity index 86% rename from packages/oauth/oauth-provider-ui/src/routes/account.tsx rename to packages/oauth/oauth-provider-ui/src/pages/route.tsx index e002a2710b2..6e18877f363 100644 --- a/packages/oauth/oauth-provider-ui/src/routes/account.tsx +++ b/packages/oauth/oauth-provider-ui/src/pages/route.tsx @@ -2,6 +2,6 @@ import { Outlet, createRootRoute } from '@tanstack/react-router' import { ErrorView } from '#/components/error-view' export const RootRoute = createRootRoute({ - component: () => , + component: Outlet, errorComponent: ErrorView, }) diff --git a/packages/oauth/oauth-provider-ui/src/pages/router.tsx b/packages/oauth/oauth-provider-ui/src/pages/router.tsx new file mode 100644 index 00000000000..27f21940b25 --- /dev/null +++ b/packages/oauth/oauth-provider-ui/src/pages/router.tsx @@ -0,0 +1,37 @@ +import { msg } from '@lingui/core/macro' +import { PaintBucketIcon } from '@phosphor-icons/react' +import { createRouter } from '@tanstack/react-router' +import { Palette } from '#/components/utils/palette.tsx' +import { buildRoutes as buildAccountRoutes } from './account/(authenticated)/route.tsx' +import { Route as ResetPasswordRoute } from './account/(unauthenticated)/reset-password/route.tsx' +import { RootRoute } from './route.tsx' + +const authenticatedRoutes = buildAccountRoutes('/account', { + // Custom extra pages. The purpose of these is to (eventually!) allow adding + // custom pages (or changing existing pages) to the account manager, for + // specific deployments, without having to fork the entire package. The page + // below serves as an example of how this would work, and provides a "hidden" + // page can be used by self-hosters of the "official" PDS distribution for + // branding customization. + '/branding': { + icon: PaintBucketIcon, + hidden: true, + position: 40, + title: msg`Branding`, + component: Palette, + }, +}) + +export const router = createRouter({ + routeTree: RootRoute.addChildren([ + ...authenticatedRoutes, + ResetPasswordRoute, + ]), +}) + +// Register the router instance for type safety +declare module '@tanstack/react-router' { + interface Register { + router: typeof router + } +} diff --git a/packages/oauth/oauth-provider-ui/src/routes/account/layout.tsx b/packages/oauth/oauth-provider-ui/src/routes/account/layout.tsx deleted file mode 100644 index de81fdb5214..00000000000 --- a/packages/oauth/oauth-provider-ui/src/routes/account/layout.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import { MessageDescriptor } from '@lingui/core' -import { useLingui } from '@lingui/react' -import { ArrowLeftIcon, IconProps } from '@phosphor-icons/react' -import { - AnyRoute, - Link, - Outlet, - createRoute, - useRouter, - useRouterState, -} from '@tanstack/react-router' -import { clsx } from 'clsx' -import { FunctionComponent, useEffect, useMemo } from 'react' -import { LayoutApp } from '#/components/layouts/layout-app.tsx' -import { AccountSelector } from '#/components/utils/account-selector.tsx' -import { useAuthenticatedSession } from '#/contexts/authentication.tsx' - -export type LayoutPage = { - title: MessageDescriptor - icon?: FunctionComponent - hidden?: boolean - position?: number - description?: MessageDescriptor - component: FunctionComponent -} - -export type LayoutPages = { - [K in T]: LayoutPage -} - -export type LayoutRouteOptions< - TRootPath extends `/${string}` = `/${string}`, - TSubPath extends `/${string}` = `/${string}`, -> = { - path: TRootPath - title?: MessageDescriptor - getParentRoute: () => AnyRoute - pages: LayoutPages -} - -export function createLayoutRoute< - const TRootPath extends `/${string}`, - const TSubPath extends `/${string}`, ->({ - path, - title, - getParentRoute, - pages, -}: LayoutRouteOptions) { - const mainRoute = createRoute({ - path, - component: (props) => ( - - ), - getParentRoute, - }) - - const childRoutes = ( - Object.entries(pages) as [TSubPath, { component: FunctionComponent }][] - ).map(([subPath, { component }]) => { - return createRoute({ - path: subPath, - component, - getParentRoute: () => mainRoute, - }) - }) - - return [mainRoute, ...childRoutes] as const -} - -export type LayoutProps = { - path: string - pages: LayoutPages - title?: MessageDescriptor -} - -function Layout({ path, pages, title }: LayoutProps) { - const { _ } = useLingui() - const router = useRouter() - const { account } = useAuthenticatedSession() - const { location } = useRouterState() - - const pageEntries = useMemo(() => { - return Object.entries(pages) - .filter( - ([subPath, page]) => - !page.hidden || location.pathname === `${path}${subPath}`, - ) - .sort(([, a], [, b]) => { - if (a.position != null && b.position != null) { - return a.position - b.position - } - return 0 - }) - }, [pages, location.pathname, path]) - - const currentPage = useMemo(() => { - const currentSubPath = Object.keys(pages).find( - (p) => `${path}${p}` === location.pathname, - ) - if (!currentSubPath) return null - return pages[currentSubPath]! - }, [location.pathname, pages, path]) - - // Redirect to the main account page when the account changes - useEffect(() => { - router.navigate({ to: path }) - }, [account.sub]) - - const isHome = location.pathname === path - - return ( - } - > -
- - -
- - - -
-
-
- ) -} diff --git a/packages/oauth/oauth-provider/src/router/create-account-page-middleware.ts b/packages/oauth/oauth-provider/src/router/create-account-page-middleware.ts index 1b26adfe91a..87f2a71cede 100644 --- a/packages/oauth/oauth-provider/src/router/create-account-page-middleware.ts +++ b/packages/oauth/oauth-provider/src/router/create-account-page-middleware.ts @@ -41,7 +41,7 @@ export function createAccountPageMiddleware< const router = new Router(issuerUrl) // Create password reset discovery endpoint - // https://w3c.github.io/webappsec-change-password-url/ + // https://www.w3.org/TR/change-password-url/ router.get('/.well-known/change-password', (_req, res) => { writeRedirect(res, new URL('/account/reset-password', issuerUrl).toString()) }) From 877e6293b93b2c32342b2023ab4f0c0e1cce643a Mon Sep 17 00:00:00 2001 From: devin ivy Date: Fri, 24 Apr 2026 16:35:18 -0400 Subject: [PATCH 05/87] pds: use entryway mock server for tests (#4757) * pds: setup entryway mock server for tests, remove stale dep. * changeset * tidy test * pds: tidy mock entryway --- .changeset/fancy-ears-train.md | 5 + packages/pds/package.json | 1 - packages/pds/src/auth-verifier.ts | 14 +- packages/pds/src/index.ts | 6 +- packages/pds/tests/auth.test.ts | 4 +- packages/pds/tests/entryway-mock.ts | 317 +++++++++++++++++++++++++++ packages/pds/tests/entryway.test.ts | 118 ++-------- pnpm-lock.yaml | 319 ++++++---------------------- 8 files changed, 419 insertions(+), 365 deletions(-) create mode 100644 .changeset/fancy-ears-train.md create mode 100644 packages/pds/tests/entryway-mock.ts diff --git a/.changeset/fancy-ears-train.md b/.changeset/fancy-ears-train.md new file mode 100644 index 00000000000..f2dd4176a20 --- /dev/null +++ b/.changeset/fancy-ears-train.md @@ -0,0 +1,5 @@ +--- +'@atproto/pds': patch +--- + +Remove legacy JWT typ check. diff --git a/packages/pds/package.json b/packages/pds/package.json index 25e9dc2a08c..3664e89fef9 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -83,7 +83,6 @@ "@atproto/bsky": "workspace:^", "@atproto/lex-document": "workspace:^", "@atproto/oauth-client-browser-example": "workspace:^", - "@atproto/pds-entryway": "npm:@atproto/pds@0.3.0-entryway.3", "@did-plc/server": "^0.0.1", "@types/cors": "^2.8.12", "@types/express": "^4.17.13", diff --git a/packages/pds/src/auth-verifier.ts b/packages/pds/src/auth-verifier.ts index 6f78158d89b..fb73a7e41db 100644 --- a/packages/pds/src/auth-verifier.ts +++ b/packages/pds/src/auth-verifier.ts @@ -465,8 +465,8 @@ export class AuthVerifier { throw new AuthRequiredError(undefined, 'AuthMissing') } - const { payload, protectedHeader } = await jose - .jwtVerify(token, this._jwtKey, { ...options, typ: undefined }) + const { payload } = await jose + .jwtVerify(token, this._jwtKey, options) .catch((cause) => { if (cause instanceof jose.errors.JWTExpired) { throw new InvalidRequestError('Token has expired', 'ExpiredToken', { @@ -481,14 +481,6 @@ export class AuthVerifier { } }) - // @NOTE: the "typ" is now set in production environments, so we should be - // able to safely check it through jose.jwtVerify(). However, tests depend - // on @atproto/pds-entryway which does not set "typ" in the access tokens. - // For that reason, we still allow it to be missing. - if (protectedHeader.typ && options.typ !== protectedHeader.typ) { - throw new InvalidRequestError('Invalid token type', 'InvalidToken') - } - const { sub, aud, scope, lxm, cnf, jti } = payload if (typeof lxm !== 'undefined') { @@ -634,7 +626,7 @@ const extractAuthType = (req: IncomingMessage): AuthType | null => { return type } -const bearerTokenFromReq = (req: IncomingMessage) => { +export const bearerTokenFromReq = (req: IncomingMessage) => { const [type, token] = parseAuthorizationHeader(req) return type === AuthType.BEARER ? token : null } diff --git a/packages/pds/src/index.ts b/packages/pds/src/index.ts index 91f01686cc4..a68e3f7baf8 100644 --- a/packages/pds/src/index.ts +++ b/packages/pds/src/index.ts @@ -32,7 +32,11 @@ import compression from './util/compression' import * as wellKnown from './well-known' export * from './lexicons.js' -export { createSecretKeyObject } from './auth-verifier' +export { + bearerTokenFromReq, + createPublicKeyObject, + createSecretKeyObject, +} from './auth-verifier' export * from './config' export { AppContext } from './context' export { Database } from './db' diff --git a/packages/pds/tests/auth.test.ts b/packages/pds/tests/auth.test.ts index c528f32c312..0fec8687081 100644 --- a/packages/pds/tests/auth.test.ts +++ b/packages/pds/tests/auth.test.ts @@ -331,7 +331,9 @@ describe('auth', () => { password: 'password', }) const refreshWithAccess = refreshSession(account.accessJwt) - await expect(refreshWithAccess).rejects.toThrow('Invalid token type') + await expect(refreshWithAccess).rejects.toThrow( + 'Token could not be verified', + ) }) it('expired refresh token cannot be used to refresh a session.', async () => { diff --git a/packages/pds/tests/entryway-mock.ts b/packages/pds/tests/entryway-mock.ts new file mode 100644 index 00000000000..66fd400c1e7 --- /dev/null +++ b/packages/pds/tests/entryway-mock.ts @@ -0,0 +1,317 @@ +import { createPrivateKey } from 'node:crypto' +import * as http from 'node:http' +import * as plcLib from '@did-plc/lib' +import { HttpTerminator, createHttpTerminator } from 'http-terminator' +import * as jose from 'jose' +import KeyEncoder from 'key-encoder' +import * as ui8 from 'uint8arrays' +import { AtpAgent } from '@atproto/api' +import { getVerificationMaterial } from '@atproto/common' +import { Secp256k1Keypair, randomStr } from '@atproto/crypto' +import { IdResolver, getDidKeyFromMultibase } from '@atproto/identity' +import { DidString, HandleString } from '@atproto/syntax' +import { + AuthRequiredError, + createServer, + parseReqNsid, + verifyJwt as verifyServiceJwt, +} from '@atproto/xrpc-server' +import { bearerTokenFromReq, createPublicKeyObject } from '../src/auth-verifier' +import { com } from '../src/lexicons/index.js' + +interface Account { + did: DidString + handle: HandleString + email?: string +} + +interface MockEntrywayOpts { + port: number + serviceDid: string + plcUrl: string + pdsUrl: string + pdsDid: string + adminPassword: string + jwtSigningKey: Secp256k1Keypair + plcRotationKey: Secp256k1Keypair +} + +type AccessAuthResult = { credentials: { did: string; type: 'access' } } +type ServiceAuthResult = { credentials: { did: string; type: 'service' } } + +export class MockEntryway { + public url: string + public serviceDid: string + public plcRotationKey: Secp256k1Keypair + public idResolver: IdResolver + + private server: http.Server + private terminator: HttpTerminator + private accounts = new Map() + + private constructor( + server: http.Server, + terminator: HttpTerminator, + idResolver: IdResolver, + opts: MockEntrywayOpts, + ) { + this.server = server + this.terminator = terminator + this.url = `http://localhost:${opts.port}` + this.serviceDid = opts.serviceDid + this.plcRotationKey = opts.plcRotationKey + this.idResolver = idResolver + } + + static async create(opts: MockEntrywayOpts): Promise { + const keyEncoder = new KeyEncoder('secp256k1') + const privateKeyHex = ui8.toString(await opts.jwtSigningKey.export(), 'hex') + const privatePem = keyEncoder.encodePrivate(privateKeyHex, 'raw', 'pem') + const jwtPrivateKey = createPrivateKey({ format: 'pem', key: privatePem }) + const jwtPublicKey = createPublicKeyObject( + opts.jwtSigningKey.publicKeyStr('hex'), + ) + + const plcClient = new plcLib.Client(opts.plcUrl) + const pdsAgent = new AtpAgent({ service: opts.pdsUrl }) + const idResolver = new IdResolver({ plcUrl: opts.plcUrl }) + + const accounts = new Map() + + const getSigningKey = async ( + iss: string, + forceRefresh: boolean, + ): Promise => { + const [did, serviceId] = iss.split('#') + if (serviceId) { + throw new AuthRequiredError('no service id expected in iss claim') + } + const didDoc = await idResolver.did.resolve(did, forceRefresh) + if (!didDoc) { + throw new AuthRequiredError(`could not resolve did: ${did}`) + } + const parsedKey = getVerificationMaterial(didDoc, 'atproto') + if (!parsedKey) { + throw new AuthRequiredError('missing or bad key in did doc') + } + const didKey = getDidKeyFromMultibase(parsedKey) + if (!didKey) { + throw new AuthRequiredError('missing or bad key in did doc') + } + return didKey + } + + const bearerToken = (req: http.IncomingMessage): string => { + const token = bearerTokenFromReq(req) + if (!token) { + throw new AuthRequiredError('missing bearer token') + } + return token + } + + // Auth: verify user access token (typ: 'at+jwt') signed by entryway + const accessAuth = async ({ + req, + }: { + req: http.IncomingMessage + }): Promise => { + try { + const token = bearerToken(req) + const { protectedHeader, payload } = await jose.jwtVerify( + token, + jwtPublicKey, + ) + if (protectedHeader.typ !== 'at+jwt') { + throw new AuthRequiredError('expected typ: at+jwt') + } + if (!payload.sub) { + throw new AuthRequiredError('missing sub in token') + } + return { credentials: { did: payload.sub, type: 'access' } } + } catch (err) { + console.log(err) + throw err + } + } + + // Auth: verify service auth token from PDS (no typ / typ !== 'at+jwt') + const serviceAuth = async ({ + req, + }: { + req: http.IncomingMessage + }): Promise => { + try { + const token = bearerToken(req) + const { typ } = jose.decodeProtectedHeader(token) + if (typ === 'at+jwt') { + throw new AuthRequiredError( + 'expected service auth: typ must not be at+jwt', + ) + } + const nsid = parseReqNsid(req) + const payload = await verifyServiceJwt( + token, + opts.serviceDid, + nsid, + getSigningKey, + ) + return { credentials: { did: payload.iss, type: 'service' } } + } catch (err) { + console.log(err) + throw err + } + } + + // Auth: accept either access token or service auth + const accessOrServiceAuth = async ({ + req, + }: { + req: http.IncomingMessage + }): Promise => { + const token = bearerToken(req) + const { typ } = jose.decodeProtectedHeader(token) + if (typ === 'at+jwt') { + return accessAuth({ req }) + } + return serviceAuth({ req }) + } + + const server = createServer() + + server.add(com.atproto.server.createAccount, { + handler: async ({ input }) => { + const { email, handle } = input.body + + // Reserve a signing key on the PDS + const { + data: { signingKey }, + } = await pdsAgent.com.atproto.server.reserveSigningKey({}) + + // Create PLC operation + const plcCreate = await plcLib.createOp({ + signingKey, + rotationKeys: [opts.plcRotationKey.did()], + handle, + pds: opts.pdsUrl, + signer: opts.plcRotationKey, + }) + + // Create account on PDS (no auth needed — userServiceAuthOptional) + await pdsAgent.com.atproto.server.createAccount({ + did: plcCreate.did, + handle, + plcOp: plcCreate.op, + }) + + // Store account in memory + accounts.set(plcCreate.did, { + did: plcCreate.did as DidString, + handle, + email, + }) + + // Sign access + refresh JWTs + const now = Math.floor(Date.now() / 1000) + const accessJwt = await new jose.SignJWT({ + scope: 'com.atproto.access', + }) + .setProtectedHeader({ alg: 'ES256K', typ: 'at+jwt' }) + .setSubject(plcCreate.did) + .setAudience(opts.pdsDid) + .setIssuedAt(now) + .setExpirationTime(now + 60 * 60) + .setJti(randomStr(16, 'base32')) + .sign(jwtPrivateKey) + + const refreshJwt = await new jose.SignJWT({ + scope: 'com.atproto.refresh', + }) + .setProtectedHeader({ alg: 'ES256K', typ: 'at+jwt' }) + .setSubject(plcCreate.did) + .setAudience(opts.pdsDid) + .setIssuedAt(now) + .setExpirationTime(now + 90 * 24 * 60 * 60) + .setJti(randomStr(16, 'base32')) + .sign(jwtPrivateKey) + + return { + encoding: 'application/json' as const, + body: { + did: plcCreate.did as DidString, + handle, + accessJwt, + refreshJwt, + }, + } + }, + }) + + server.add(com.atproto.server.getSession, { + auth: accessOrServiceAuth, + handler: async ({ auth }) => { + const account = accounts.get(auth.credentials.did) + if (!account) { + throw new Error( + `Could not find account for DID: ${auth.credentials.did}`, + ) + } + return { + encoding: 'application/json' as const, + body: { + did: account.did, + handle: account.handle, + email: account.email, + emailConfirmed: false, + }, + } + }, + }) + + server.add(com.atproto.identity.updateHandle, { + auth: serviceAuth, + handler: async ({ auth, input }) => { + // The PDS sends { did, handle } where did is the target user + const body = input.body as typeof input.body & { did?: string } + const targetDid = body.did || auth.credentials.did + const newHandle = body.handle + + // Update handle in PLC + await plcClient.updateHandle(targetDid, opts.plcRotationKey, newHandle) + + // Update in-memory account + const account = accounts.get(targetDid) + if (account) { + account.handle = newHandle + } + + // Notify PDS via admin endpoint + const adminAuth = Buffer.from(`admin:${opts.adminPassword}`).toString( + 'base64', + ) + await pdsAgent.com.atproto.admin.updateAccountHandle( + { did: targetDid, handle: newHandle }, + { + headers: { authorization: `Basic ${adminAuth}` }, + encoding: 'application/json', + }, + ) + }, + }) + + const httpServer = server.listen(opts.port) + const terminator = createHttpTerminator({ server: httpServer }) + + const instance = new MockEntryway(httpServer, terminator, idResolver, opts) + instance.accounts = accounts + + return instance + } + + getAccount(did: string): Account | undefined { + return this.accounts.get(did) + } + + async destroy(): Promise { + await this.terminator.terminate() + } +} diff --git a/packages/pds/tests/entryway.test.ts b/packages/pds/tests/entryway.test.ts index d5f2aa43bf8..7a5ea7e49c5 100644 --- a/packages/pds/tests/entryway.test.ts +++ b/packages/pds/tests/entryway.test.ts @@ -1,22 +1,17 @@ import assert from 'node:assert' -import * as os from 'node:os' -import * as path from 'node:path' import * as plcLib from '@did-plc/lib' import getPort from 'get-port' -import { decodeJwt } from 'jose' -import * as ui8 from 'uint8arrays' import { AtpAgent } from '@atproto/api' -import { Secp256k1Keypair, randomStr } from '@atproto/crypto' +import { Secp256k1Keypair } from '@atproto/crypto' import { SeedClient, TestPds, TestPlc, mockResolvers } from '@atproto/dev-env' import { isDidString } from '@atproto/lex' -import * as pdsEntryway from '@atproto/pds-entryway' import { DidString } from '@atproto/syntax' -import { parseReqNsid } from '@atproto/xrpc-server' +import { MockEntryway } from './entryway-mock' describe('entryway', () => { let plc: TestPlc let pds: TestPds - let entryway: pdsEntryway.PDS + let entryway: MockEntryway let pdsAgent: AtpAgent let entrywayAgent: AtpAgent let alice: DidString @@ -30,7 +25,7 @@ describe('entryway', () => { pds = await TestPds.create({ entrywayUrl: `http://localhost:${entrywayPort}`, entrywayDid: 'did:example:entryway', - entrywayJwtVerifyKeyK256PublicKeyHex: getPublicHex(jwtSigningKey), + entrywayJwtVerifyKeyK256PublicKeyHex: jwtSigningKey.publicKeyStr('hex'), entrywayPlcRotationKey: plcRotationKey.did(), adminPassword: 'admin-pass', serviceHandleDomains: [], @@ -38,29 +33,21 @@ describe('entryway', () => { serviceDid: 'did:example:pds', inviteRequired: false, }) - entryway = await createEntryway({ - dbPostgresSchema: 'entryway', + entryway = await MockEntryway.create({ port: entrywayPort, - adminPassword: 'admin-pass', - jwtSigningKeyK256PrivateKeyHex: await getPrivateHex(jwtSigningKey), - plcRotationKeyK256PrivateKeyHex: await getPrivateHex(plcRotationKey), - inviteRequired: false, serviceDid: 'did:example:entryway', - didPlcUrl: plc.url, + plcUrl: plc.url, + pdsUrl: pds.url, + pdsDid: 'did:example:pds', + adminPassword: 'admin-pass', + jwtSigningKey, + plcRotationKey, }) mockResolvers(pds.ctx.idResolver, pds) - mockResolvers(entryway.ctx.idResolver, pds) - await entryway.ctx.db.db - .insertInto('pds') - .values({ - did: pds.ctx.cfg.service.did, - host: new URL(pds.ctx.cfg.service.publicUrl).host, - weight: 1, - }) - .execute() + mockResolvers(entryway.idResolver, pds) pdsAgent = pds.getAgent() entrywayAgent = new AtpAgent({ - service: entryway.ctx.cfg.service.publicUrl, + service: entryway.url, }) }) @@ -110,9 +97,7 @@ describe('entryway', () => { const doc = await pds.ctx.idResolver.did.resolve(alice) const handleToDid = await pds.ctx.idResolver.handle.resolve('alice2.test') const accountFromPds = await pds.ctx.accountManager.getAccount(alice) - const accountFromEntryway = await entryway.ctx.services - .account(entryway.ctx.db) - .getAccount(alice) + const accountFromEntryway = entryway.getAccount(alice) expect(doc?.alsoKnownAs).toEqual(['at://alice2.test']) expect(handleToDid).toEqual(alice) expect(accountFromPds?.handle).toEqual('alice2.test') @@ -128,13 +113,10 @@ describe('entryway', () => { 'com.atproto.identity.updateHandle', ), ) - const doc = await entryway.ctx.idResolver.did.resolve(alice) - const handleToDid = - await entryway.ctx.idResolver.handle.resolve('alice3.test') + const doc = await entryway.idResolver.did.resolve(alice) + const handleToDid = await entryway.idResolver.handle.resolve('alice3.test') const accountFromPds = await pds.ctx.accountManager.getAccount(alice) - const accountFromEntryway = await entryway.ctx.services - .account(entryway.ctx.db) - .getAccount(alice) + const accountFromEntryway = entryway.getAccount(alice) expect(doc?.alsoKnownAs).toEqual(['at://alice3.test']) expect(handleToDid).toEqual(alice) expect(accountFromPds?.handle).toEqual('alice3.test') @@ -148,7 +130,7 @@ describe('entryway', () => { const rotationKey = await Secp256k1Keypair.create() const plcCreate = await plcLib.createOp({ signingKey, - rotationKeys: [rotationKey.did(), entryway.ctx.plcRotationKey.did()], + rotationKeys: [rotationKey.did(), entryway.plcRotationKey.did()], handle: 'weirdalice.test', pds: pds.ctx.cfg.service.publicUrl, signer: rotationKey, @@ -161,67 +143,3 @@ describe('entryway', () => { await expect(tryCreateAccount).rejects.toThrow('invalid plc operation') }) }) - -const createEntryway = async ( - config: pdsEntryway.ServerEnvironment & { - adminPassword: string - jwtSigningKeyK256PrivateKeyHex: string - plcRotationKeyK256PrivateKeyHex: string - }, -) => { - const signingKey = await Secp256k1Keypair.create({ exportable: true }) - const recoveryKey = await Secp256k1Keypair.create({ exportable: true }) - const env: pdsEntryway.ServerEnvironment = { - isEntryway: true, - recoveryDidKey: recoveryKey.did(), - serviceHandleDomains: ['.test'], - dbPostgresUrl: process.env.DB_POSTGRES_URL, - blobstoreDiskLocation: path.join(os.tmpdir(), randomStr(8, 'base32')), - bskyAppViewUrl: 'https://appview.invalid', - bskyAppViewDid: 'did:example:invalid', - bskyAppViewCdnUrlPattern: 'http://cdn.appview.com/%s/%s/%s', - jwtSecret: randomStr(8, 'base32'), - repoSigningKeyK256PrivateKeyHex: await getPrivateHex(signingKey), - modServiceUrl: 'https://mod.invalid', - modServiceDid: 'did:example:invalid', - ...config, - } - const cfg = pdsEntryway.envToCfg(env) - const secrets = pdsEntryway.envToSecrets(env) - const server = await pdsEntryway.PDS.create(cfg, secrets) - await server.ctx.db.migrateToLatestOrThrow() - await server.start() - // patch entryway access token verification to handle internal service auth pds -> entryway - const origValidateAccessToken = - server.ctx.authVerifier.validateAccessToken.bind(server.ctx.authVerifier) - server.ctx.authVerifier.validateAccessToken = async (req, scopes) => { - const jwt = req.headers.authorization?.replace('Bearer ', '') ?? '' - const claims = decodeJwt(jwt) - if (claims.aud === 'did:example:entryway') { - assert(claims.lxm === parseReqNsid(req), 'bad lxm claim in service auth') - assert(claims.aud, 'missing aud claim in service auth') - assert(claims.iss, 'missing iss claim in service auth') - return { - artifacts: jwt, - credentials: { - type: 'access', - scope: 'com.atproto.access' as any, - audience: claims.aud, - did: claims.iss, - }, - } - } - return origValidateAccessToken(req, scopes) - } - // @TODO temp hack because entryway teardown calls signupActivator.run() by mistake - server.ctx.signupActivator.run = server.ctx.signupActivator.destroy - return server -} - -const getPublicHex = (key: Secp256k1Keypair) => { - return key.publicKeyStr('hex') -} - -const getPrivateHex = async (key: Secp256k1Keypair) => { - return ui8.toString(await key.export(), 'hex') -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7a7f9762a5..a2439cb63da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1904,9 +1904,6 @@ importers: '@atproto/oauth-client-browser-example': specifier: workspace:^ version: link:../oauth/oauth-client-browser-example - '@atproto/pds-entryway': - specifier: npm:@atproto/pds@0.3.0-entryway.3 - version: /@atproto/pds@0.3.0-entryway.3 '@did-plc/server': specifier: ^0.0.1 version: 0.0.1 @@ -2290,59 +2287,6 @@ packages: one-webcrypto: 1.0.3 uint8arrays: 3.0.0 - /@atproto/pds@0.3.0-entryway.3: - resolution: {integrity: sha512-hc/KcBgFjSfrnNgrc9vx/QaCov79cXbRRQEWrAt/rdMLhcFEGCydN7ukddjOiLkLdhDqywSHrLOEbqg+MReQXw==} - dependencies: - '@atproto/api': link:packages/api - '@atproto/aws': link:packages/aws - '@atproto/common': link:packages/common - '@atproto/crypto': link:packages/crypto - '@atproto/identity': link:packages/identity - '@atproto/lexicon': link:packages/lexicon - '@atproto/repo': link:packages/repo - '@atproto/syntax': link:packages/syntax - '@atproto/xrpc': link:packages/xrpc - '@atproto/xrpc-server': link:packages/xrpc-server - '@bufbuild/protobuf': 1.6.0 - '@connectrpc/connect': 1.3.0(@bufbuild/protobuf@1.6.0) - '@connectrpc/connect-node': 1.3.0(@bufbuild/protobuf@1.6.0)(@connectrpc/connect@1.3.0) - '@did-plc/lib': 0.0.1 - better-sqlite3: 9.6.0 - bytes: 3.1.2 - compression: 1.7.4 - cors: 2.8.5 - disposable-email: 0.2.3 - express: 4.18.2 - express-async-errors: 3.1.1(express@4.18.2) - file-type: 16.5.4 - form-data: 4.0.0 - handlebars: 4.7.8 - http-errors: 2.0.0 - http-terminator: 3.2.0 - ioredis: 5.3.2 - jose: 4.15.4 - key-encoder: 2.0.3 - kysely: 0.22.0 - multiformats: 9.9.0 - nodemailer: 6.8.0 - nodemailer-html-to-text: 3.2.0 - p-queue: 6.6.2 - pg: 8.10.0 - pino: 8.21.0 - pino-http: 8.6.1 - rate-limiter-flexible: 2.4.1 - sharp: 0.32.6 - twilio: 4.21.0 - typed-emitter: 2.1.0 - uint8arrays: 3.0.0 - zod: 3.25.76 - transitivePeerDependencies: - - bare-abort-controller - - debug - - pg-native - - supports-color - dev: true - /@aws-crypto/crc32@5.2.0: resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -3344,7 +3288,6 @@ packages: /@babel/helper-validator-identifier@7.28.5: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.25.9: resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} @@ -3400,7 +3343,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.28.5 - dev: true /@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.26.9): resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} @@ -4222,9 +4164,9 @@ packages: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -4249,7 +4191,6 @@ packages: dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - dev: true /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -4581,6 +4522,7 @@ packages: '@bufbuild/protobuf': 1.6.0 '@connectrpc/connect': 1.3.0(@bufbuild/protobuf@1.6.0) undici: 5.28.4 + dev: false /@connectrpc/connect@1.3.0(@bufbuild/protobuf@1.6.0): resolution: {integrity: sha512-kTeWxJnLLtxKc2ZSDN0rIBgwfP8RwcLknthX4AKlIAmN9ZC4gGnCbwp+3BKcP/WH5c8zGBAWqSY3zeqCM+ah7w==} @@ -5634,6 +5576,7 @@ packages: /@fastify/busboy@2.1.0: resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} engines: {node: '>=14'} + dev: false /@fastify/deepmerge@1.3.0: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} @@ -5962,6 +5905,7 @@ packages: /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false /@ipld/dag-cbor@7.0.3: resolution: {integrity: sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA==} @@ -8582,6 +8526,7 @@ packages: /@tokenizer/token@0.3.0: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: false /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -9784,12 +9729,6 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} - requiresBuild: true - dev: true - optional: true - /bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} requiresBuild: true @@ -9801,18 +9740,6 @@ packages: dev: true optional: true - /bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} - requiresBuild: true - dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.3.0 - transitivePeerDependencies: - - bare-abort-controller - dev: true - optional: true - /bare-fs@4.5.4: resolution: {integrity: sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==} engines: {bare: '>=1.16.0'} @@ -9833,12 +9760,6 @@ packages: dev: true optional: true - /bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} - requiresBuild: true - dev: true - optional: true - /bare-os@3.6.2: resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} engines: {bare: '>=1.14.0'} @@ -9846,14 +9767,6 @@ packages: dev: true optional: true - /bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - requiresBuild: true - dependencies: - bare-os: 2.4.4 - dev: true - optional: true - /bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} requiresBuild: true @@ -9862,17 +9775,6 @@ packages: dev: true optional: true - /bare-stream@2.3.0: - resolution: {integrity: sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==} - requiresBuild: true - dependencies: - b4a: 1.6.7 - streamx: 2.20.1 - transitivePeerDependencies: - - bare-abort-controller - dev: true - optional: true - /bare-stream@2.8.0(bare-events@2.8.2): resolution: {integrity: sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==} requiresBuild: true @@ -9945,6 +9847,7 @@ packages: dependencies: bindings: 1.5.0 prebuild-install: 7.1.2 + dev: false /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} @@ -9963,6 +9866,7 @@ packages: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 + dev: false /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -10077,10 +9981,6 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: true - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -10110,6 +10010,7 @@ packages: /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} + dev: false /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -10268,6 +10169,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -10381,6 +10283,7 @@ packages: /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + dev: false /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} @@ -10422,6 +10325,7 @@ packages: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 + dev: false /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} @@ -10434,6 +10338,7 @@ packages: dependencies: color-convert: 2.0.1 color-string: 1.9.1 + dev: false /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -10484,6 +10389,7 @@ packages: engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: false /compression@1.7.4: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} @@ -10498,6 +10404,7 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color + dev: false /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -10704,10 +10611,6 @@ packages: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: true - /dc-polyfill@0.1.3: resolution: {integrity: sha512-Wyk5n/5KUj3GfVKV2jtDbtChC/Ff9fjKsBcg4ZtYW1yQe3DXNHcGURvmoxhqQdfOQ9TwyMjnfyv1lyYcOkFkFA==} engines: {node: '>=12.17'} @@ -10846,6 +10749,7 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 + dev: false /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} @@ -10854,6 +10758,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + dev: false /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -10921,6 +10826,7 @@ packages: /denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} + dev: false /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} @@ -10982,10 +10888,6 @@ packages: resolution: {integrity: sha512-L1cn+cZhKmxUwixH8n+n0HG+WbCz+LF4coyT6yMh930tpkD90ZWFx3A9dHIdFMVM745saaeNGYScIEstm3Y3yg==} dev: false - /disposable-email@0.2.3: - resolution: {integrity: sha512-gkBQQ5Res431ZXqLlAafrXHizG7/1FWmi8U2RTtriD78Vc10HhBUvdJun3R4eSF0KRIQQJs+wHlxjkED/Hr1EQ==} - dev: true - /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -11011,15 +10913,18 @@ packages: domelementtype: 2.3.0 domhandler: 4.3.1 entities: 2.2.0 + dev: false /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} dependencies: domelementtype: 2.3.0 + dev: false /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -11027,6 +10932,7 @@ packages: dom-serializer: 1.4.1 domelementtype: 2.3.0 domhandler: 4.3.1 + dev: false /dotenv-expand@11.0.7: resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} @@ -11068,12 +10974,6 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -11153,6 +11053,7 @@ packages: /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: false /env-editor@0.4.2: resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} @@ -11950,6 +11851,7 @@ packages: /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false /events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} @@ -11992,6 +11894,7 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + dev: false /expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} @@ -12389,9 +12292,11 @@ packages: readable-web-to-node-stream: 3.0.2 strtok3: 6.3.0 token-types: 4.2.1 + dev: false /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -12544,6 +12449,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false /fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} @@ -12746,6 +12652,7 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -12992,6 +12899,7 @@ packages: /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + dev: false /help-me@4.2.0: resolution: {integrity: sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==} @@ -13047,6 +12955,7 @@ packages: he: 1.2.0 htmlparser2: 6.1.0 minimist: 1.2.8 + dev: false /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -13055,6 +12964,7 @@ packages: domhandler: 4.3.1 domutils: 2.8.0 entities: 2.2.0 + dev: false /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -13245,6 +13155,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false /inquirer@7.3.3: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} @@ -13308,6 +13219,7 @@ packages: standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color + dev: false /ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} @@ -13351,6 +13263,7 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} @@ -14350,37 +14263,6 @@ packages: graceful-fs: 4.2.11 dev: true - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.6.3 - dev: true - - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - dev: true - - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - dev: true - /key-encoder@2.0.3: resolution: {integrity: sha512-fgBtpAGIr/Fy5/+ZLQZIPPhsZEcbSlYu/Wu96tNDFNSjSACw5lEIOFeaVdQ/iwrb8oxjlWi6wmWdH76hV6GZjg==} dependencies: @@ -14401,6 +14283,7 @@ packages: /kysely@0.22.0: resolution: {integrity: sha512-ZE3qWtnqLOalodzfK5QUEcm7AEulhxsPNuKaGFsC3XiqO92vMLm+mAHk/NnbSIOtC4RmGm0nsv700i8KDp1gfQ==} engines: {node: '>=14.0.0'} + dev: false /kysely@0.23.5: resolution: {integrity: sha512-TH+b56pVXQq0tsyooYLeNfV11j6ih7D50dyN8tkM0e7ndiUH28Nziojiog3qRFlmEj9XePYdZUrNJ2079Qjdow==} @@ -14712,6 +14595,7 @@ packages: /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false /lodash.flow@3.5.0: resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} @@ -14722,32 +14606,9 @@ packages: deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. dev: true - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: true - /lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: true - - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: true - - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: true - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true - - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: true + dev: false /lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} @@ -14757,10 +14618,6 @@ packages: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: true - /lodash.pick@4.4.0: resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} dev: false @@ -15407,6 +15264,7 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + dev: false /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -15522,6 +15380,7 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} @@ -15593,6 +15452,7 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -15619,6 +15479,7 @@ packages: engines: {node: '>=10'} dependencies: semver: 7.6.3 + dev: false /node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} @@ -15626,6 +15487,7 @@ packages: /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -15688,10 +15550,12 @@ packages: engines: {node: '>= 10.23.0'} dependencies: html-to-text: 7.1.1 + dev: false /nodemailer@6.8.0: resolution: {integrity: sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ==} engines: {node: '>=6.0.0'} + dev: false /nopt@6.0.0: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} @@ -15837,6 +15701,7 @@ packages: /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} + dev: false /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -16004,6 +15869,7 @@ packages: dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 + dev: false /p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} @@ -16159,6 +16025,7 @@ packages: /peek-readable@4.1.0: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} + dev: false /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -16414,6 +16281,7 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 + dev: false /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -16707,10 +16575,6 @@ packages: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -16734,6 +16598,7 @@ packages: /rate-limiter-flexible@2.4.1: resolution: {integrity: sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g==} + dev: false /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} @@ -16752,6 +16617,7 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + dev: false /react-base16-styling@0.6.0: resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} @@ -17001,6 +16867,7 @@ packages: engines: {node: '>=8'} dependencies: readable-stream: 3.6.2 + dev: false /readdirp@3.5.0: resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} @@ -17016,12 +16883,14 @@ packages: /redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} + dev: false /redis-parser@3.0.0: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} dependencies: redis-errors: 1.2.0 + dev: false /reflect.getprototypeof@1.0.8: resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} @@ -17125,10 +16994,6 @@ packages: resolve: 1.7.1 dev: false - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -17314,6 +17179,7 @@ packages: requiresBuild: true dependencies: tslib: 2.8.1 + dev: false optional: true /safe-array-concat@1.0.1: @@ -17338,6 +17204,7 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -17379,10 +17246,6 @@ packages: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} dev: false - /scmp@2.1.0: - resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} - dev: true - /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: true @@ -17539,23 +17402,6 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - requiresBuild: true - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.3 - simple-get: 4.0.1 - tar-fs: 3.0.6 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-abort-controller - dev: true - /sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -17625,6 +17471,7 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} @@ -17632,6 +17479,7 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + dev: false /simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -17645,6 +17493,7 @@ packages: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 + dev: false /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -17815,6 +17664,7 @@ packages: /standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false /statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} @@ -17984,6 +17834,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + dev: false /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -18000,6 +17851,7 @@ packages: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 4.1.0 + dev: false /structured-headers@0.4.1: resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} @@ -18077,18 +17929,7 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - - /tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} - dependencies: - pump: 3.0.0 - tar-stream: 3.1.6 - optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 - transitivePeerDependencies: - - bare-abort-controller - dev: true + dev: false /tar-fs@3.1.1: resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} @@ -18112,6 +17953,7 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 + dev: false /tar-stream@3.1.6: resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} @@ -18296,6 +18138,7 @@ packages: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + dev: false /toygrad@2.6.0: resolution: {integrity: sha512-g4zBmlSbvzOE5FOILxYkAybTSxijKLkj1WoNqVGnbMcWDyj4wWQ+eYSr3ik7XOpIgMq/7eBcPRTJX3DM2E0YMg==} @@ -18391,23 +18234,7 @@ packages: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 - - /twilio@4.21.0: - resolution: {integrity: sha512-+meDbJPOxs6vEysJ7xX7XMn6FLKmZFSeVzMKjzN9NWgDXssp713Kf1ukteZlXhnhd7/NtNiUv5OU17qVgBb/BQ==} - engines: {node: '>=14.0'} - dependencies: - axios: 1.6.7 - dayjs: 1.11.10 - https-proxy-agent: 5.0.1 - jsonwebtoken: 9.0.2 - qs: 6.11.0 - scmp: 2.1.0 - url-parse: 1.5.10 - xmlbuilder: 13.0.2 - transitivePeerDependencies: - - debug - - supports-color - dev: true + dev: false /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -18532,6 +18359,7 @@ packages: resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} optionalDependencies: rxjs: 7.8.2 + dev: false /typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} @@ -18612,6 +18440,7 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.0 + dev: false /undici@6.19.8: resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} @@ -18709,13 +18538,6 @@ packages: dependencies: punycode: 2.3.0 - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - /use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -19211,11 +19033,6 @@ packages: engines: {node: '>=4.0'} dev: false - /xmlbuilder@13.0.2: - resolution: {integrity: sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==} - engines: {node: '>=6.0'} - dev: true - /xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} From 087515e6a414aedbf0b7bd36139ed020dc7e0dae Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 29 Apr 2026 15:19:25 +0100 Subject: [PATCH 06/87] Improve oauth client sign-in options (#4896) --- .changeset/funky-pans-swim.md | 5 +++++ .changeset/smart-schools-find.md | 5 +++++ .../src/browser-oauth-client.ts | 14 ++++++++++---- .../src/browser-oauth-database.ts | 4 ++-- .../oauth/oauth-client-expo/src/utils/stores.ts | 2 +- ...oauth-authorization-server-metadata-resolver.ts | 4 ++-- .../oauth-protected-resource-metadata-resolver.ts | 13 +++++++++---- packages/oauth/oauth-client/src/oauth-resolver.ts | 6 +++++- 8 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 .changeset/funky-pans-swim.md create mode 100644 .changeset/smart-schools-find.md diff --git a/.changeset/funky-pans-swim.md b/.changeset/funky-pans-swim.md new file mode 100644 index 00000000000..fa2847160d0 --- /dev/null +++ b/.changeset/funky-pans-swim.md @@ -0,0 +1,5 @@ +--- +'@atproto/oauth-client-browser': patch +--- + +Allow configuring the popupName and popupFeatures diff --git a/.changeset/smart-schools-find.md b/.changeset/smart-schools-find.md new file mode 100644 index 00000000000..d7824017998 --- /dev/null +++ b/.changeset/smart-schools-find.md @@ -0,0 +1,5 @@ +--- +'@atproto/oauth-client': patch +--- + +Allow using an oauth provider (e.g. Entryway) instead of a PDS url to initiate an OAuth sign-in/sign-up diff --git a/packages/oauth/oauth-client-browser/src/browser-oauth-client.ts b/packages/oauth/oauth-client-browser/src/browser-oauth-client.ts index ab85e1d446e..61b6c5a7f56 100644 --- a/packages/oauth/oauth-client-browser/src/browser-oauth-client.ts +++ b/packages/oauth/oauth-client-browser/src/browser-oauth-client.ts @@ -287,13 +287,19 @@ export class BrowserOAuthClient extends OAuthClient implements AsyncDisposable { async signInPopup( input: string, - options?: Omit, + options?: Omit & { + popupName?: string + popupFeatures?: string + }, ): Promise { + const popupTarget = options?.popupName ?? '_blank' + // Open new window asap to prevent popup busting by browsers - const popupFeatures = 'width=600,height=600,menubar=no,toolbar=no' + const popupFeatures = + options?.popupFeatures ?? 'width=600,height=600,menubar=no,toolbar=no' let popup: Window | null = window.open( 'about:blank', - '_blank', + popupTarget, popupFeatures, ) @@ -310,7 +316,7 @@ export class BrowserOAuthClient extends OAuthClient implements AsyncDisposable { if (popup) { popup.window.location.href = url.href } else { - popup = window.open(url.href, '_blank', popupFeatures) + popup = window.open(url.href, popupTarget, popupFeatures) } popup?.focus() diff --git a/packages/oauth/oauth-client-browser/src/browser-oauth-database.ts b/packages/oauth/oauth-client-browser/src/browser-oauth-database.ts index 6f4067ef37b..73b6adec4bc 100644 --- a/packages/oauth/oauth-client-browser/src/browser-oauth-database.ts +++ b/packages/oauth/oauth-client-browser/src/browser-oauth-database.ts @@ -42,7 +42,7 @@ export type Schema = { dpopNonceCache: Item handleCache: Item authorizationServerMetadataCache: Item - protectedResourceMetadataCache: Item + protectedResourceMetadataCache: Item } export type DatabaseStore = SimpleStore @@ -213,7 +213,7 @@ export class BrowserOAuthDatabase { getProtectedResourceMetadataCache(): | undefined - | DatabaseStore { + | DatabaseStore { return this.createStore('protectedResourceMetadataCache', { expiresAt: (_value) => new Date(Date.now() + 60e3), encode: (value) => value, diff --git a/packages/oauth/oauth-client-expo/src/utils/stores.ts b/packages/oauth/oauth-client-expo/src/utils/stores.ts index 523a2808cd2..b38692d3767 100755 --- a/packages/oauth/oauth-client-expo/src/utils/stores.ts +++ b/packages/oauth/oauth-client-expo/src/utils/stores.ts @@ -22,7 +22,7 @@ export class AuthorizationServerMetadataCache extends MMKVSimpleStoreTTL { +export class ProtectedResourceMetadataCache extends MMKVSimpleStoreTTL { constructor() { super({ id: `${MMKV_ID}.protectedResourceMetadata`, diff --git a/packages/oauth/oauth-client/src/oauth-authorization-server-metadata-resolver.ts b/packages/oauth/oauth-client/src/oauth-authorization-server-metadata-resolver.ts index 9f883ea7107..d4a9f7b13b9 100644 --- a/packages/oauth/oauth-client/src/oauth-authorization-server-metadata-resolver.ts +++ b/packages/oauth/oauth-client/src/oauth-authorization-server-metadata-resolver.ts @@ -49,10 +49,10 @@ export class OAuthAuthorizationServerMetadataResolver extends CachedGetter< } async get( - input: string, + input: URL | string, options?: GetCachedOptions, ): Promise { - const issuer = oauthIssuerIdentifierSchema.parse(input) + const issuer = oauthIssuerIdentifierSchema.parse(String(input)) if (!this.allowHttpIssuer && issuer.startsWith('http:')) { throw new TypeError( 'Unsecure issuer URL protocol only allowed in development and test environments', diff --git a/packages/oauth/oauth-client/src/oauth-protected-resource-metadata-resolver.ts b/packages/oauth/oauth-client/src/oauth-protected-resource-metadata-resolver.ts index 5fcf896ba3f..d027877b3f6 100644 --- a/packages/oauth/oauth-client/src/oauth-protected-resource-metadata-resolver.ts +++ b/packages/oauth/oauth-client/src/oauth-protected-resource-metadata-resolver.ts @@ -19,7 +19,7 @@ export type { GetCachedOptions, OAuthProtectedResourceMetadata } export type ProtectedResourceMetadataCache = SimpleStore< string, - OAuthProtectedResourceMetadata + OAuthProtectedResourceMetadata | null > export type OAuthProtectedResourceMetadataResolverConfig = { @@ -31,7 +31,7 @@ export type OAuthProtectedResourceMetadataResolverConfig = { */ export class OAuthProtectedResourceMetadataResolver extends CachedGetter< string, - OAuthProtectedResourceMetadata + OAuthProtectedResourceMetadata | null > { private readonly fetch: Fetch private readonly allowHttpResource: boolean @@ -50,7 +50,7 @@ export class OAuthProtectedResourceMetadataResolver extends CachedGetter< async get( resource: string | URL, options?: GetCachedOptions, - ): Promise { + ): Promise { const { protocol, origin } = new URL(resource) if (protocol !== 'https:' && protocol !== 'http:') { @@ -71,7 +71,7 @@ export class OAuthProtectedResourceMetadataResolver extends CachedGetter< private async fetchMetadata( origin: string, options?: GetCachedOptions, - ): Promise { + ): Promise { const url = new URL(`/.well-known/oauth-protected-resource`, origin) const request = new Request(url, { signal: options?.signal, @@ -82,6 +82,11 @@ export class OAuthProtectedResourceMetadataResolver extends CachedGetter< const response = await this.fetch(request) + if (response.status === 404) { + await cancelBody(response, 'log') + return null + } + // https://www.rfc-editor.org/rfc/rfc9728.html#section-3.2 if (response.status !== 200) { await cancelBody(response, 'log') diff --git a/packages/oauth/oauth-client/src/oauth-resolver.ts b/packages/oauth/oauth-client/src/oauth-resolver.ts index 9c703f34e83..d5335bff174 100644 --- a/packages/oauth/oauth-client/src/oauth-resolver.ts +++ b/packages/oauth/oauth-client/src/oauth-resolver.ts @@ -112,7 +112,7 @@ export class OAuthResolver { } public async getAuthorizationServerMetadata( - issuer: string, + issuer: string | URL, options?: GetCachedOptions, ): Promise { try { @@ -135,6 +135,10 @@ export class OAuthResolver { options, ) + if (!rsMetadata) { + return this.getAuthorizationServerMetadata(pdsUrl, options) + } + // ATPROTO requires one, and only one, authorization server entry if (rsMetadata.authorization_servers?.length !== 1) { throw new OAuthResolverError( From 5af5deff55d7f0027f5fddc0f2b53e330d13b43a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 15:23:54 +0100 Subject: [PATCH 07/87] Version packages (#4881) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/breezy-dolls-throw.md | 6 ------ .changeset/fancy-ears-train.md | 5 ----- .changeset/funky-pans-swim.md | 5 ----- .changeset/smart-schools-find.md | 5 ----- packages/oauth/oauth-client-browser/CHANGELOG.md | 9 +++++++++ packages/oauth/oauth-client-browser/package.json | 2 +- packages/oauth/oauth-client/CHANGELOG.md | 6 ++++++ packages/oauth/oauth-client/package.json | 2 +- packages/oauth/oauth-provider-ui/CHANGELOG.md | 6 ++++++ packages/oauth/oauth-provider-ui/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 9 +++++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/pds/CHANGELOG.md | 9 +++++++++ packages/pds/package.json | 2 +- 14 files changed, 44 insertions(+), 26 deletions(-) delete mode 100644 .changeset/breezy-dolls-throw.md delete mode 100644 .changeset/fancy-ears-train.md delete mode 100644 .changeset/funky-pans-swim.md delete mode 100644 .changeset/smart-schools-find.md diff --git a/.changeset/breezy-dolls-throw.md b/.changeset/breezy-dolls-throw.md deleted file mode 100644 index e4fd6f98e76..00000000000 --- a/.changeset/breezy-dolls-throw.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@atproto/oauth-provider-ui': patch -'@atproto/oauth-provider': patch ---- - -Fix `/.well-known/change-password` page diff --git a/.changeset/fancy-ears-train.md b/.changeset/fancy-ears-train.md deleted file mode 100644 index f2dd4176a20..00000000000 --- a/.changeset/fancy-ears-train.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/pds': patch ---- - -Remove legacy JWT typ check. diff --git a/.changeset/funky-pans-swim.md b/.changeset/funky-pans-swim.md deleted file mode 100644 index fa2847160d0..00000000000 --- a/.changeset/funky-pans-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/oauth-client-browser': patch ---- - -Allow configuring the popupName and popupFeatures diff --git a/.changeset/smart-schools-find.md b/.changeset/smart-schools-find.md deleted file mode 100644 index d7824017998..00000000000 --- a/.changeset/smart-schools-find.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/oauth-client': patch ---- - -Allow using an oauth provider (e.g. Entryway) instead of a PDS url to initiate an OAuth sign-in/sign-up diff --git a/packages/oauth/oauth-client-browser/CHANGELOG.md b/packages/oauth/oauth-client-browser/CHANGELOG.md index a245a07be0c..2a470ff9a18 100644 --- a/packages/oauth/oauth-client-browser/CHANGELOG.md +++ b/packages/oauth/oauth-client-browser/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/oauth-client-browser +## 0.3.42 + +### Patch Changes + +- [#4896](https://github.com/bluesky-social/atproto/pull/4896) [`087515e`](https://github.com/bluesky-social/atproto/commit/087515e6a414aedbf0b7bd36139ed020dc7e0dae) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Allow configuring the popupName and popupFeatures + +- Updated dependencies [[`087515e`](https://github.com/bluesky-social/atproto/commit/087515e6a414aedbf0b7bd36139ed020dc7e0dae)]: + - @atproto/oauth-client@0.6.1 + ## 0.3.41 ### Patch Changes diff --git a/packages/oauth/oauth-client-browser/package.json b/packages/oauth/oauth-client-browser/package.json index cddf1fd1f95..a041b23c8dd 100644 --- a/packages/oauth/oauth-client-browser/package.json +++ b/packages/oauth/oauth-client-browser/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-browser", - "version": "0.3.41", + "version": "0.3.42", "license": "MIT", "description": "ATPROTO OAuth client for the browser (relies on WebCrypto & Indexed DB)", "keywords": [ diff --git a/packages/oauth/oauth-client/CHANGELOG.md b/packages/oauth/oauth-client/CHANGELOG.md index 70697d75b33..349f5467bb8 100644 --- a/packages/oauth/oauth-client/CHANGELOG.md +++ b/packages/oauth/oauth-client/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/oauth-client +## 0.6.1 + +### Patch Changes + +- [#4896](https://github.com/bluesky-social/atproto/pull/4896) [`087515e`](https://github.com/bluesky-social/atproto/commit/087515e6a414aedbf0b7bd36139ed020dc7e0dae) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Allow using an oauth provider (e.g. Entryway) instead of a PDS url to initiate an OAuth sign-in/sign-up + ## 0.6.0 ### Minor Changes diff --git a/packages/oauth/oauth-client/package.json b/packages/oauth/oauth-client/package.json index e6d76a4865a..44798abe8ab 100644 --- a/packages/oauth/oauth-client/package.json +++ b/packages/oauth/oauth-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client", - "version": "0.6.0", + "version": "0.6.1", "license": "MIT", "description": "OAuth client for ATPROTO PDS. This package serves as common base for environment-specific implementations (NodeJS, Browser, React-Native).", "keywords": [ diff --git a/packages/oauth/oauth-provider-ui/CHANGELOG.md b/packages/oauth/oauth-provider-ui/CHANGELOG.md index 397a80a4969..20d0e687735 100644 --- a/packages/oauth/oauth-provider-ui/CHANGELOG.md +++ b/packages/oauth/oauth-provider-ui/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/oauth-provider-ui +## 0.5.2 + +### Patch Changes + +- [#4880](https://github.com/bluesky-social/atproto/pull/4880) [`5d3e248`](https://github.com/bluesky-social/atproto/commit/5d3e248c262f45e3ca471d8d2381830a4cd896ae) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix `/.well-known/change-password` page + ## 0.5.1 ### Patch Changes diff --git a/packages/oauth/oauth-provider-ui/package.json b/packages/oauth/oauth-provider-ui/package.json index b42b0f51e4f..86bb1e23bc1 100644 --- a/packages/oauth/oauth-provider-ui/package.json +++ b/packages/oauth/oauth-provider-ui/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider-ui", - "version": "0.5.1", + "version": "0.5.2", "license": "MIT", "description": "Sign-in & Sign-up UI for the @atproto/oauth-provider", "homepage": "https://atproto.com", diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 37b86a94c99..fe3816c1de7 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/oauth-provider +## 0.16.3 + +### Patch Changes + +- [#4880](https://github.com/bluesky-social/atproto/pull/4880) [`5d3e248`](https://github.com/bluesky-social/atproto/commit/5d3e248c262f45e3ca471d8d2381830a4cd896ae) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix `/.well-known/change-password` page + +- Updated dependencies [[`5d3e248`](https://github.com/bluesky-social/atproto/commit/5d3e248c262f45e3ca471d8d2381830a4cd896ae)]: + - @atproto/oauth-provider-ui@0.5.2 + ## 0.16.2 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 26171ad8bdb..5e6bfc3043d 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.16.2", + "version": "0.16.3", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index b4a0f5ee4ed..6ac271c6af1 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/pds +## 0.4.221 + +### Patch Changes + +- [#4757](https://github.com/bluesky-social/atproto/pull/4757) [`877e629`](https://github.com/bluesky-social/atproto/commit/877e6293b93b2c32342b2023ab4f0c0e1cce643a) Thanks [@devinivy](https://github.com/devinivy)! - Remove legacy JWT typ check. + +- Updated dependencies [[`5d3e248`](https://github.com/bluesky-social/atproto/commit/5d3e248c262f45e3ca471d8d2381830a4cd896ae)]: + - @atproto/oauth-provider@0.16.3 + ## 0.4.220 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 3664e89fef9..10f1f8267c6 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.220", + "version": "0.4.221", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ From 3f1cb5374cec92b4422bbb9a7d6f06dba77396ae Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 4 May 2026 15:25:30 -0300 Subject: [PATCH 08/87] update chat lexicons and permission-set (#4903) --- .changeset/shy-books-crash.md | 5 +++++ lexicons/chat/bsky/authFullChatClient.json | 19 ++++++++++++++++++- lexicons/chat/bsky/convo/defs.json | 6 +++++- packages/api/src/client/lexicons.ts | 6 +++++- .../src/client/types/chat/bsky/convo/defs.ts | 1 + packages/ozone/src/lexicon/lexicons.ts | 6 +++++- .../src/lexicon/types/chat/bsky/convo/defs.ts | 1 + 7 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 .changeset/shy-books-crash.md diff --git a/.changeset/shy-books-crash.md b/.changeset/shy-books-crash.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/shy-books-crash.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/authFullChatClient.json b/lexicons/chat/bsky/authFullChatClient.json index 97867680b31..4593bd03e22 100644 --- a/lexicons/chat/bsky/authFullChatClient.json +++ b/lexicons/chat/bsky/authFullChatClient.json @@ -24,17 +24,34 @@ "chat.bsky.convo.getConvo", "chat.bsky.convo.getConvoAvailability", "chat.bsky.convo.getConvoForMembers", + "chat.bsky.convo.getConvoMembers", "chat.bsky.convo.getLog", "chat.bsky.convo.getMessages", "chat.bsky.convo.leaveConvo", + "chat.bsky.convo.listConvoRequests", "chat.bsky.convo.listConvos", + "chat.bsky.convo.lockConvo", "chat.bsky.convo.muteConvo", "chat.bsky.convo.removeReaction", "chat.bsky.convo.sendMessage", "chat.bsky.convo.sendMessageBatch", + "chat.bsky.convo.unlockConvo", "chat.bsky.convo.unmuteConvo", "chat.bsky.convo.updateAllRead", - "chat.bsky.convo.updateRead" + "chat.bsky.convo.updateRead", + "chat.bsky.group.addMembers", + "chat.bsky.group.approveJoinRequest", + "chat.bsky.group.createGroup", + "chat.bsky.group.createJoinLink", + "chat.bsky.group.disableJoinLink", + "chat.bsky.group.editGroup", + "chat.bsky.group.editJoinLink", + "chat.bsky.group.enableJoinLink", + "chat.bsky.group.getGroupPublicInfo", + "chat.bsky.group.listJoinRequests", + "chat.bsky.group.rejectJoinRequest", + "chat.bsky.group.removeMembers", + "chat.bsky.group.requestJoin" ] }, { diff --git a/lexicons/chat/bsky/convo/defs.json b/lexicons/chat/bsky/convo/defs.json index e7ac9be926f..dc73ba4223a 100644 --- a/lexicons/chat/bsky/convo/defs.json +++ b/lexicons/chat/bsky/convo/defs.json @@ -332,7 +332,7 @@ "groupConvo": { "description": "[NOTE: This is under active development and should be considered unstable while this note is here].", "type": "object", - "required": ["name", "lockStatus", "memberCount"], + "required": ["name", "lockStatus", "memberCount", "createdAt"], "properties": { "name": { "type": "string", @@ -344,6 +344,10 @@ "type": "integer", "description": "The total number of members in the group conversation." }, + "createdAt": { + "type": "string", + "format": "datetime" + }, "joinLink": { "type": "ref", "ref": "chat.bsky.group.defs#joinLinkView" diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index a2dc102bd80..b6e99f00752 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -10356,7 +10356,7 @@ export const schemaDict = { description: '[NOTE: This is under active development and should be considered unstable while this note is here].', type: 'object', - required: ['name', 'lockStatus', 'memberCount'], + required: ['name', 'lockStatus', 'memberCount', 'createdAt'], properties: { name: { type: 'string', @@ -10369,6 +10369,10 @@ export const schemaDict = { description: 'The total number of members in the group conversation.', }, + createdAt: { + type: 'string', + format: 'datetime', + }, joinLink: { type: 'ref', ref: 'lex:chat.bsky.group.defs#joinLinkView', diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index e340fe0c6fb..090889a1242 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -512,6 +512,7 @@ export interface GroupConvo { name: string /** The total number of members in the group conversation. */ memberCount: number + createdAt: string joinLink?: ChatBskyGroupDefs.JoinLinkView lockStatus: ConvoLockStatus } diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index ffa031a34e3..f66b4d2397c 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -10356,7 +10356,7 @@ export const schemaDict = { description: '[NOTE: This is under active development and should be considered unstable while this note is here].', type: 'object', - required: ['name', 'lockStatus', 'memberCount'], + required: ['name', 'lockStatus', 'memberCount', 'createdAt'], properties: { name: { type: 'string', @@ -10369,6 +10369,10 @@ export const schemaDict = { description: 'The total number of members in the group conversation.', }, + createdAt: { + type: 'string', + format: 'datetime', + }, joinLink: { type: 'ref', ref: 'lex:chat.bsky.group.defs#joinLinkView', diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts index e340fe0c6fb..090889a1242 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts @@ -512,6 +512,7 @@ export interface GroupConvo { name: string /** The total number of members in the group conversation. */ memberCount: number + createdAt: string joinLink?: ChatBskyGroupDefs.JoinLinkView lockStatus: ConvoLockStatus } From 16c1c9bbc7b5054c81aaa3ac4265f2933ae3ed81 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 13:14:53 -0700 Subject: [PATCH 09/87] Version packages (#4904) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/shy-books-crash.md | 5 ----- packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/shy-books-crash.md diff --git a/.changeset/shy-books-crash.md b/.changeset/shy-books-crash.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/shy-books-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index e6dc7a6b5c2..9749c8a7705 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.19.12 + +### Patch Changes + +- [#4903](https://github.com/bluesky-social/atproto/pull/4903) [`3f1cb53`](https://github.com/bluesky-social/atproto/commit/3f1cb5374cec92b4422bbb9a7d6f06dba77396ae) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + ## 0.19.11 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 1ab6fb26599..4786a5cb0ad 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.11", + "version": "0.19.12", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ From 2879b56a04d37fc93d5afb51cf6131fb7c156b85 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 5 May 2026 10:33:47 -0300 Subject: [PATCH 10/87] update chat lexicons (#4906) --- .changeset/better-rooms-watch.md | 5 ++++ lexicons/chat/bsky/convo/defs.json | 28 +++++++++++++++++-- packages/api/src/client/lexicons.ts | 27 ++++++++++++++++++ .../src/client/types/chat/bsky/convo/defs.ts | 6 ++++ packages/ozone/src/lexicon/lexicons.ts | 27 ++++++++++++++++++ .../src/lexicon/types/chat/bsky/convo/defs.ts | 6 ++++ 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 .changeset/better-rooms-watch.md diff --git a/.changeset/better-rooms-watch.md b/.changeset/better-rooms-watch.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/better-rooms-watch.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/convo/defs.json b/lexicons/chat/bsky/convo/defs.json index dc73ba4223a..930de279d14 100644 --- a/lexicons/chat/bsky/convo/defs.json +++ b/lexicons/chat/bsky/convo/defs.json @@ -414,6 +414,14 @@ "message": { "type": "union", "refs": ["#messageView", "#deletedMessageView"] + }, + "relatedProfiles": { + "description": "Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } } } }, @@ -454,7 +462,15 @@ "type": "union", "refs": ["#messageView", "#deletedMessageView"] }, - "reaction": { "type": "ref", "ref": "#reactionView" } + "reaction": { "type": "ref", "ref": "#reactionView" }, + "relatedProfiles": { + "description": "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } + } } }, "logRemoveReaction": { @@ -468,7 +484,15 @@ "type": "union", "refs": ["#messageView", "#deletedMessageView"] }, - "reaction": { "type": "ref", "ref": "#reactionView" } + "reaction": { "type": "ref", "ref": "#reactionView" }, + "relatedProfiles": { + "description": "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.actor.defs#profileViewBasic" + } + } } }, "logReadConvo": { diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index b6e99f00752..f471806e3d4 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -10473,6 +10473,15 @@ export const schemaDict = { 'lex:chat.bsky.convo.defs#deletedMessageView', ], }, + relatedProfiles: { + description: + "Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present.", + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logDeleteMessage: { @@ -10540,6 +10549,15 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#reactionView', }, + relatedProfiles: { + description: + "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logRemoveReaction: { @@ -10564,6 +10582,15 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#reactionView', }, + relatedProfiles: { + description: + "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logReadConvo: { diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index 090889a1242..092bc5b9a0c 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -618,6 +618,8 @@ export interface LogCreateMessage { rev: string convoId: string message: $Typed | $Typed | { $type: string } + /** Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogCreateMessage = 'logCreateMessage' @@ -677,6 +679,8 @@ export interface LogAddReaction { convoId: string message: $Typed | $Typed | { $type: string } reaction: ReactionView + /** Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogAddReaction = 'logAddReaction' @@ -696,6 +700,8 @@ export interface LogRemoveReaction { convoId: string message: $Typed | $Typed | { $type: string } reaction: ReactionView + /** Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogRemoveReaction = 'logRemoveReaction' diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index f66b4d2397c..1c26b158db0 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -10473,6 +10473,15 @@ export const schemaDict = { 'lex:chat.bsky.convo.defs#deletedMessageView', ], }, + relatedProfiles: { + description: + "Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present.", + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logDeleteMessage: { @@ -10540,6 +10549,15 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#reactionView', }, + relatedProfiles: { + description: + "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logRemoveReaction: { @@ -10564,6 +10582,15 @@ export const schemaDict = { type: 'ref', ref: 'lex:chat.bsky.convo.defs#reactionView', }, + relatedProfiles: { + description: + "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.actor.defs#profileViewBasic', + }, + }, }, }, logReadConvo: { diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts index 090889a1242..092bc5b9a0c 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts @@ -618,6 +618,8 @@ export interface LogCreateMessage { rev: string convoId: string message: $Typed | $Typed | { $type: string } + /** Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogCreateMessage = 'logCreateMessage' @@ -677,6 +679,8 @@ export interface LogAddReaction { convoId: string message: $Typed | $Typed | { $type: string } reaction: ReactionView + /** Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogAddReaction = 'logAddReaction' @@ -696,6 +700,8 @@ export interface LogRemoveReaction { convoId: string message: $Typed | $Typed | { $type: string } reaction: ReactionView + /** Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present. */ + relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] } const hashLogRemoveReaction = 'logRemoveReaction' From 02b8b32d2fd57ade330d18fbfc8d0d25ed95e476 Mon Sep 17 00:00:00 2001 From: Whyrusleeping Date: Tue, 5 May 2026 16:50:05 +0100 Subject: [PATCH 11/87] Blur media on account level adult labels (#4769) * Blur media on account level adult labels * WIP blur more * Update defs * Update tests * Changeset * Delete artifacts --------- Co-authored-by: Eric Bailey --- .changeset/social-wombats-stand.md | 5 + packages/api/definitions/labels.json | 24 +- packages/api/src/moderation/const/labels.ts | 241 ++++++++++++++++++ .../api/tests/moderation-behaviors.test.ts | 33 ++- 4 files changed, 292 insertions(+), 11 deletions(-) create mode 100644 .changeset/social-wombats-stand.md create mode 100644 packages/api/src/moderation/const/labels.ts diff --git a/.changeset/social-wombats-stand.md b/.changeset/social-wombats-stand.md new file mode 100644 index 00000000000..ed83028676d --- /dev/null +++ b/.changeset/social-wombats-stand.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +Update blur behaviors to be more comprehensive and cover more surfaces. diff --git a/packages/api/definitions/labels.json b/packages/api/definitions/labels.json index 7252f406333..b404889bb23 100644 --- a/packages/api/definitions/labels.json +++ b/packages/api/definitions/labels.json @@ -92,7 +92,12 @@ "behaviors": { "account": { "avatar": "blur", - "banner": "blur" + "banner": "blur", + "profileList": "blur", + "profileView": "blur", + "contentList": "blur", + "contentView": "blur", + "contentMedia": "blur" }, "profile": { "avatar": "blur", @@ -113,7 +118,12 @@ "behaviors": { "account": { "avatar": "blur", - "banner": "blur" + "banner": "blur", + "profileList": "blur", + "profileView": "blur", + "contentList": "blur", + "contentView": "blur", + "contentMedia": "blur" }, "profile": { "avatar": "blur", @@ -134,7 +144,8 @@ "behaviors": { "account": { "avatar": "blur", - "banner": "blur" + "banner": "blur", + "contentMedia": "blur" }, "profile": { "avatar": "blur", @@ -156,7 +167,12 @@ "behaviors": { "account": { "avatar": "blur", - "banner": "blur" + "banner": "blur", + "profileList": "blur", + "profileView": "blur", + "contentList": "blur", + "contentView": "blur", + "contentMedia": "blur" }, "profile": { "avatar": "blur", diff --git a/packages/api/src/moderation/const/labels.ts b/packages/api/src/moderation/const/labels.ts new file mode 100644 index 00000000000..c045f519ebe --- /dev/null +++ b/packages/api/src/moderation/const/labels.ts @@ -0,0 +1,241 @@ +/** this doc is generated by ./scripts/code/labels.mjs **/ +import { InterpretedLabelValueDefinition, LabelPreference } from '../types' + +export type KnownLabelValue = + | '!hide' + | '!warn' + | '!no-unauthenticated' + | 'porn' + | 'sexual' + | 'nudity' + | 'graphic-media' + | 'gore' + +export const DEFAULT_LABEL_SETTINGS: Record = { + porn: 'hide', + sexual: 'warn', + nudity: 'ignore', + 'graphic-media': 'warn', +} + +export const LABELS: Record = + { + '!hide': { + identifier: '!hide', + configurable: false, + defaultSetting: 'hide', + flags: ['no-override', 'no-self'], + severity: 'alert', + blurs: 'content', + behaviors: { + account: { + profileList: 'blur', + profileView: 'blur', + avatar: 'blur', + banner: 'blur', + displayName: 'blur', + contentList: 'blur', + contentView: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + displayName: 'blur', + }, + content: { + contentList: 'blur', + contentView: 'blur', + }, + }, + locales: [], + }, + '!warn': { + identifier: '!warn', + configurable: false, + defaultSetting: 'warn', + flags: ['no-self'], + severity: 'none', + blurs: 'content', + behaviors: { + account: { + profileList: 'blur', + profileView: 'blur', + avatar: 'blur', + banner: 'blur', + contentList: 'blur', + contentView: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + displayName: 'blur', + }, + content: { + contentList: 'blur', + contentView: 'blur', + }, + }, + locales: [], + }, + '!no-unauthenticated': { + identifier: '!no-unauthenticated', + configurable: false, + defaultSetting: 'hide', + flags: ['no-override', 'unauthed'], + severity: 'none', + blurs: 'content', + behaviors: { + account: { + profileList: 'blur', + profileView: 'blur', + avatar: 'blur', + banner: 'blur', + displayName: 'blur', + contentList: 'blur', + contentView: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + displayName: 'blur', + }, + content: { + contentList: 'blur', + contentView: 'blur', + }, + }, + locales: [], + }, + porn: { + identifier: 'porn', + configurable: true, + defaultSetting: 'hide', + flags: ['adult'], + severity: 'none', + blurs: 'media', + behaviors: { + account: { + avatar: 'blur', + banner: 'blur', + profileList: 'blur', + profileView: 'blur', + contentList: 'blur', + contentView: 'blur', + contentMedia: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + }, + content: { + contentMedia: 'blur', + }, + }, + locales: [], + }, + sexual: { + identifier: 'sexual', + configurable: true, + defaultSetting: 'warn', + flags: ['adult'], + severity: 'none', + blurs: 'media', + behaviors: { + account: { + avatar: 'blur', + banner: 'blur', + profileList: 'blur', + profileView: 'blur', + contentList: 'blur', + contentView: 'blur', + contentMedia: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + }, + content: { + contentMedia: 'blur', + }, + }, + locales: [], + }, + nudity: { + identifier: 'nudity', + configurable: true, + defaultSetting: 'ignore', + flags: [], + severity: 'none', + blurs: 'media', + behaviors: { + account: { + avatar: 'blur', + banner: 'blur', + contentMedia: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + }, + content: { + contentMedia: 'blur', + }, + }, + locales: [], + }, + 'graphic-media': { + identifier: 'graphic-media', + flags: ['adult'], + configurable: true, + defaultSetting: 'warn', + severity: 'none', + blurs: 'media', + behaviors: { + account: { + avatar: 'blur', + banner: 'blur', + profileList: 'blur', + profileView: 'blur', + contentList: 'blur', + contentView: 'blur', + contentMedia: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + }, + content: { + contentMedia: 'blur', + }, + }, + locales: [], + }, + /** @deprecated alias for `graphic-media` */ + gore: { + identifier: 'gore', + flags: ['adult'], + configurable: true, + defaultSetting: 'warn', + severity: 'none', + blurs: 'media', + behaviors: { + account: { + avatar: 'blur', + banner: 'blur', + profileList: 'blur', + profileView: 'blur', + contentList: 'blur', + contentView: 'blur', + contentMedia: 'blur', + }, + profile: { + avatar: 'blur', + banner: 'blur', + }, + content: { + contentMedia: 'blur', + }, + }, + locales: [], + }, + } diff --git a/packages/api/tests/moderation-behaviors.test.ts b/packages/api/tests/moderation-behaviors.test.ts index a180828b59b..27373501937 100644 --- a/packages/api/tests/moderation-behaviors.test.ts +++ b/packages/api/tests/moderation-behaviors.test.ts @@ -339,10 +339,13 @@ const SCENARIOS: SuiteScenarios = { author: 'alice', labels: { account: ['porn'] }, behaviors: { - profileList: ['filter'], + profileList: ['filter', 'blur'], + profileView: ['blur'], avatar: ['blur'], banner: ['blur'], - contentList: ['filter'], + contentList: ['filter', 'blur'], + contentView: ['blur'], + contentMedia: ['blur'], }, }, "Blur-media label ('porn') on profile (hide)": { @@ -381,10 +384,11 @@ const SCENARIOS: SuiteScenarios = { author: 'alice', labels: { account: ['porn'] }, behaviors: { - profileList: ['filter'], avatar: ['blur'], banner: ['blur'], - contentList: ['filter'], + contentList: ['filter', 'blur'], + contentView: ['blur'], + contentMedia: ['blur'], }, }, @@ -394,8 +398,13 @@ const SCENARIOS: SuiteScenarios = { author: 'alice', labels: { account: ['porn'] }, behaviors: { + profileList: ['blur'], + profileView: ['blur'], avatar: ['blur'], banner: ['blur'], + contentList: ['blur'], + contentView: ['blur'], + contentMedia: ['blur'], }, }, "Blur-media label ('porn') on profile (warn)": { @@ -435,6 +444,9 @@ const SCENARIOS: SuiteScenarios = { behaviors: { avatar: ['blur'], banner: ['blur'], + contentList: ['blur'], + contentView: ['blur'], + contentMedia: ['blur'], }, }, @@ -480,10 +492,13 @@ const SCENARIOS: SuiteScenarios = { author: 'alice', labels: { account: ['porn'] }, behaviors: { - profileList: ['filter'], + profileList: ['filter', 'blur', 'noOverride'], + profileView: ['blur', 'noOverride'], avatar: ['blur', 'noOverride'], banner: ['blur', 'noOverride'], - contentList: ['filter'], + contentList: ['filter', 'blur', 'noOverride'], + contentView: ['blur', 'noOverride'], + contentMedia: ['blur', 'noOverride'], }, }, 'Adult-only label on profile when adult content is disabled': { @@ -527,7 +542,9 @@ const SCENARIOS: SuiteScenarios = { behaviors: { avatar: ['blur', 'noOverride'], banner: ['blur', 'noOverride'], - contentList: ['filter'], + contentList: ['filter', 'blur', 'noOverride'], + contentView: ['blur', 'noOverride'], + contentMedia: ['blur', 'noOverride'], }, }, @@ -787,6 +804,7 @@ const SCENARIOS: SuiteScenarios = { displayName: ['blur', 'noOverride'], contentList: ['filter', 'blur', 'noOverride'], contentView: ['blur', 'noOverride'], + contentMedia: ['blur'], }, }, "Merging: '!warn' and 'porn' labels on account (hide)": { @@ -801,6 +819,7 @@ const SCENARIOS: SuiteScenarios = { banner: ['blur'], contentList: ['filter', 'blur'], contentView: ['blur'], + contentMedia: ['blur'], }, }, 'Merging: !hide on account, !warn on profile': { From 4a74b4929693eea526cf134f2cb955d5c0916845 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 11:06:16 -0500 Subject: [PATCH 12/87] Version packages (#4907) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/better-rooms-watch.md | 5 ----- .changeset/social-wombats-stand.md | 5 ----- packages/api/CHANGELOG.md | 8 ++++++++ packages/api/package.json | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 .changeset/better-rooms-watch.md delete mode 100644 .changeset/social-wombats-stand.md diff --git a/.changeset/better-rooms-watch.md b/.changeset/better-rooms-watch.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/better-rooms-watch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/.changeset/social-wombats-stand.md b/.changeset/social-wombats-stand.md deleted file mode 100644 index ed83028676d..00000000000 --- a/.changeset/social-wombats-stand.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -Update blur behaviors to be more comprehensive and cover more surfaces. diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 9749c8a7705..d230baf37ac 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/api +## 0.19.13 + +### Patch Changes + +- [#4906](https://github.com/bluesky-social/atproto/pull/4906) [`2879b56`](https://github.com/bluesky-social/atproto/commit/2879b56a04d37fc93d5afb51cf6131fb7c156b85) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + +- [#4769](https://github.com/bluesky-social/atproto/pull/4769) [`02b8b32`](https://github.com/bluesky-social/atproto/commit/02b8b32d2fd57ade330d18fbfc8d0d25ed95e476) Thanks [@whyrusleeping](https://github.com/whyrusleeping)! - Update blur behaviors to be more comprehensive and cover more surfaces. + ## 0.19.12 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 4786a5cb0ad..9c0a28aff2d 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.12", + "version": "0.19.13", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ From 5f37211cf550b31a693cb174f1fe1d0cfee78294 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 5 May 2026 16:52:14 -0500 Subject: [PATCH 13/87] Update age assurance config (#4908) * Add AA config for BR * Changeset --- .changeset/silent-oranges-invite.md | 5 +++++ packages/bsky/src/api/age-assurance/const.ts | 22 ++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 .changeset/silent-oranges-invite.md diff --git a/.changeset/silent-oranges-invite.md b/.changeset/silent-oranges-invite.md new file mode 100644 index 00000000000..44c5cb251ca --- /dev/null +++ b/.changeset/silent-oranges-invite.md @@ -0,0 +1,5 @@ +--- +'@atproto/bsky': patch +--- + +Update Age Assurance config diff --git a/packages/bsky/src/api/age-assurance/const.ts b/packages/bsky/src/api/age-assurance/const.ts index 48bc650955a..bbdf9e32c6b 100644 --- a/packages/bsky/src/api/age-assurance/const.ts +++ b/packages/bsky/src/api/age-assurance/const.ts @@ -158,5 +158,27 @@ export const AGE_ASSURANCE_CONFIG = app.bsky.ageassurance.defs.config.$build({ }), ], }, + { + countryCode: 'BR', + regionCode: undefined, + minAccessAge: 13, + rules: [ + app.bsky.ageassurance.defs.configRegionRuleIfAssuredOverAge.$build({ + age: 18, + access: 'full', + }), + app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({ + age: 18, + access: 'full', + }), + app.bsky.ageassurance.defs.configRegionRuleIfDeclaredOverAge.$build({ + age: 13, + access: 'safe', + }), + app.bsky.ageassurance.defs.configRegionRuleDefault.$build({ + access: 'none', + }), + ], + }, ], }) From 65a4b31e67c786c06ce7d48d46b7c6c9d55fcec1 Mon Sep 17 00:00:00 2001 From: Foysal Ahamed Date: Wed, 6 May 2026 18:10:20 +0200 Subject: [PATCH 14/87] :sparkles: Add expiring tags in ozone (#4894) * :sparkles: Add expiring tags in ozone * :broom: Cleanup * :memo: Add changeset --- .changeset/tasty-mice-worry.md | 6 + lexicons/tools/ozone/moderation/defs.json | 4 + packages/api/src/client/lexicons.ts | 5 + .../types/tools/ozone/moderation/defs.ts | 2 + packages/ozone/src/daemon/event-reverser.ts | 51 +++- ...60428T000000000Z-add-expiring-tag-table.ts | 32 +++ packages/ozone/src/db/migrations/index.ts | 1 + packages/ozone/src/db/schema/expiring_tag.ts | 17 ++ packages/ozone/src/db/schema/index.ts | 4 +- packages/ozone/src/lexicon/lexicons.ts | 5 + .../types/tools/ozone/moderation/defs.ts | 2 + .../ozone/src/mod-service/expiring-tags.ts | 98 ++++++++ packages/ozone/src/mod-service/index.ts | 26 ++ packages/ozone/tests/expiring-tags.test.ts | 231 ++++++++++++++++++ 14 files changed, 482 insertions(+), 2 deletions(-) create mode 100644 .changeset/tasty-mice-worry.md create mode 100644 packages/ozone/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts create mode 100644 packages/ozone/src/db/schema/expiring_tag.ts create mode 100644 packages/ozone/src/mod-service/expiring-tags.ts create mode 100644 packages/ozone/tests/expiring-tags.test.ts diff --git a/.changeset/tasty-mice-worry.md b/.changeset/tasty-mice-worry.md new file mode 100644 index 00000000000..7aae8510fc4 --- /dev/null +++ b/.changeset/tasty-mice-worry.md @@ -0,0 +1,6 @@ +--- +'@atproto/ozone': patch +'@atproto/api': patch +--- + +Add expiring tags in ozone diff --git a/lexicons/tools/ozone/moderation/defs.json b/lexicons/tools/ozone/moderation/defs.json index 0ed8f27d736..80d7e5c7716 100644 --- a/lexicons/tools/ozone/moderation/defs.json +++ b/lexicons/tools/ozone/moderation/defs.json @@ -739,6 +739,10 @@ "comment": { "type": "string", "description": "Additional comment about added/removed tags." + }, + "durationInHours": { + "type": "integer", + "description": "Indicates how long the tags being added should remain before automatically being removed. Only applies to tags being added." } } }, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index f471806e3d4..67930734e83 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -19103,6 +19103,11 @@ export const schemaDict = { type: 'string', description: 'Additional comment about added/removed tags.', }, + durationInHours: { + type: 'integer', + description: + 'Indicates how long the tags being added should remain before automatically being removed. Only applies to tags being added.', + }, }, }, accountEvent: { diff --git a/packages/api/src/client/types/tools/ozone/moderation/defs.ts b/packages/api/src/client/types/tools/ozone/moderation/defs.ts index ca25960a615..8e3f6af7a81 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/defs.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/defs.ts @@ -701,6 +701,8 @@ export interface ModEventTag { remove: string[] /** Additional comment about added/removed tags. */ comment?: string + /** Indicates how long the tags being added should remain before automatically being removed. Only applies to tags being added. */ + durationInHours?: number } const hashModEventTag = 'modEventTag' diff --git a/packages/ozone/src/daemon/event-reverser.ts b/packages/ozone/src/daemon/event-reverser.ts index e913b632ba1..a75721e0fab 100644 --- a/packages/ozone/src/daemon/event-reverser.ts +++ b/packages/ozone/src/daemon/event-reverser.ts @@ -2,6 +2,11 @@ import { MINUTE } from '@atproto/common' import { Database } from '../db' import { dbLogger } from '../logger' import { ModerationServiceCreator, ReversalSubject } from '../mod-service' +import { + deleteExpiringTagsByIds, + getExpiredTags, +} from '../mod-service/expiring-tags' +import { subjectFromStatusRow } from '../mod-service/subject' export class EventReverser { destroyed = false @@ -62,7 +67,51 @@ export class EventReverser { // We shouldn't have too many actions due for reversal at any given time, so running in parallel is probably fine // Internally, each reversal runs within its own transaction - await Promise.all(subjectsDueForReversal.map(this.revertState.bind(this))) + await Promise.all([ + ...subjectsDueForReversal.map(this.revertState.bind(this)), + this.findAndRevertExpiredTags(), + ]) + } + + async findAndRevertExpiredTags() { + const groups = await getExpiredTags(this.db) + if (!groups.length) return + + for (const group of groups) { + await this.db.transaction(async (dbTxn) => { + // Check which tags are still present on the subject + const status = await dbTxn.db + .selectFrom('moderation_subject_status') + .where('did', '=', group.did) + .where('recordPath', '=', group.recordPath) + .selectAll() + .executeTakeFirst() + + const currentTags: string[] = status?.tags ?? [] + const tagsToRemove = group.tags.filter((t) => currentTags.includes(t)) + + // Delete the expiring_tag rows regardless + await deleteExpiringTagsByIds(dbTxn, group.ids) + + // Only emit removal event if there are tags still present to remove + if (tagsToRemove.length > 0 && status) { + const subject = subjectFromStatusRow(status) + const moderationTxn = this.modService(dbTxn) + await moderationTxn.logEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventTag', + add: [], + remove: tagsToRemove, + comment: + '[SCHEDULED_REVERSAL] Reverting temporary tags as originally scheduled', + }, + createdBy: group.createdBy, + subject, + createdAt: new Date(), + }) + } + }) + } } } diff --git a/packages/ozone/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts b/packages/ozone/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts new file mode 100644 index 00000000000..63644697da3 --- /dev/null +++ b/packages/ozone/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts @@ -0,0 +1,32 @@ +import { Kysely } from 'kysely' + +export async function up(db: Kysely): Promise { + await db.schema + .createTable('expiring_tag') + .addColumn('id', 'serial', (col) => col.primaryKey()) + .addColumn('eventId', 'integer', (col) => col.notNull()) + .addColumn('did', 'varchar', (col) => col.notNull()) + .addColumn('recordPath', 'varchar', (col) => col.notNull()) + .addColumn('tag', 'varchar', (col) => col.notNull()) + .addColumn('expiresAt', 'varchar', (col) => col.notNull()) + .addColumn('createdBy', 'varchar', (col) => col.notNull()) + .execute() + + // Daemon polls for expired tags + await db.schema + .createIndex('idx_expiring_tag_expires_at') + .on('expiring_tag') + .column('expiresAt') + .execute() + + // Cleanup queries when tags are manually removed + await db.schema + .createIndex('idx_expiring_tag_did_record_path') + .on('expiring_tag') + .columns(['did', 'recordPath']) + .execute() +} + +export async function down(db: Kysely): Promise { + await db.schema.dropTable('expiring_tag').execute() +} diff --git a/packages/ozone/src/db/migrations/index.ts b/packages/ozone/src/db/migrations/index.ts index 3e44e6750e6..e8da896387c 100644 --- a/packages/ozone/src/db/migrations/index.ts +++ b/packages/ozone/src/db/migrations/index.ts @@ -34,3 +34,4 @@ export * as _20250813T000000000Z from './20250813T000000000Z-mod-tool-batch-id-i export * as _20250923T000000000Z from './20250923T000000000Z-scheduled-actions' export * as _20251008T120000000Z from './20251008T120000000Z-add-strike-system' export * as _20260210T154806448Z from './20260210T154806448Z-mod-event-created-by-indexes' +export * as _20260428T000000000Z from './20260428T000000000Z-add-expiring-tag-table' diff --git a/packages/ozone/src/db/schema/expiring_tag.ts b/packages/ozone/src/db/schema/expiring_tag.ts new file mode 100644 index 00000000000..bafe2aa0193 --- /dev/null +++ b/packages/ozone/src/db/schema/expiring_tag.ts @@ -0,0 +1,17 @@ +import { Generated } from 'kysely' + +export const tableName = 'expiring_tag' + +export interface ExpiringTag { + id: Generated + eventId: number + did: string + recordPath: string + tag: string + expiresAt: string + createdBy: string +} + +export type PartialDB = { + [tableName]: ExpiringTag +} diff --git a/packages/ozone/src/db/schema/index.ts b/packages/ozone/src/db/schema/index.ts index 4be0829e46b..645f8eebe25 100644 --- a/packages/ozone/src/db/schema/index.ts +++ b/packages/ozone/src/db/schema/index.ts @@ -5,6 +5,7 @@ import * as accountRecordStatusStats from './account_record_status_stats' import * as accountStrike from './account_strike' import * as blobPushEvent from './blob_push_event' import * as communicationTemplate from './communication_template' +import * as expiringTag from './expiring_tag' import * as firehoseCursor from './firehose_cursor' import * as jobCursor from './job_cursor' import * as label from './label' @@ -41,7 +42,8 @@ export type DatabaseSchemaType = modEvent.PartialDB & firehoseCursor.PartialDB & jobCursor.PartialDB & safelink.PartialDB & - scheduledAction.PartialDB + scheduledAction.PartialDB & + expiringTag.PartialDB export type DatabaseSchema = Kysely diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 1c26b158db0..4c8d6bfb8c5 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -19034,6 +19034,11 @@ export const schemaDict = { type: 'string', description: 'Additional comment about added/removed tags.', }, + durationInHours: { + type: 'integer', + description: + 'Indicates how long the tags being added should remain before automatically being removed. Only applies to tags being added.', + }, }, }, accountEvent: { diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts index ca25960a615..8e3f6af7a81 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts @@ -701,6 +701,8 @@ export interface ModEventTag { remove: string[] /** Additional comment about added/removed tags. */ comment?: string + /** Indicates how long the tags being added should remain before automatically being removed. Only applies to tags being added. */ + durationInHours?: number } const hashModEventTag = 'modEventTag' diff --git a/packages/ozone/src/mod-service/expiring-tags.ts b/packages/ozone/src/mod-service/expiring-tags.ts new file mode 100644 index 00000000000..8ff882a6eee --- /dev/null +++ b/packages/ozone/src/mod-service/expiring-tags.ts @@ -0,0 +1,98 @@ +import { Selectable } from 'kysely' +import { Database } from '../db' +import { ExpiringTag } from '../db/schema/expiring_tag' + +export type ExpiringTagRow = Selectable + +export type ExpiringTagGroup = { + did: string + recordPath: string + createdBy: string + tags: string[] + ids: number[] +} + +export async function insertExpiringTags( + db: Database, + params: { + eventId: number + did: string + recordPath: string + tags: string[] + expiresAt: string + createdBy: string + }, +): Promise { + await db.db + .insertInto('expiring_tag') + .values( + params.tags.map((tag) => ({ + eventId: params.eventId, + did: params.did, + recordPath: params.recordPath, + tag, + expiresAt: params.expiresAt, + createdBy: params.createdBy, + })), + ) + .execute() +} + +export async function removeExpiringTags( + db: Database, + params: { + did: string + recordPath: string + tags: string[] + }, +): Promise { + await db.db + .deleteFrom('expiring_tag') + .where('did', '=', params.did) + .where('recordPath', '=', params.recordPath) + .where('tag', 'in', params.tags) + .execute() +} + +export async function deleteExpiringTagsByIds( + db: Database, + ids: number[], +): Promise { + await db.db.deleteFrom('expiring_tag').where('id', 'in', ids).execute() +} + +export async function getExpiredTags( + db: Database, +): Promise { + const now = new Date().toISOString() + const rows = await db.db + .selectFrom('expiring_tag') + .where('expiresAt', '<', now) + .selectAll() + .execute() + + if (!rows.length) return [] + + // Group by (did, recordPath, createdBy) so each reversal event has the correct author + const grouped = new Map() + for (const row of rows) { + const key = `${row.did}|${row.recordPath}|${row.createdBy}` + let group = grouped.get(key) + if (!group) { + group = { + did: row.did, + recordPath: row.recordPath, + createdBy: row.createdBy, + tags: [], + ids: [], + } + grouped.set(key, group) + } + if (!group.tags.includes(row.tag)) { + group.tags.push(row.tag) + } + group.ids.push(row.id) + } + + return [...grouped.values()] +} diff --git a/packages/ozone/src/mod-service/index.ts b/packages/ozone/src/mod-service/index.ts index c88518d86fc..57208130ae7 100644 --- a/packages/ozone/src/mod-service/index.ts +++ b/packages/ozone/src/mod-service/index.ts @@ -46,6 +46,7 @@ import { import { QueryParams as QueryStatusParams } from '../lexicon/types/tools/ozone/moderation/queryStatuses' import { httpLogger as log } from '../logger' import { LABELER_HEADER_NAME, ParsedLabelers } from '../util' +import { insertExpiringTags, removeExpiringTags } from './expiring-tags' import { adjustModerationSubjectStatus, getStatusIdentifierFromSubject, @@ -666,6 +667,31 @@ export class ModerationService { subject.blobCids, ) + // Manage expiring tag rows for temporary tags + if (isModEventTag(event)) { + if (event.durationInHours && event.add.length > 0) { + const expiresAt = addHoursToDate( + event.durationInHours, + createdAt, + ).toISOString() + await insertExpiringTags(this.db, { + eventId: modEvent.id, + did: subjectInfo.subjectDid, + recordPath: subjectInfo.subjectUri ?? '', + tags: event.add, + expiresAt, + createdBy, + }) + } + if (event.remove.length > 0) { + await removeExpiringTags(this.db, { + did: subjectInfo.subjectDid, + recordPath: subjectInfo.subjectUri ?? '', + tags: event.remove, + }) + } + } + if (isAgeAssurancePurgeEvent(event)) { await this.purgeAgeAssuranceEvents(subjectInfo.subjectDid) } diff --git a/packages/ozone/tests/expiring-tags.test.ts b/packages/ozone/tests/expiring-tags.test.ts new file mode 100644 index 00000000000..5bdec881f1e --- /dev/null +++ b/packages/ozone/tests/expiring-tags.test.ts @@ -0,0 +1,231 @@ +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { EventReverser } from '../src/daemon/event-reverser' +import { REASONSPAM } from '../src/lexicon/types/com/atproto/moderation/defs' + +describe('expiring tags', () => { + let network: TestNetwork + let sc: SeedClient + let modClient: ModeratorClient + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_expiring_tags', + }) + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + const emitTagEvent = ( + did: string, + add: string[], + remove: string[], + durationInHours?: number, + ) => + modClient.emitEvent({ + subject: { $type: 'com.atproto.admin.defs#repoRef', did }, + event: { + $type: 'tools.ozone.moderation.defs#modEventTag', + add, + remove, + ...(durationInHours !== undefined ? { durationInHours } : {}), + }, + }) + + const getSubjectTags = async (did: string): Promise => { + const result = await modClient.queryStatuses({ subject: did }) + return result.subjectStatuses[0]?.tags ?? [] + } + + const createReverser = () => + new EventReverser( + network.ozone.ctx.db, + // @ts-expect-error Error due to circular dependency with the dev-env package + network.ozone.ctx.modService, + ) + + it('creates expiring_tag rows when durationInHours is set', async () => { + // Create a report so the subject exists in moderation_subject_status + await sc.createReport({ + reasonType: REASONSPAM, + reason: 'test', + subject: { $type: 'com.atproto.admin.defs#repoRef', did: sc.dids.bob }, + reportedBy: sc.dids.alice, + }) + + await emitTagEvent(sc.dids.bob, ['temp-tag-1', 'temp-tag-2'], [], 1) + + const tags = await getSubjectTags(sc.dids.bob) + expect(tags).toContain('temp-tag-1') + expect(tags).toContain('temp-tag-2') + + // Verify expiring_tag rows were created + const expiringRows = await network.ozone.ctx.db.db + .selectFrom('expiring_tag') + .where('did', '=', sc.dids.bob) + .selectAll() + .execute() + + expect(expiringRows).toHaveLength(2) + expect(expiringRows.map((r) => r.tag).sort()).toEqual([ + 'temp-tag-1', + 'temp-tag-2', + ]) + expect(expiringRows[0].expiresAt).toBeTruthy() + }) + + it('does not create expiring_tag rows without durationInHours', async () => { + await emitTagEvent(sc.dids.bob, ['permanent-tag'], []) + + const tags = await getSubjectTags(sc.dids.bob) + expect(tags).toContain('permanent-tag') + + const expiringRows = await network.ozone.ctx.db.db + .selectFrom('expiring_tag') + .where('did', '=', sc.dids.bob) + .where('tag', '=', 'permanent-tag') + .selectAll() + .execute() + + expect(expiringRows).toHaveLength(0) + }) + + it('daemon reverts expired tags', async () => { + // Manually expire the tags in the DB + await network.ozone.ctx.db.db + .updateTable('expiring_tag') + .set({ expiresAt: new Date(Date.now() - 1000).toISOString() }) + .where('did', '=', sc.dids.bob) + .execute() + + const reverser = createReverser() + await reverser.findAndRevertDueActions() + + const tags = await getSubjectTags(sc.dids.bob) + expect(tags).not.toContain('temp-tag-1') + expect(tags).not.toContain('temp-tag-2') + // Permanent tag should still be there + expect(tags).toContain('permanent-tag') + + // Verify expiring_tag rows are cleaned up + const remainingRows = await network.ozone.ctx.db.db + .selectFrom('expiring_tag') + .where('did', '=', sc.dids.bob) + .selectAll() + .execute() + + expect(remainingRows).toHaveLength(0) + }) + + it('daemon emits a modEventTag removal event', async () => { + const events = await modClient.queryEvents({ + subject: sc.dids.bob, + types: ['tools.ozone.moderation.defs#modEventTag'], + }) + + const lastTagEvent = events.events[0] + expect(lastTagEvent.event).toMatchObject({ + $type: 'tools.ozone.moderation.defs#modEventTag', + add: [], + remove: expect.arrayContaining(['temp-tag-1', 'temp-tag-2']), + comment: + '[SCHEDULED_REVERSAL] Reverting temporary tags as originally scheduled', + }) + }) + + it('cleans up expiring_tag rows when tags are manually removed', async () => { + await sc.createReport({ + reasonType: REASONSPAM, + reason: 'test', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportedBy: sc.dids.alice, + }) + + await emitTagEvent(sc.dids.carol, ['auto-remove-tag'], [], 24) + + // Verify the expiring_tag row exists + let expiringRows = await network.ozone.ctx.db.db + .selectFrom('expiring_tag') + .where('did', '=', sc.dids.carol) + .where('tag', '=', 'auto-remove-tag') + .selectAll() + .execute() + expect(expiringRows).toHaveLength(1) + + // Manually remove the tag + await emitTagEvent(sc.dids.carol, [], ['auto-remove-tag']) + + // Verify the expiring_tag row is cleaned up + expiringRows = await network.ozone.ctx.db.db + .selectFrom('expiring_tag') + .where('did', '=', sc.dids.carol) + .where('tag', '=', 'auto-remove-tag') + .selectAll() + .execute() + expect(expiringRows).toHaveLength(0) + }) + + it('daemon skips tags already manually removed', async () => { + await emitTagEvent(sc.dids.carol, ['skip-tag'], [], 1) + + // Manually remove the tag first + await emitTagEvent(sc.dids.carol, [], ['skip-tag']) + + // Re-insert an expiring_tag row to simulate the race condition + // (row wasn't cleaned up for some reason) + await network.ozone.ctx.db.db + .insertInto('expiring_tag') + .values({ + eventId: 0, + did: sc.dids.carol, + recordPath: '', + tag: 'skip-tag', + expiresAt: new Date(Date.now() - 1000).toISOString(), + createdBy: sc.dids.alice, + }) + .execute() + + const tagsBefore = await getSubjectTags(sc.dids.carol) + expect(tagsBefore).not.toContain('skip-tag') + + const reverser = createReverser() + await reverser.findAndRevertDueActions() + + // Verify no removal event was emitted for a tag that's already gone + const events = await modClient.queryEvents({ + subject: sc.dids.carol, + types: ['tools.ozone.moderation.defs#modEventTag'], + }) + + // The last tag event should be the manual removal, not a scheduled reversal + const lastEvent = events.events[0] + expect(lastEvent.event).toMatchObject({ + $type: 'tools.ozone.moderation.defs#modEventTag', + remove: ['skip-tag'], + }) + const comment = (lastEvent.event as { comment?: string }).comment ?? '' + expect(comment).not.toContain('SCHEDULED_REVERSAL') + + // Verify the expiring_tag row is still cleaned up + const remainingRows = await network.ozone.ctx.db.db + .selectFrom('expiring_tag') + .where('did', '=', sc.dids.carol) + .where('tag', '=', 'skip-tag') + .selectAll() + .execute() + expect(remainingRows).toHaveLength(0) + }) +}) From 583928dabdd6d0d5389d79af8baa882a9a3dff96 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 14:05:57 -0500 Subject: [PATCH 15/87] Version packages (#4909) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/silent-oranges-invite.md | 5 ----- .changeset/tasty-mice-worry.md | 6 ------ packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 9 +++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 10 ++++++++++ packages/dev-env/package.json | 2 +- packages/ozone/CHANGELOG.md | 9 +++++++++ packages/ozone/package.json | 2 +- 10 files changed, 38 insertions(+), 15 deletions(-) delete mode 100644 .changeset/silent-oranges-invite.md delete mode 100644 .changeset/tasty-mice-worry.md diff --git a/.changeset/silent-oranges-invite.md b/.changeset/silent-oranges-invite.md deleted file mode 100644 index 44c5cb251ca..00000000000 --- a/.changeset/silent-oranges-invite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/bsky': patch ---- - -Update Age Assurance config diff --git a/.changeset/tasty-mice-worry.md b/.changeset/tasty-mice-worry.md deleted file mode 100644 index 7aae8510fc4..00000000000 --- a/.changeset/tasty-mice-worry.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@atproto/ozone': patch -'@atproto/api': patch ---- - -Add expiring tags in ozone diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index d230baf37ac..03022248b17 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.19.14 + +### Patch Changes + +- [#4894](https://github.com/bluesky-social/atproto/pull/4894) [`65a4b31`](https://github.com/bluesky-social/atproto/commit/65a4b31e67c786c06ce7d48d46b7c6c9d55fcec1) Thanks [@foysalit](https://github.com/foysalit)! - Add expiring tags in ozone + ## 0.19.13 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 9c0a28aff2d..32de54990a1 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.13", + "version": "0.19.14", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 5a65a50061c..1b499be3b3a 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/bsky +## 0.0.228 + +### Patch Changes + +- [#4908](https://github.com/bluesky-social/atproto/pull/4908) [`5f37211`](https://github.com/bluesky-social/atproto/commit/5f37211cf550b31a693cb174f1fe1d0cfee78294) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Update Age Assurance config + +- Updated dependencies [[`65a4b31`](https://github.com/bluesky-social/atproto/commit/65a4b31e67c786c06ce7d48d46b7c6c9d55fcec1)]: + - @atproto/api@0.19.14 + ## 0.0.227 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 13dee85f5a7..42560a42fc8 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.227", + "version": "0.0.228", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index af8b30c0add..013a5398847 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/dev-env +## 0.4.6 + +### Patch Changes + +- Updated dependencies [[`5f37211`](https://github.com/bluesky-social/atproto/commit/5f37211cf550b31a693cb174f1fe1d0cfee78294), [`65a4b31`](https://github.com/bluesky-social/atproto/commit/65a4b31e67c786c06ce7d48d46b7c6c9d55fcec1)]: + - @atproto/bsky@0.0.228 + - @atproto/ozone@0.1.173 + - @atproto/api@0.19.14 + - @atproto/pds@0.4.221 + ## 0.4.5 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index a0c346780a5..6249c28e851 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.4.5", + "version": "0.4.6", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index a1395493084..9c788091b6e 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/ozone +## 0.1.173 + +### Patch Changes + +- [#4894](https://github.com/bluesky-social/atproto/pull/4894) [`65a4b31`](https://github.com/bluesky-social/atproto/commit/65a4b31e67c786c06ce7d48d46b7c6c9d55fcec1) Thanks [@foysalit](https://github.com/foysalit)! - Add expiring tags in ozone + +- Updated dependencies [[`65a4b31`](https://github.com/bluesky-social/atproto/commit/65a4b31e67c786c06ce7d48d46b7c6c9d55fcec1)]: + - @atproto/api@0.19.14 + ## 0.1.172 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index ff51f1a596b..5636c4f8cd9 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.172", + "version": "0.1.173", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ From 450f26ac854cf53484dd887204447c8ead78d3b2 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 7 May 2026 16:39:04 -0500 Subject: [PATCH 16/87] Add `associatedRecord` to external embed record (#4912) Add associatedRecord to external embed record --- .changeset/quick-garlics-cry.md | 5 +++++ lexicons/app/bsky/embed/external.json | 5 +++++ packages/api/src/client/lexicons.ts | 6 ++++++ packages/api/src/client/types/app/bsky/embed/external.ts | 2 ++ packages/ozone/src/lexicon/lexicons.ts | 6 ++++++ packages/ozone/src/lexicon/types/app/bsky/embed/external.ts | 2 ++ 6 files changed, 26 insertions(+) create mode 100644 .changeset/quick-garlics-cry.md diff --git a/.changeset/quick-garlics-cry.md b/.changeset/quick-garlics-cry.md new file mode 100644 index 00000000000..cb5269aba78 --- /dev/null +++ b/.changeset/quick-garlics-cry.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +Add `associatedRecord` to `app.bsky.embed.external` record. diff --git a/lexicons/app/bsky/embed/external.json b/lexicons/app/bsky/embed/external.json index b9930dff2b0..775d2d498cd 100644 --- a/lexicons/app/bsky/embed/external.json +++ b/lexicons/app/bsky/embed/external.json @@ -24,6 +24,11 @@ "type": "blob", "accept": ["image/*"], "maxSize": 1000000 + }, + "associatedRecord": { + "type": "string", + "format": "at-uri", + "description": "The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record." } } }, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 67930734e83..8bc62cd3670 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -2710,6 +2710,12 @@ export const schemaDict = { accept: ['image/*'], maxSize: 1000000, }, + associatedRecord: { + type: 'string', + format: 'at-uri', + description: + 'The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record.', + }, }, }, view: { diff --git a/packages/api/src/client/types/app/bsky/embed/external.ts b/packages/api/src/client/types/app/bsky/embed/external.ts index d29485cff83..d1a7a1e2ee2 100644 --- a/packages/api/src/client/types/app/bsky/embed/external.ts +++ b/packages/api/src/client/types/app/bsky/embed/external.ts @@ -36,6 +36,8 @@ export interface External { title: string description: string thumb?: BlobRef + /** The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record. */ + associatedRecord?: string } const hashExternal = 'external' diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 4c8d6bfb8c5..94befb59763 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -2710,6 +2710,12 @@ export const schemaDict = { accept: ['image/*'], maxSize: 1000000, }, + associatedRecord: { + type: 'string', + format: 'at-uri', + description: + 'The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record.', + }, }, }, view: { diff --git a/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts b/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts index d29485cff83..d1a7a1e2ee2 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts @@ -36,6 +36,8 @@ export interface External { title: string description: string thumb?: BlobRef + /** The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record. */ + associatedRecord?: string } const hashExternal = 'external' From 352ad55bea4e9d9b60382ec39685e620725220f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 16:42:13 -0500 Subject: [PATCH 17/87] Version packages (#4913) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/quick-garlics-cry.md | 5 ----- packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/quick-garlics-cry.md diff --git a/.changeset/quick-garlics-cry.md b/.changeset/quick-garlics-cry.md deleted file mode 100644 index cb5269aba78..00000000000 --- a/.changeset/quick-garlics-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -Add `associatedRecord` to `app.bsky.embed.external` record. diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 03022248b17..c59b44c51c7 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.19.15 + +### Patch Changes + +- [#4912](https://github.com/bluesky-social/atproto/pull/4912) [`450f26a`](https://github.com/bluesky-social/atproto/commit/450f26ac854cf53484dd887204447c8ead78d3b2) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Add `associatedRecord` to `app.bsky.embed.external` record. + ## 0.19.14 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 32de54990a1..02e01678562 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.14", + "version": "0.19.15", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ From d05b76cdb59e5bf0af739d1dcbe54df5e7faa7b3 Mon Sep 17 00:00:00 2001 From: Foysal Ahamed Date: Fri, 8 May 2026 18:41:42 +0200 Subject: [PATCH 18/87] :sparkles: Ozone report based queue system (#4661) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :memo: Initial draft of report based ticketing system * :sparkles: Introduce report entity * cleanup * :sparkles: Fix merge conflict * :broom: Cleanup * :sparkles: Return reporter details in report view * :bug: Remove foreign key ref * ❇️ Action reports via events (#4681) * :sparkles: Allow associating actions to reports via events * :bug: Rollback subject type * :sparkles: Add queue management lexicons * ❇️ Ozone queue management (#4686) * :sparkles: Add queue management lexicons * :rotating_lights: Fix lint issue * :memo: Update lexicons * ❇️ Ozone queue routing (#4687) * :sparkles: Add queue routing for for reports * :sparkles: Add queue delete and migration * :sparkles: Add validation for subject type * :broom: Cleanup * Ozone User Assignments (#4663) * moderator_assignment table * queue assignment endpoints * cleanup schema * report assignment endpoints * register handlers * allow queue unassign * rename tools.ozone.queue.assign to tools.ozone.queue.assignModerator * remove unique constraint since expired assignments arent removed * remove queue assignment report ID * Realtime assignments (#4682) * add ws types * basic web socket * add getAssignments to AssignmentService * add multiple mods to queue test case * add triage test cases * add realtime test case * add backfill logic * cleanup * websocket server restructure * keep assignment queue id if not provided * fix test: subscription receives updates * fix test: new subscription receives snapshot * add error handling * fix test count * ws: basic auth * report ended test * move assignment wss inside assignment service * allow realtime updates to be disabled * add assignment duration env vars * cleanup * default to 5 minutes * rename claimReport to assignModerator * add test to check dids parameter * remove subject param from queue.getAssignments * cleanup * only throw AlreadyAssigned if active assignment to another user is attempted * remove queue.assignModerator assign input * add more queue tests * tools.ozone.report.getAssignments * qualify function for clarity * cleanup wording * dont call broadcast within wss since the service handles it * throw error in either assign case * handle unassignment case properly * adjust assignment change test case * cleanup * cleanup * split getAssignments into 2 methods. update downstream endpoints * cleanup * support token query param * add queue:assign server message * attaach did to queue:assign message * refactor realtime tests to use websockets for updates * use http for creating queue assignments * cleanup * create view methods * cleanup * cleanup * remove assignment websocket server usage * delete assignment wss * remove line to keep diff clean * add db indexes * use varchar timestamps * remove redundant types * add pagination to queue.getAssignments * add pagination to report.getAssignments * hydrate queueView when reading/writing queue assignments * hydrate queue when working with report assignments * rename test * cleanup * remove queue service since it wont be needed * update description * (forgot to run codegen) * default to true * update description * cleanup * cleanup * use deterministic IDs * remove ws types * rename queueView to queue * create getAuthDid * create queueFromJoined to be able to reuse queueService.view * Ozone assignment refactors (#4707) * add invalid queue error * add InvalidAssignment error when assigning report * add invalid assignment tests * update report assignment tests to seed reports * create tools.ozone.report.unassignModerator * require DID when assigning to queue * only check queue collection match if routing a record * add description to report_queue * add description to queue API * add queue description to test * codegen * Ozone enable broad queue record matching (#4724) dont match collection if it is null * :recycle: Refactor report view lexicons and introduce single report query (#4727) * :recycle: Refactor report view lexicons and introduce single report query * :broom: Cleanup * :broom: Cleanup queueView * :bug: Fix typo * :bug: Fix remaining broken test * :sparkles: Enrich moderator team member for assignments (#4737) * :sparkles: Enrich moderator team member for assignments * :broom: Cleanup * :sparkles: Return only permanent assignments * :bug: Fix did assignment * Ozone report rerouting (#4738) * create stub endpoint * cleanup * lift queue router logic up into service layer * remove report routing tests from this file * test for regression bug * use assignReportBatch in routeReports * cleanup tests * create tools.ozone.queue.getLatest * rename to tools.ozone.report.getLatestReport * cleanup * fix limit bug * properly group OR clauses * require limit when assigning reports to queues for more robust limit enforcement * cleanup * update description * cleanup lint issues * allow mods to route reports * add not found error to single report queries * create reusable query for report service * hotfix: update to new function name * ❇️ Report activity and status change log (#4752) * :sparkles: Add report activity entity * :sparkles: Insert report activity when queueing and actioning * :sparkles: Only create report activity on permanent assignment * :sparkles: Move to object based activity schema * :sparkles: Adjust event types * :sparkles: Add member details to listActivities and cleanup note * :broom: Revert lex-cbor package changes * :sparkles: Allow admins to assign mods to reports * :bug: Fix issues pointed out in review * :rotating_lights: Fix lint issue * :recycle: Refactor report status update path * ❇️ Muted report support and better indexing/denormalizing of report data (#4812) * :sparkles: Add muted report support * :zap: Improve indexing for reports and bring over subject message ref * :bug: Fix open report action association * :sparkles: Add assignedTo filter param for queryReports * :rightwards_twisted_arrows: Untangle botched merge * :bug: Fix client instantiation * :sparkles: Cleanup assignment normalization * Ozone report stats (#4789) * create report_stat table * create report stats service * create tools.ozone.queue.getLiveStats lexicon * implement endpoint * simplify service method * attach stats computation to daemon * add stats tests * implement queue stats * cleanup * fix index to only enforce uniqueness for live stats * switch to mode + timeframe schema * overhaul report stat service to use materialzation patterns * add force param. fix bugs * use -1 to make conflict detection easier * cleanup * fix update bug * simpliofy * add report table index for stats * cleanup * remove unused stats * use for loop to prevent hitting connection limit * log errors * change pending to be windowed * create StatsComputer * create isGroupFresh * cleanup * optimize computeGroup * create idx_report_stat_lookup * docs * cleanup * cleanup * actually start the stats computer :) * lint * clean up stats fields * lint * re-use viewing logic * destroy stats computer * add moderatorDid to report_stat * create stats for aggregate, queues, and moderator * add description * add avgHandlingTimeSec * create AHT test * allow assigned reports to be closed via reportAction * add computeStats * update test now that stats can be undefined * cleanup * refactor test * cleanup * fix bug * cleanup * create const for live stats ttl * rename fixed to historical * change pendingCount to be all time * change pendingCount to be all-time * put live stats ahead of historical when computing stats * fix * dont reference moderation_event for mod stats * add mod assignment index for stats * allow stats for unqueued reports by making queueId nullable * add test for unqueued report stats * cleanup * cleanup * cleanup * add report type stats * cleanup * fix failing report type tests * create single getLiveStats endpoint * cleanup * create getHistoricalStats * cleanup * make historical stats paginated * group report types * linting * cleanup * fix bug * :sparkles: Generate weekly stats, refactor, add locking * :hammer: Refactor live and historical stats to use day based snapshots * :bug: Bring back datetime format check * :white_check_mark: Pass date string for test * stats: make computer interval configurable * cleanup --------- Co-authored-by: Foysal Ahamed * Ozone ticketing system fixes (#4884) * use defined report reason type * lint fix * Various fixes (#4882) * :bug: Include actions in response in getReport response * :sparkles: Implement reassign queue endpoint * :rotating_lights: Fix lint issue * :bug: Fix various issues found during testing queue system (#4910) * :bug: Add status change on report unassignment * :sparkles: Add queue unassignment endpoint * :sparkles: Make queue assignments permanent by default * :zap: Add better indexes, make status required * :sparkles: Add did filter param to queryReports * :zap: :hammer: Move report creation to queue router (#4917) * :zap: :hammer: Move report creation to queue router * fix tests for new required status and immediate report routing * cleanup --------- Co-authored-by: gcwill70 * :broom: Cleanup reviewedBy filter * :memo: Add changeset * :rotating_lights: Fix lint issue --------- Co-authored-by: Geoff Cramer --- .changeset/sour-squids-rush.md | 7 + .../tools/ozone/moderation/emitEvent.json | 33 + .../tools/ozone/queue/assignModerator.json | 40 + lexicons/tools/ozone/queue/createQueue.json | 69 + lexicons/tools/ozone/queue/defs.json | 148 ++ lexicons/tools/ozone/queue/deleteQueue.json | 43 + .../tools/ozone/queue/getAssignments.json | 63 + lexicons/tools/ozone/queue/listQueues.json | 61 + lexicons/tools/ozone/queue/routeReports.json | 50 + .../tools/ozone/queue/unassignModerator.json | 34 + lexicons/tools/ozone/queue/updateQueue.json | 48 + .../tools/ozone/report/assignModerator.json | 53 + .../tools/ozone/report/createActivity.json | 75 + lexicons/tools/ozone/report/defs.json | 364 +++ .../tools/ozone/report/getAssignments.json | 65 + .../ozone/report/getHistoricalStats.json | 71 + .../tools/ozone/report/getLatestReport.json | 33 + lexicons/tools/ozone/report/getLiveStats.json | 45 + lexicons/tools/ozone/report/getReport.json | 33 + .../tools/ozone/report/listActivities.json | 48 + lexicons/tools/ozone/report/queryReports.json | 120 + .../tools/ozone/report/reassignQueue.json | 66 + lexicons/tools/ozone/report/refreshStats.json | 41 + .../tools/ozone/report/unassignModerator.json | 36 + packages/api/src/client/index.ts | 292 +++ packages/api/src/client/lexicons.ts | 2072 +++++++++++++++-- .../types/tools/ozone/moderation/emitEvent.ts | 24 + .../tools/ozone/queue/assignModerator.ts | 55 + .../types/tools/ozone/queue/createQueue.ts | 63 + .../client/types/tools/ozone/queue/defs.ts | 99 + .../types/tools/ozone/queue/deleteQueue.ts | 48 + .../types/tools/ozone/queue/getAssignments.ts | 49 + .../types/tools/ozone/queue/listQueues.ts | 51 + .../types/tools/ozone/queue/routeReports.ts | 59 + .../tools/ozone/queue/unassignModerator.ts | 51 + .../types/tools/ozone/queue/updateQueue.ts | 51 + .../tools/ozone/report/assignModerator.ts | 66 + .../tools/ozone/report/createActivity.ts | 85 + .../client/types/tools/ozone/report/defs.ts | 327 +++ .../tools/ozone/report/getAssignments.ts | 49 + .../tools/ozone/report/getHistoricalStats.ts | 55 + .../tools/ozone/report/getLatestReport.ts | 49 + .../types/tools/ozone/report/getLiveStats.ts | 46 + .../types/tools/ozone/report/getReport.ts | 49 + .../tools/ozone/report/listActivities.ts | 45 + .../types/tools/ozone/report/queryReports.ts | 73 + .../types/tools/ozone/report/reassignQueue.ts | 88 + .../types/tools/ozone/report/refreshStats.ts | 46 + .../tools/ozone/report/unassignModerator.ts | 53 + packages/dev-env/src/mock/index.ts | 76 +- packages/dev-env/src/moderator-client.ts | 21 + packages/ozone/src/api/index.ts | 40 + .../ozone/src/api/moderation/emitEvent.ts | 38 + .../ozone/src/api/queue/assignModerator.ts | 31 + packages/ozone/src/api/queue/createQueue.ts | 62 + packages/ozone/src/api/queue/deleteQueue.ts | 56 + .../ozone/src/api/queue/getAssignments.ts | 19 + packages/ozone/src/api/queue/listQueues.ts | 39 + packages/ozone/src/api/queue/routeReports.ts | 44 + .../ozone/src/api/queue/unassignModerator.ts | 26 + packages/ozone/src/api/queue/updateQueue.ts | 54 + .../ozone/src/api/report/assignModerator.ts | 36 + .../ozone/src/api/report/createActivity.ts | 57 + .../ozone/src/api/report/getAssignments.ts | 20 + .../src/api/report/getHistoricalStats.ts | 41 + .../ozone/src/api/report/getLatestReport.ts | 44 + packages/ozone/src/api/report/getLiveStats.ts | 26 + packages/ozone/src/api/report/getReport.ts | 55 + .../ozone/src/api/report/listActivities.ts | 34 + packages/ozone/src/api/report/queryReports.ts | 44 + .../ozone/src/api/report/reassignQueue.ts | 68 + packages/ozone/src/api/report/refreshStats.ts | 27 + .../ozone/src/api/report/unassignModerator.ts | 21 + packages/ozone/src/api/util.ts | 12 + packages/ozone/src/assignment/index.ts | 731 ++++++ packages/ozone/src/config/config.ts | 27 + packages/ozone/src/config/env.ts | 8 + packages/ozone/src/context.ts | 31 + packages/ozone/src/daemon/context.ts | 34 + packages/ozone/src/daemon/job-cursor.ts | 33 + packages/ozone/src/daemon/queue-router.ts | 101 + packages/ozone/src/daemon/stats-computer.ts | 101 + .../src/daemon/strike-expiry-processor.ts | 24 +- ...20260219T164523000Z-create-report-table.ts | 155 ++ ...0260219T165302248Z-moderator-assignment.ts | 42 + ...60225T000000000Z-add-report-queue-table.ts | 41 + ...13T000000000Z-add-report-activity-table.ts | 48 + .../20260318T152058935Z-add-report-stat.ts | 35 + packages/ozone/src/db/migrations/index.ts | 5 + packages/ozone/src/db/pagination.ts | 85 + packages/ozone/src/db/schema/index.ts | 10 + .../src/db/schema/moderator_assignment.ts | 16 + packages/ozone/src/db/schema/report.ts | 27 + .../ozone/src/db/schema/report_activity.ts | 22 + packages/ozone/src/db/schema/report_queue.ts | 21 + packages/ozone/src/db/schema/report_stat.ts | 27 + packages/ozone/src/lexicon/index.ts | 280 +++ packages/ozone/src/lexicon/lexicons.ts | 2072 +++++++++++++++-- .../types/tools/ozone/moderation/emitEvent.ts | 24 + .../tools/ozone/queue/assignModerator.ts | 46 + .../types/tools/ozone/queue/createQueue.ts | 54 + .../lexicon/types/tools/ozone/queue/defs.ts | 99 + .../types/tools/ozone/queue/deleteQueue.ts | 48 + .../types/tools/ozone/queue/getAssignments.ts | 48 + .../types/tools/ozone/queue/listQueues.ts | 50 + .../types/tools/ozone/queue/routeReports.ts | 50 + .../tools/ozone/queue/unassignModerator.ts | 37 + .../types/tools/ozone/queue/updateQueue.ts | 51 + .../tools/ozone/report/assignModerator.ts | 50 + .../tools/ozone/report/createActivity.ts | 60 + .../lexicon/types/tools/ozone/report/defs.ts | 327 +++ .../tools/ozone/report/getAssignments.ts | 48 + .../tools/ozone/report/getHistoricalStats.ts | 54 + .../tools/ozone/report/getLatestReport.ts | 39 + .../types/tools/ozone/report/getLiveStats.ts | 45 + .../types/tools/ozone/report/getReport.ts | 38 + .../tools/ozone/report/listActivities.ts | 44 + .../types/tools/ozone/report/queryReports.ts | 72 + .../types/tools/ozone/report/reassignQueue.ts | 55 + .../types/tools/ozone/report/refreshStats.ts | 46 + .../tools/ozone/report/unassignModerator.ts | 44 + packages/ozone/src/mod-service/index.ts | 48 +- packages/ozone/src/mod-service/report.ts | 408 ++++ packages/ozone/src/queue/service.ts | 599 +++++ packages/ozone/src/report/activity.ts | 234 ++ .../ozone/src/report/handle-report-update.ts | 209 ++ packages/ozone/src/report/reassign.ts | 109 + packages/ozone/src/report/stats.ts | 850 +++++++ packages/ozone/src/report/views.ts | 241 ++ packages/ozone/src/team/index.ts | 11 + packages/ozone/tests/get-report.test.ts | 136 ++ packages/ozone/tests/query-reports.test.ts | 608 +++++ packages/ozone/tests/queue-assignment.test.ts | 428 ++++ packages/ozone/tests/queue-router.test.ts | 306 +++ packages/ozone/tests/queues.test.ts | 690 ++++++ packages/ozone/tests/report-action.test.ts | 308 +++ packages/ozone/tests/report-activity.test.ts | 567 +++++ .../ozone/tests/report-assignment.test.ts | 517 ++++ .../ozone/tests/report-reassign-queue.test.ts | 340 +++ packages/ozone/tests/report-routing.test.ts | 245 ++ packages/ozone/tests/report-stats.test.ts | 545 +++++ 141 files changed, 19034 insertions(+), 352 deletions(-) create mode 100644 .changeset/sour-squids-rush.md create mode 100644 lexicons/tools/ozone/queue/assignModerator.json create mode 100644 lexicons/tools/ozone/queue/createQueue.json create mode 100644 lexicons/tools/ozone/queue/defs.json create mode 100644 lexicons/tools/ozone/queue/deleteQueue.json create mode 100644 lexicons/tools/ozone/queue/getAssignments.json create mode 100644 lexicons/tools/ozone/queue/listQueues.json create mode 100644 lexicons/tools/ozone/queue/routeReports.json create mode 100644 lexicons/tools/ozone/queue/unassignModerator.json create mode 100644 lexicons/tools/ozone/queue/updateQueue.json create mode 100644 lexicons/tools/ozone/report/assignModerator.json create mode 100644 lexicons/tools/ozone/report/createActivity.json create mode 100644 lexicons/tools/ozone/report/getAssignments.json create mode 100644 lexicons/tools/ozone/report/getHistoricalStats.json create mode 100644 lexicons/tools/ozone/report/getLatestReport.json create mode 100644 lexicons/tools/ozone/report/getLiveStats.json create mode 100644 lexicons/tools/ozone/report/getReport.json create mode 100644 lexicons/tools/ozone/report/listActivities.json create mode 100644 lexicons/tools/ozone/report/queryReports.json create mode 100644 lexicons/tools/ozone/report/reassignQueue.json create mode 100644 lexicons/tools/ozone/report/refreshStats.json create mode 100644 lexicons/tools/ozone/report/unassignModerator.json create mode 100644 packages/api/src/client/types/tools/ozone/queue/assignModerator.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/createQueue.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/defs.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/getAssignments.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/listQueues.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/routeReports.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts create mode 100644 packages/api/src/client/types/tools/ozone/queue/updateQueue.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/assignModerator.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/createActivity.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/getAssignments.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/getLatestReport.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/getLiveStats.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/getReport.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/listActivities.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/queryReports.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/reassignQueue.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/refreshStats.ts create mode 100644 packages/api/src/client/types/tools/ozone/report/unassignModerator.ts create mode 100644 packages/ozone/src/api/queue/assignModerator.ts create mode 100644 packages/ozone/src/api/queue/createQueue.ts create mode 100644 packages/ozone/src/api/queue/deleteQueue.ts create mode 100644 packages/ozone/src/api/queue/getAssignments.ts create mode 100644 packages/ozone/src/api/queue/listQueues.ts create mode 100644 packages/ozone/src/api/queue/routeReports.ts create mode 100644 packages/ozone/src/api/queue/unassignModerator.ts create mode 100644 packages/ozone/src/api/queue/updateQueue.ts create mode 100644 packages/ozone/src/api/report/assignModerator.ts create mode 100644 packages/ozone/src/api/report/createActivity.ts create mode 100644 packages/ozone/src/api/report/getAssignments.ts create mode 100644 packages/ozone/src/api/report/getHistoricalStats.ts create mode 100644 packages/ozone/src/api/report/getLatestReport.ts create mode 100644 packages/ozone/src/api/report/getLiveStats.ts create mode 100644 packages/ozone/src/api/report/getReport.ts create mode 100644 packages/ozone/src/api/report/listActivities.ts create mode 100644 packages/ozone/src/api/report/queryReports.ts create mode 100644 packages/ozone/src/api/report/reassignQueue.ts create mode 100644 packages/ozone/src/api/report/refreshStats.ts create mode 100644 packages/ozone/src/api/report/unassignModerator.ts create mode 100644 packages/ozone/src/assignment/index.ts create mode 100644 packages/ozone/src/daemon/job-cursor.ts create mode 100644 packages/ozone/src/daemon/queue-router.ts create mode 100644 packages/ozone/src/daemon/stats-computer.ts create mode 100644 packages/ozone/src/db/migrations/20260219T164523000Z-create-report-table.ts create mode 100644 packages/ozone/src/db/migrations/20260219T165302248Z-moderator-assignment.ts create mode 100644 packages/ozone/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts create mode 100644 packages/ozone/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts create mode 100644 packages/ozone/src/db/migrations/20260318T152058935Z-add-report-stat.ts create mode 100644 packages/ozone/src/db/schema/moderator_assignment.ts create mode 100644 packages/ozone/src/db/schema/report.ts create mode 100644 packages/ozone/src/db/schema/report_activity.ts create mode 100644 packages/ozone/src/db/schema/report_queue.ts create mode 100644 packages/ozone/src/db/schema/report_stat.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/assignModerator.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/createQueue.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/defs.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/deleteQueue.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/getAssignments.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/listQueues.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/routeReports.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/unassignModerator.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/updateQueue.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/assignModerator.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/createActivity.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getAssignments.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getLatestReport.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getLiveStats.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getReport.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/listActivities.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/queryReports.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/reassignQueue.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/refreshStats.ts create mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/unassignModerator.ts create mode 100644 packages/ozone/src/mod-service/report.ts create mode 100644 packages/ozone/src/queue/service.ts create mode 100644 packages/ozone/src/report/activity.ts create mode 100644 packages/ozone/src/report/handle-report-update.ts create mode 100644 packages/ozone/src/report/reassign.ts create mode 100644 packages/ozone/src/report/stats.ts create mode 100644 packages/ozone/src/report/views.ts create mode 100644 packages/ozone/tests/get-report.test.ts create mode 100644 packages/ozone/tests/query-reports.test.ts create mode 100644 packages/ozone/tests/queue-assignment.test.ts create mode 100644 packages/ozone/tests/queue-router.test.ts create mode 100644 packages/ozone/tests/queues.test.ts create mode 100644 packages/ozone/tests/report-action.test.ts create mode 100644 packages/ozone/tests/report-activity.test.ts create mode 100644 packages/ozone/tests/report-assignment.test.ts create mode 100644 packages/ozone/tests/report-reassign-queue.test.ts create mode 100644 packages/ozone/tests/report-routing.test.ts create mode 100644 packages/ozone/tests/report-stats.test.ts diff --git a/.changeset/sour-squids-rush.md b/.changeset/sour-squids-rush.md new file mode 100644 index 00000000000..7840392e80f --- /dev/null +++ b/.changeset/sour-squids-rush.md @@ -0,0 +1,7 @@ +--- +'@atproto/dev-env': patch +'@atproto/ozone': patch +'@atproto/api': patch +--- + +Introduce report based moderation flow in ozone diff --git a/lexicons/tools/ozone/moderation/emitEvent.json b/lexicons/tools/ozone/moderation/emitEvent.json index 256ef164242..968946acc50 100644 --- a/lexicons/tools/ozone/moderation/emitEvent.json +++ b/lexicons/tools/ozone/moderation/emitEvent.json @@ -66,6 +66,11 @@ "externalId": { "type": "string", "description": "An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject." + }, + "reportAction": { + "type": "ref", + "ref": "#reportAction", + "description": "Optional report-level targeting. If provided, this event will be linked to specific reports and reporters may be notified." } } } @@ -86,6 +91,34 @@ "description": "An event with the same external ID already exists for the subject." } ] + }, + "reportAction": { + "type": "object", + "description": "Target specific reports when emitting a moderation event", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Target specific report IDs" + }, + "types": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Target reports matching these report types on the subject (fully qualified NSIDs)" + }, + "all": { + "type": "boolean", + "description": "Target ALL reports on the subject" + }, + "note": { + "type": "string", + "description": "Note to send to reporter(s) when actioning their report" + } + } } } } diff --git a/lexicons/tools/ozone/queue/assignModerator.json b/lexicons/tools/ozone/queue/assignModerator.json new file mode 100644 index 00000000000..e38c8afcfdc --- /dev/null +++ b/lexicons/tools/ozone/queue/assignModerator.json @@ -0,0 +1,40 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.assignModerator", + "defs": { + "main": { + "type": "procedure", + "description": "Assign a user to a queue.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queueId", "did"], + "properties": { + "queueId": { + "type": "integer", + "description": "The ID of the queue to assign the user to." + }, + "did": { + "type": "string", + "description": "DID to be assigned." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "tools.ozone.queue.defs#assignmentView" + } + }, + "errors": [ + { + "name": "InvalidAssignment", + "description": "The specified queue does not exist or is not enabled." + } + ] + } + } +} diff --git a/lexicons/tools/ozone/queue/createQueue.json b/lexicons/tools/ozone/queue/createQueue.json new file mode 100644 index 00000000000..a7a42a23dd4 --- /dev/null +++ b/lexicons/tools/ozone/queue/createQueue.json @@ -0,0 +1,69 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.createQueue", + "defs": { + "main": { + "type": "procedure", + "description": "Create a new moderation queue. Will fail if the queue configuration conflicts with an existing queue.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["name", "subjectTypes", "reportTypes"], + "properties": { + "name": { + "type": "string", + "description": "Display name for the queue (must be unique)" + }, + "subjectTypes": { + "type": "array", + "minLength": 1, + "items": { + "type": "string", + "knownValues": ["account", "record", "message"] + }, + "description": "Subject types this queue accepts" + }, + "collection": { + "type": "string", + "format": "nsid", + "description": "Collection name for record subjects. Required if subjectTypes includes 'record'." + }, + "reportTypes": { + "type": "array", + "items": { + "type": "string" + }, + "minLength": 1, + "maxLength": 25, + "description": "Report reason types (fully qualified NSIDs)" + }, + "description": { + "type": "string", + "description": "Optional description of the queue" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queue"], + "properties": { + "queue": { + "type": "ref", + "ref": "tools.ozone.queue.defs#queueView" + } + } + } + }, + "errors": [ + { + "name": "ConflictingQueue", + "description": "The queue configuration conflicts with an existing queue" + } + ] + } + } +} diff --git a/lexicons/tools/ozone/queue/defs.json b/lexicons/tools/ozone/queue/defs.json new file mode 100644 index 00000000000..81890d80abb --- /dev/null +++ b/lexicons/tools/ozone/queue/defs.json @@ -0,0 +1,148 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.defs", + "defs": { + "queueView": { + "type": "object", + "required": [ + "id", + "name", + "subjectTypes", + "reportTypes", + "createdBy", + "createdAt", + "updatedAt", + "enabled", + "stats" + ], + "properties": { + "id": { + "type": "integer", + "description": "Queue ID" + }, + "name": { + "type": "string", + "description": "Display name of the queue" + }, + "subjectTypes": { + "type": "array", + "minLength": 1, + "items": { + "type": "string", + "knownValues": ["account", "record", "message"] + }, + "description": "Subject types this queue accepts." + }, + "collection": { + "type": "string", + "format": "nsid", + "description": "Collection name for record subjects (e.g., 'app.bsky.feed.post')" + }, + "reportTypes": { + "type": "array", + "items": { + "type": "string" + }, + "minLength": 1, + "description": "Report reason types this queue accepts (fully qualified NSIDs)" + }, + "description": { + "type": "string", + "description": "Optional description of the queue" + }, + "createdBy": { + "type": "string", + "format": "did", + "description": "DID of moderator who created this queue" + }, + "createdAt": { + "type": "string", + "format": "datetime" + }, + "updatedAt": { + "type": "string", + "format": "datetime" + }, + "enabled": { + "type": "boolean", + "description": "Whether this queue is currently active" + }, + "deletedAt": { + "type": "string", + "format": "datetime", + "description": "When the queue was deleted, if applicable" + }, + "stats": { + "type": "ref", + "ref": "#queueStats", + "description": "Statistics about this queue" + } + } + }, + "queueStats": { + "type": "object", + "required": [], + "properties": { + "pendingCount": { + "type": "integer", + "description": "Number of reports in 'open' status" + }, + "actionedCount": { + "type": "integer", + "description": "Number of reports in 'closed' status" + }, + "escalatedCount": { + "type": "integer", + "description": "Number of reports in 'escalated' status" + }, + "inboundCount": { + "type": "integer", + "description": "Reports received in this queue in the last 24 hours." + }, + "actionRate": { + "type": "integer", + "description": "Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. Absent when inboundCount is 0." + }, + "avgHandlingTimeSec": { + "type": "integer", + "description": "Average time in seconds from report creation to close, for reports closed in this period." + }, + "lastUpdated": { + "type": "string", + "format": "datetime", + "description": "When these statistics were last computed" + } + } + }, + "assignmentView": { + "type": "object", + "required": ["id", "did", "queue", "startAt"], + "properties": { + "id": { + "type": "integer" + }, + "did": { + "type": "string", + "format": "did" + }, + "moderator": { + "type": "ref", + "ref": "tools.ozone.team.defs#member", + "description": "The moderator assigned to this queue" + }, + "queue": { + "type": "ref", + "ref": "#queueView" + }, + "startAt": { + "type": "string", + "format": "datetime" + }, + "endAt": { + "type": "string", + "format": "datetime" + } + } + } + } +} diff --git a/lexicons/tools/ozone/queue/deleteQueue.json b/lexicons/tools/ozone/queue/deleteQueue.json new file mode 100644 index 00000000000..29a3735299f --- /dev/null +++ b/lexicons/tools/ozone/queue/deleteQueue.json @@ -0,0 +1,43 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.deleteQueue", + "defs": { + "main": { + "type": "procedure", + "description": "Delete a moderation queue. Optionally migrate reports to another queue.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queueId"], + "properties": { + "queueId": { + "type": "integer", + "description": "ID of the queue to delete" + }, + "migrateToQueueId": { + "type": "integer", + "description": "Optional: migrate all reports to this queue. If not specified, reports will be set to unassigned (-1)." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["deleted"], + "properties": { + "deleted": { + "type": "boolean" + }, + "reportsMigrated": { + "type": "integer", + "description": "Number of reports that were migrated (if migration occurred)" + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/queue/getAssignments.json b/lexicons/tools/ozone/queue/getAssignments.json new file mode 100644 index 00000000000..2eb5c65be8c --- /dev/null +++ b/lexicons/tools/ozone/queue/getAssignments.json @@ -0,0 +1,63 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.getAssignments", + "defs": { + "main": { + "type": "query", + "description": "Get moderator assignments, optionally filtered by active status, queue, or moderator.", + "parameters": { + "type": "params", + "properties": { + "onlyActive": { + "type": "boolean", + "default": true, + "description": "When true, only returns active assignments." + }, + "queueIds": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "If specified, returns assignments for these queues only." + }, + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + }, + "description": "If specified, returns assignments for these moderators only." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["assignments"], + "properties": { + "cursor": { + "type": "string" + }, + "assignments": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.queue.defs#assignmentView" + } + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/queue/listQueues.json b/lexicons/tools/ozone/queue/listQueues.json new file mode 100644 index 00000000000..e9f9caf47e3 --- /dev/null +++ b/lexicons/tools/ozone/queue/listQueues.json @@ -0,0 +1,61 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.listQueues", + "defs": { + "main": { + "type": "query", + "description": "List all configured moderation queues with statistics.", + "parameters": { + "type": "params", + "properties": { + "enabled": { + "type": "boolean", + "description": "Filter by enabled status. If not specified, returns all queues." + }, + "subjectType": { + "type": "string", + "description": "Filter queues that handle this subject type ('account' or 'record')." + }, + "collection": { + "type": "string", + "description": "Filter queues by collection name (e.g. 'app.bsky.feed.post')." + }, + "reportTypes": { + "type": "array", + "items": { "type": "string" }, + "maxLength": 10, + "description": "Filter queues that handle any of these report reason types." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queues"], + "properties": { + "cursor": { + "type": "string" + }, + "queues": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.queue.defs#queueView" + } + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/queue/routeReports.json b/lexicons/tools/ozone/queue/routeReports.json new file mode 100644 index 00000000000..d69ab68f741 --- /dev/null +++ b/lexicons/tools/ozone/queue/routeReports.json @@ -0,0 +1,50 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.routeReports", + "defs": { + "main": { + "type": "procedure", + "description": "Route reports within an ID range to matching queues based.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["startReportId", "endReportId"], + "properties": { + "startReportId": { + "type": "integer", + "description": "Start of report ID range (inclusive)." + }, + "endReportId": { + "type": "integer", + "description": "End of report ID range (inclusive). Difference between start and end must be less than 5,000." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["assigned", "unmatched"], + "properties": { + "assigned": { + "type": "integer", + "description": "The number of reports assigned to a queue." + }, + "unmatched": { + "type": "integer", + "description": "The number of reports with no matching queue." + } + } + } + }, + "errors": [ + { + "name": "OutOfRange", + "description": "The request is invalid, such as missing required fields or invalid field values." + } + ] + } + } +} diff --git a/lexicons/tools/ozone/queue/unassignModerator.json b/lexicons/tools/ozone/queue/unassignModerator.json new file mode 100644 index 00000000000..633ac817c8a --- /dev/null +++ b/lexicons/tools/ozone/queue/unassignModerator.json @@ -0,0 +1,34 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.unassignModerator", + "defs": { + "main": { + "type": "procedure", + "description": "Remove a user's assignment from a queue.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queueId", "did"], + "properties": { + "queueId": { + "type": "integer", + "description": "The ID of the queue to unassign the user from." + }, + "did": { + "type": "string", + "format": "did", + "description": "DID to be unassigned." + } + } + } + }, + "errors": [ + { + "name": "InvalidAssignment", + "description": "No active assignment exists for the given queue and user." + } + ] + } + } +} diff --git a/lexicons/tools/ozone/queue/updateQueue.json b/lexicons/tools/ozone/queue/updateQueue.json new file mode 100644 index 00000000000..a813f427d2e --- /dev/null +++ b/lexicons/tools/ozone/queue/updateQueue.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "tools.ozone.queue.updateQueue", + "defs": { + "main": { + "type": "procedure", + "description": "Update queue properties. Currently only supports updating the name and enabled status to prevent configuration conflicts.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queueId"], + "properties": { + "queueId": { + "type": "integer", + "description": "ID of the queue to update" + }, + "name": { + "type": "string", + "description": "New display name for the queue" + }, + "enabled": { + "type": "boolean", + "description": "Enable or disable the queue" + }, + "description": { + "type": "string", + "description": "Optional description of the queue" + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["queue"], + "properties": { + "queue": { + "type": "ref", + "ref": "tools.ozone.queue.defs#queueView" + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/assignModerator.json b/lexicons/tools/ozone/report/assignModerator.json new file mode 100644 index 00000000000..f7ec75474ac --- /dev/null +++ b/lexicons/tools/ozone/report/assignModerator.json @@ -0,0 +1,53 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.assignModerator", + "defs": { + "main": { + "type": "procedure", + "description": "Assign a report to a user. Defaults to the caller. Admins may assign to any moderator.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["reportId"], + "properties": { + "reportId": { + "type": "integer", + "description": "The ID of the report to assign." + }, + "queueId": { + "type": "integer", + "description": "Optional queue ID to associate the assignment with. If not provided and the report has been assigned on a queue before, it will stay on that queue." + }, + "did": { + "type": "string", + "format": "did", + "description": "DID to be assigned. Defaults to the caller's DID. Admins may assign to any moderator." + }, + "isPermanent": { + "type": "boolean", + "description": "When true, the assignment has no expiry (endAt is null). Throws AlreadyAssigned if another user already has a permanent assignment on this report." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "tools.ozone.report.defs#assignmentView" + } + }, + "errors": [ + { + "name": "AlreadyAssigned", + "description": "The report is already assigned to another user." + }, + { + "name": "InvalidAssignment", + "description": "The report ID or queue ID is invalid." + } + ] + } + } +} diff --git a/lexicons/tools/ozone/report/createActivity.json b/lexicons/tools/ozone/report/createActivity.json new file mode 100644 index 00000000000..254df962b50 --- /dev/null +++ b/lexicons/tools/ozone/report/createActivity.json @@ -0,0 +1,75 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.createActivity", + "defs": { + "main": { + "type": "procedure", + "description": "Register an activity on a report. For state-change activity types, validates the transition and updates report.status atomically.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["reportId", "activity"], + "properties": { + "reportId": { + "type": "integer", + "description": "ID of the report to record activity on" + }, + "activity": { + "type": "union", + "refs": [ + "tools.ozone.report.defs#queueActivity", + "tools.ozone.report.defs#assignmentActivity", + "tools.ozone.report.defs#escalationActivity", + "tools.ozone.report.defs#closeActivity", + "tools.ozone.report.defs#reopenActivity", + "tools.ozone.report.defs#noteActivity" + ], + "description": "The type of activity to record." + }, + "internalNote": { + "type": "string", + "description": "Optional moderator-only note. Not visible to reporters." + }, + "publicNote": { + "type": "string", + "description": "Optional public-facing note, potentially visible to the reporter." + }, + "isAutomated": { + "type": "boolean", + "description": "Set true when this activity is triggered by an automated process. Defaults to false.", + "default": false + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["activity"], + "properties": { + "activity": { + "type": "ref", + "ref": "tools.ozone.report.defs#reportActivityView" + } + } + } + }, + "errors": [ + { + "name": "ReportNotFound", + "description": "No report exists with the given reportId" + }, + { + "name": "InvalidStateTransition", + "description": "The requested state transition is not permitted from the report's current status" + }, + { + "name": "AlreadyInTargetState", + "description": "The report is already in the status implied by this activity type" + } + ] + } + } +} diff --git a/lexicons/tools/ozone/report/defs.json b/lexicons/tools/ozone/report/defs.json index 5eca2699585..e5f6efd1180 100644 --- a/lexicons/tools/ozone/report/defs.json +++ b/lexicons/tools/ozone/report/defs.json @@ -218,6 +218,370 @@ "reasonSelfHarmOther": { "type": "token", "description": "Other dangerous content" + }, + "reportAssignment": { + "type": "object", + "description": "Information about the moderator currently assigned to a report.", + "required": ["did", "assignedAt"], + "properties": { + "did": { + "type": "string", + "format": "did", + "description": "DID of the assigned moderator" + }, + "moderator": { + "type": "ref", + "ref": "tools.ozone.team.defs#member", + "description": "Full member record of the assigned moderator" + }, + "assignedAt": { + "type": "string", + "format": "datetime", + "description": "When the report was assigned" + } + } + }, + "reportView": { + "type": "object", + "required": [ + "id", + "eventId", + "status", + "subject", + "reportType", + "reportedBy", + "reporter", + "createdAt" + ], + "properties": { + "id": { + "type": "integer", + "description": "Report ID" + }, + "eventId": { + "type": "integer", + "description": "ID of the moderation event that created this report" + }, + "status": { + "type": "string", + "knownValues": ["open", "closed", "escalated", "queued", "assigned"], + "description": "Current status of the report" + }, + "subject": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#subjectView", + "description": "The subject that was reported with full details" + }, + "reportType": { + "type": "ref", + "ref": "com.atproto.moderation.defs#reasonType", + "description": "Type of report" + }, + "reportedBy": { + "type": "string", + "format": "did", + "description": "DID of the user who made the report" + }, + "reporter": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#subjectView", + "description": "Full subject view of the reporter account" + }, + "comment": { + "type": "string", + "description": "Comment provided by the reporter" + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "When the report was created" + }, + "updatedAt": { + "type": "string", + "format": "datetime", + "description": "When the report was last updated" + }, + "queuedAt": { + "type": "string", + "format": "datetime", + "description": "When the report was assigned to its current queue" + }, + "actionEventIds": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Array of moderation event IDs representing actions taken on this report (sorted DESC, most recent first)" + }, + "actions": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#modEventView" + }, + "description": "Optional: expanded action events" + }, + "actionNote": { + "type": "string", + "description": "Note sent to reporter when report was actioned" + }, + "subjectStatus": { + "type": "ref", + "ref": "tools.ozone.moderation.defs#subjectStatusView", + "description": "Current status of the reported subject" + }, + "relatedReportCount": { + "type": "integer", + "description": "Number of other pending reports on the same subject" + }, + "assignment": { + "type": "ref", + "ref": "#reportAssignment", + "description": "Information about moderator currently assigned to this report (if any)" + }, + "queue": { + "type": "ref", + "ref": "tools.ozone.queue.defs#queueView", + "description": "The queue this report is assigned to (if any)" + }, + "isMuted": { + "type": "boolean", + "description": "Whether this report is muted. A report is muted if the reporter was muted or the subject was muted at the time the report was created." + } + } + }, + "queueActivity": { + "type": "object", + "description": "Activity recording a report being routed to a queue.", + "properties": { + "previousStatus": { + "type": "string", + "knownValues": ["open", "closed", "escalated", "queued", "assigned"], + "description": "The report's status before this activity. Populated automatically from the report row; not required in input." + } + } + }, + "assignmentActivity": { + "type": "object", + "description": "Activity recording a moderator being assigned to a report.", + "properties": { + "previousStatus": { + "type": "string", + "knownValues": ["open", "closed", "escalated", "queued", "assigned"], + "description": "The report's status before this activity. Populated automatically from the report row; not required in input." + } + } + }, + "escalationActivity": { + "type": "object", + "description": "Activity recording a report being escalated.", + "properties": { + "previousStatus": { + "type": "string", + "knownValues": ["open", "closed", "escalated", "queued", "assigned"], + "description": "The report's status before this activity. Populated automatically from the report row; not required in input." + } + } + }, + "closeActivity": { + "type": "object", + "description": "Activity recording a report being closed.", + "properties": { + "previousStatus": { + "type": "string", + "knownValues": ["open", "closed", "escalated", "queued", "assigned"], + "description": "The report's status before this activity. Populated automatically from the report row; not required in input." + } + } + }, + "reopenActivity": { + "type": "object", + "description": "Activity recording a closed report being reopened. Only valid when the report is in 'closed' status.", + "properties": { + "previousStatus": { + "type": "string", + "knownValues": ["open", "closed", "escalated", "queued", "assigned"], + "description": "The report's status before this activity. Populated automatically from the report row; not required in input." + } + } + }, + "noteActivity": { + "type": "object", + "description": "Activity recording a note on a report. Use internalNote for moderator-only notes or publicNote for reporter-visible notes (or both).", + "properties": {} + }, + "reportActivityView": { + "type": "object", + "description": "A single activity entry on a report.", + "required": [ + "id", + "reportId", + "activity", + "isAutomated", + "createdBy", + "createdAt" + ], + "properties": { + "id": { + "type": "integer", + "description": "Activity ID" + }, + "reportId": { + "type": "integer", + "description": "ID of the report this activity belongs to" + }, + "activity": { + "type": "union", + "refs": [ + "#queueActivity", + "#assignmentActivity", + "#escalationActivity", + "#closeActivity", + "#reopenActivity", + "#noteActivity" + ], + "description": "The typed activity object describing what occurred." + }, + "internalNote": { + "type": "string", + "description": "Optional moderator-only note. Not visible to reporters." + }, + "publicNote": { + "type": "string", + "description": "Optional public note, potentially visible to the reporter." + }, + "meta": { + "type": "unknown", + "description": "Extensible JSON payload for loose activity-specific metadata (e.g. assignmentId)." + }, + "isAutomated": { + "type": "boolean", + "description": "True if this activity was created by an automated process (e.g. queue router) rather than a direct human action." + }, + "createdBy": { + "type": "string", + "format": "did", + "description": "DID of the actor who created this activity, or the service DID for automated activities." + }, + "moderator": { + "type": "ref", + "ref": "tools.ozone.team.defs#member", + "description": "Full member record of the moderator who created this activity" + }, + "createdAt": { + "type": "string", + "format": "datetime", + "description": "When this activity was created" + } + } + }, + "liveStats": { + "description": "Live statistics for reports for the current calendar day, filterable by queue, moderator, or report type.", + "type": "object", + "properties": { + "pendingCount": { + "type": "integer", + "description": "Number of reports currently not closed." + }, + "actionedCount": { + "type": "integer", + "description": "Number of reports closed today." + }, + "escalatedCount": { + "type": "integer", + "description": "Number of reports escalated today." + }, + "inboundCount": { + "type": "integer", + "description": "Reports received today." + }, + "actionRate": { + "type": "integer", + "description": "Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer." + }, + "avgHandlingTimeSec": { + "type": "integer", + "description": "Average time in seconds from report creation (or moderator assignment) to close." + }, + "lastUpdated": { + "type": "string", + "format": "datetime", + "description": "When these statistics were last computed." + } + } + }, + "historicalStats": { + "description": "A single daily snapshot of report statistics for a calendar date.", + "type": "object", + "required": ["date"], + "properties": { + "date": { + "type": "string", + "description": "The calendar date this snapshot covers (YYYY-MM-DD)." + }, + "computedAt": { + "type": "string", + "format": "datetime", + "description": "When this snapshot was last computed." + }, + "pendingCount": { + "type": "integer", + "description": "Number of reports not closed at time of computation." + }, + "actionedCount": { + "type": "integer", + "description": "Number of reports closed during this day." + }, + "escalatedCount": { + "type": "integer", + "description": "Number of reports escalated during this day." + }, + "inboundCount": { + "type": "integer", + "description": "Reports received during this day." + }, + "actionRate": { + "type": "integer", + "description": "Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer." + }, + "avgHandlingTimeSec": { + "type": "integer", + "description": "Average time in seconds from report creation (or moderator assignment) to close." + } + } + }, + "assignmentView": { + "type": "object", + "required": ["id", "did", "reportId", "startAt"], + "properties": { + "id": { + "type": "integer" + }, + "did": { + "type": "string", + "format": "did" + }, + "moderator": { + "type": "ref", + "ref": "tools.ozone.team.defs#member", + "description": "The moderator assigned to this report" + }, + "queue": { + "type": "ref", + "ref": "tools.ozone.queue.defs#queueView" + }, + "reportId": { + "type": "integer" + }, + "startAt": { + "type": "string", + "format": "datetime" + }, + "endAt": { + "type": "string", + "format": "datetime" + } + } } } } diff --git a/lexicons/tools/ozone/report/getAssignments.json b/lexicons/tools/ozone/report/getAssignments.json new file mode 100644 index 00000000000..55bf7ddbeef --- /dev/null +++ b/lexicons/tools/ozone/report/getAssignments.json @@ -0,0 +1,65 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.getAssignments", + "defs": { + "main": { + "type": "query", + "description": "Get assignments for reports.", + "parameters": { + "type": "params", + "properties": { + "onlyActive": { + "type": "boolean", + "default": true, + "description": "When true, only returns active assignments." + }, + "reportIds": { + "type": "array", + "items": { + "type": "integer" + }, + "maxLength": 50, + "description": "If specified, returns assignments for these reports only." + }, + "dids": { + "type": "array", + "items": { + "type": "string", + "format": "did" + }, + "maxLength": 50, + "description": "If specified, returns assignments for these moderators only." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["assignments"], + "properties": { + "cursor": { + "type": "string" + }, + "assignments": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.report.defs#assignmentView" + } + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/getHistoricalStats.json b/lexicons/tools/ozone/report/getHistoricalStats.json new file mode 100644 index 00000000000..0d8cd6709d5 --- /dev/null +++ b/lexicons/tools/ozone/report/getHistoricalStats.json @@ -0,0 +1,71 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.getHistoricalStats", + "defs": { + "main": { + "type": "query", + "description": "Get historical daily report statistics. Returns a paginated list of daily stat snapshots, newest first. Filter by queue, moderator, or report type.", + "parameters": { + "type": "params", + "properties": { + "queueId": { + "type": "integer", + "description": "Filter stats by queue. Use -1 for unqueued reports." + }, + "moderatorDid": { + "type": "string", + "format": "did", + "description": "Filter stats by moderator DID." + }, + "reportTypes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Filter stats by report types." + }, + "startDate": { + "type": "string", + "format": "datetime", + "description": "Earliest date to include (inclusive)." + }, + "endDate": { + "type": "string", + "format": "datetime", + "description": "Latest date to include (inclusive)." + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 30, + "description": "Maximum number of entries to return." + }, + "cursor": { + "type": "string", + "description": "Pagination cursor." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["stats"], + "properties": { + "stats": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.report.defs#historicalStats" + } + }, + "cursor": { + "type": "string" + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/getLatestReport.json b/lexicons/tools/ozone/report/getLatestReport.json new file mode 100644 index 00000000000..83357543120 --- /dev/null +++ b/lexicons/tools/ozone/report/getLatestReport.json @@ -0,0 +1,33 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.getLatestReport", + "defs": { + "main": { + "type": "query", + "description": "Get the most recent report.", + "parameters": { + "type": "params", + "properties": {} + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["report"], + "properties": { + "report": { + "type": "ref", + "ref": "tools.ozone.report.defs#reportView" + } + } + } + }, + "errors": [ + { + "name": "NotFound", + "description": "No report found." + } + ] + } + } +} diff --git a/lexicons/tools/ozone/report/getLiveStats.json b/lexicons/tools/ozone/report/getLiveStats.json new file mode 100644 index 00000000000..80a05fd3160 --- /dev/null +++ b/lexicons/tools/ozone/report/getLiveStats.json @@ -0,0 +1,45 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.getLiveStats", + "defs": { + "main": { + "type": "query", + "description": "Get live report statistics from the past 24 hours. Filter by queue, moderator, or report type. Omit all parameters for aggregate stats.", + "parameters": { + "type": "params", + "properties": { + "queueId": { + "type": "integer", + "description": "Filter stats by queue. Use -1 for unqueued reports." + }, + "moderatorDid": { + "type": "string", + "format": "did", + "description": "Filter stats by moderator DID." + }, + "reportTypes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Filter stats by report types." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["stats"], + "properties": { + "stats": { + "type": "ref", + "ref": "tools.ozone.report.defs#liveStats", + "description": "Statistics for the requested filter." + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/getReport.json b/lexicons/tools/ozone/report/getReport.json new file mode 100644 index 00000000000..709e93e42bc --- /dev/null +++ b/lexicons/tools/ozone/report/getReport.json @@ -0,0 +1,33 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.getReport", + "defs": { + "main": { + "type": "query", + "description": "Get details about a single moderation report by ID.", + "parameters": { + "type": "params", + "required": ["id"], + "properties": { + "id": { + "type": "integer", + "description": "The ID of the report to retrieve." + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "tools.ozone.report.defs#reportView" + } + }, + "errors": [ + { + "name": "NotFound", + "description": "No report found." + } + ] + } + } +} diff --git a/lexicons/tools/ozone/report/listActivities.json b/lexicons/tools/ozone/report/listActivities.json new file mode 100644 index 00000000000..e5eaa7ded21 --- /dev/null +++ b/lexicons/tools/ozone/report/listActivities.json @@ -0,0 +1,48 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.listActivities", + "defs": { + "main": { + "type": "query", + "description": "List all activities for a report, sorted most-recent-first.", + "parameters": { + "type": "params", + "required": ["reportId"], + "properties": { + "reportId": { + "type": "integer", + "description": "ID of the report whose activities to list" + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["activities"], + "properties": { + "activities": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.report.defs#reportActivityView" + } + }, + "cursor": { + "type": "string" + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/queryReports.json b/lexicons/tools/ozone/report/queryReports.json new file mode 100644 index 00000000000..e15da3339cd --- /dev/null +++ b/lexicons/tools/ozone/report/queryReports.json @@ -0,0 +1,120 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.queryReports", + "defs": { + "main": { + "type": "query", + "description": "View moderation reports. Reports are individual instances of content being reported, as opposed to subject statuses which aggregate reports at the subject level.", + "parameters": { + "type": "params", + "required": ["status"], + "properties": { + "queueId": { + "type": "integer", + "description": "Filter by queue ID. Use -1 for unassigned reports." + }, + "reportTypes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Filter by report types (fully qualified string in the format of com.atproto.moderation.defs#reason)." + }, + "status": { + "type": "string", + "knownValues": [ + "open", + "closed", + "escalated", + "queued", + "assigned" + ], + "description": "Filter by report status." + }, + "subject": { + "type": "string", + "format": "uri", + "description": "Filter by subject DID or AT-URI." + }, + "did": { + "type": "string", + "format": "did", + "description": "Filter to reports where the subject is this DID or any record owned by this DID. Unlike `subject` (which scopes to a specific account or record), this returns all reports tied to the DID across both account-level and record-level subjects." + }, + "subjectType": { + "type": "string", + "description": "If specified, reports of the given type (account or record) will be returned.", + "knownValues": ["account", "record"] + }, + "collections": { + "type": "array", + "maxLength": 20, + "description": "If specified, reports where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", + "items": { + "type": "string", + "format": "nsid" + } + }, + "reportedAfter": { + "type": "string", + "format": "datetime", + "description": "Retrieve reports created after a given timestamp" + }, + "reportedBefore": { + "type": "string", + "format": "datetime", + "description": "Retrieve reports created before a given timestamp" + }, + "isMuted": { + "type": "boolean", + "default": false, + "description": "Filter by muted status. true returns only muted reports, false returns only unmuted reports. Defaults to false." + }, + "assignedTo": { + "type": "string", + "format": "did", + "description": "Filter by the DID of the moderator permanently assigned to the report." + }, + "sortField": { + "type": "string", + "default": "createdAt", + "enum": ["createdAt", "updatedAt"] + }, + "sortDirection": { + "type": "string", + "default": "desc", + "enum": ["asc", "desc"] + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { + "type": "string" + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["reports"], + "properties": { + "cursor": { + "type": "string" + }, + "reports": { + "type": "array", + "items": { + "type": "ref", + "ref": "tools.ozone.report.defs#reportView" + } + } + } + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/reassignQueue.json b/lexicons/tools/ozone/report/reassignQueue.json new file mode 100644 index 00000000000..3916654367c --- /dev/null +++ b/lexicons/tools/ozone/report/reassignQueue.json @@ -0,0 +1,66 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.reassignQueue", + "defs": { + "main": { + "type": "procedure", + "description": "Manually reassign a report to a different queue (or unassign it). Records a queueActivity entry on the report.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["reportId", "queueId"], + "properties": { + "reportId": { + "type": "integer", + "description": "ID of the report to reassign" + }, + "queueId": { + "type": "integer", + "description": "Target queue ID. Use -1 to unassign from any queue." + }, + "comment": { + "type": "string", + "description": "Optional moderator-only note recorded on the resulting queueActivity as internalNote." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["report"], + "properties": { + "report": { + "type": "ref", + "ref": "tools.ozone.report.defs#reportView" + } + } + } + }, + "errors": [ + { + "name": "ReportNotFound", + "description": "No report exists with the given reportId" + }, + { + "name": "ReportClosed", + "description": "The report is closed and cannot be reassigned" + }, + { + "name": "AlreadyInTargetQueue", + "description": "The report is already assigned to the target queue" + }, + { + "name": "QueueNotFound", + "description": "No active queue exists with the given queueId" + }, + { + "name": "QueueDisabled", + "description": "The target queue is disabled and cannot receive new assignments" + } + ] + } + } +} diff --git a/lexicons/tools/ozone/report/refreshStats.json b/lexicons/tools/ozone/report/refreshStats.json new file mode 100644 index 00000000000..126827a0460 --- /dev/null +++ b/lexicons/tools/ozone/report/refreshStats.json @@ -0,0 +1,41 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.refreshStats", + "defs": { + "main": { + "type": "procedure", + "description": "Recompute report statistics for a date range. Useful for backfilling after failures or data corrections.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["startDate", "endDate"], + "properties": { + "startDate": { + "type": "string", + "description": "Start date for recomputation, inclusive (YYYY-MM-DD)." + }, + "endDate": { + "type": "string", + "description": "End date for recomputation, inclusive (YYYY-MM-DD)." + }, + "queueIds": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "Optional list of queue IDs to recompute. Omit to recompute all groups." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "properties": {} + } + } + } + } +} diff --git a/lexicons/tools/ozone/report/unassignModerator.json b/lexicons/tools/ozone/report/unassignModerator.json new file mode 100644 index 00000000000..5f12019f4ca --- /dev/null +++ b/lexicons/tools/ozone/report/unassignModerator.json @@ -0,0 +1,36 @@ +{ + "lexicon": 1, + "id": "tools.ozone.report.unassignModerator", + "defs": { + "main": { + "type": "procedure", + "description": "Remove report assignment.", + "input": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["reportId"], + "properties": { + "reportId": { + "type": "integer", + "description": "The ID of the report to unassign." + } + } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "ref", + "ref": "tools.ozone.report.defs#assignmentView" + } + }, + "errors": [ + { + "name": "InvalidAssignment", + "description": "The report ID is invalid." + } + ] + } + } +} diff --git a/packages/api/src/client/index.ts b/packages/api/src/client/index.ts index 6d87a8453b0..2629d4681ac 100644 --- a/packages/api/src/client/index.ts +++ b/packages/api/src/client/index.ts @@ -316,7 +316,28 @@ import * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation import * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js' import * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js' import * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js' +import * as ToolsOzoneQueueAssignModerator from './types/tools/ozone/queue/assignModerator.js' +import * as ToolsOzoneQueueCreateQueue from './types/tools/ozone/queue/createQueue.js' +import * as ToolsOzoneQueueDefs from './types/tools/ozone/queue/defs.js' +import * as ToolsOzoneQueueDeleteQueue from './types/tools/ozone/queue/deleteQueue.js' +import * as ToolsOzoneQueueGetAssignments from './types/tools/ozone/queue/getAssignments.js' +import * as ToolsOzoneQueueListQueues from './types/tools/ozone/queue/listQueues.js' +import * as ToolsOzoneQueueRouteReports from './types/tools/ozone/queue/routeReports.js' +import * as ToolsOzoneQueueUnassignModerator from './types/tools/ozone/queue/unassignModerator.js' +import * as ToolsOzoneQueueUpdateQueue from './types/tools/ozone/queue/updateQueue.js' +import * as ToolsOzoneReportAssignModerator from './types/tools/ozone/report/assignModerator.js' +import * as ToolsOzoneReportCreateActivity from './types/tools/ozone/report/createActivity.js' import * as ToolsOzoneReportDefs from './types/tools/ozone/report/defs.js' +import * as ToolsOzoneReportGetAssignments from './types/tools/ozone/report/getAssignments.js' +import * as ToolsOzoneReportGetHistoricalStats from './types/tools/ozone/report/getHistoricalStats.js' +import * as ToolsOzoneReportGetLatestReport from './types/tools/ozone/report/getLatestReport.js' +import * as ToolsOzoneReportGetLiveStats from './types/tools/ozone/report/getLiveStats.js' +import * as ToolsOzoneReportGetReport from './types/tools/ozone/report/getReport.js' +import * as ToolsOzoneReportListActivities from './types/tools/ozone/report/listActivities.js' +import * as ToolsOzoneReportQueryReports from './types/tools/ozone/report/queryReports.js' +import * as ToolsOzoneReportReassignQueue from './types/tools/ozone/report/reassignQueue.js' +import * as ToolsOzoneReportRefreshStats from './types/tools/ozone/report/refreshStats.js' +import * as ToolsOzoneReportUnassignModerator from './types/tools/ozone/report/unassignModerator.js' import * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js' import * as ToolsOzoneSafelinkDefs from './types/tools/ozone/safelink/defs.js' import * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js' @@ -656,7 +677,28 @@ export * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation export * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js' export * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js' export * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js' +export * as ToolsOzoneQueueAssignModerator from './types/tools/ozone/queue/assignModerator.js' +export * as ToolsOzoneQueueCreateQueue from './types/tools/ozone/queue/createQueue.js' +export * as ToolsOzoneQueueDefs from './types/tools/ozone/queue/defs.js' +export * as ToolsOzoneQueueDeleteQueue from './types/tools/ozone/queue/deleteQueue.js' +export * as ToolsOzoneQueueGetAssignments from './types/tools/ozone/queue/getAssignments.js' +export * as ToolsOzoneQueueListQueues from './types/tools/ozone/queue/listQueues.js' +export * as ToolsOzoneQueueRouteReports from './types/tools/ozone/queue/routeReports.js' +export * as ToolsOzoneQueueUnassignModerator from './types/tools/ozone/queue/unassignModerator.js' +export * as ToolsOzoneQueueUpdateQueue from './types/tools/ozone/queue/updateQueue.js' +export * as ToolsOzoneReportAssignModerator from './types/tools/ozone/report/assignModerator.js' +export * as ToolsOzoneReportCreateActivity from './types/tools/ozone/report/createActivity.js' export * as ToolsOzoneReportDefs from './types/tools/ozone/report/defs.js' +export * as ToolsOzoneReportGetAssignments from './types/tools/ozone/report/getAssignments.js' +export * as ToolsOzoneReportGetHistoricalStats from './types/tools/ozone/report/getHistoricalStats.js' +export * as ToolsOzoneReportGetLatestReport from './types/tools/ozone/report/getLatestReport.js' +export * as ToolsOzoneReportGetLiveStats from './types/tools/ozone/report/getLiveStats.js' +export * as ToolsOzoneReportGetReport from './types/tools/ozone/report/getReport.js' +export * as ToolsOzoneReportListActivities from './types/tools/ozone/report/listActivities.js' +export * as ToolsOzoneReportQueryReports from './types/tools/ozone/report/queryReports.js' +export * as ToolsOzoneReportReassignQueue from './types/tools/ozone/report/reassignQueue.js' +export * as ToolsOzoneReportRefreshStats from './types/tools/ozone/report/refreshStats.js' +export * as ToolsOzoneReportUnassignModerator from './types/tools/ozone/report/unassignModerator.js' export * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js' export * as ToolsOzoneSafelinkDefs from './types/tools/ozone/safelink/defs.js' export * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js' @@ -5492,6 +5534,8 @@ export class ToolsOzoneNS { communication: ToolsOzoneCommunicationNS hosting: ToolsOzoneHostingNS moderation: ToolsOzoneModerationNS + queue: ToolsOzoneQueueNS + report: ToolsOzoneReportNS safelink: ToolsOzoneSafelinkNS server: ToolsOzoneServerNS set: ToolsOzoneSetNS @@ -5505,6 +5549,8 @@ export class ToolsOzoneNS { this.communication = new ToolsOzoneCommunicationNS(client) this.hosting = new ToolsOzoneHostingNS(client) this.moderation = new ToolsOzoneModerationNS(client) + this.queue = new ToolsOzoneQueueNS(client) + this.report = new ToolsOzoneReportNS(client) this.safelink = new ToolsOzoneSafelinkNS(client) this.server = new ToolsOzoneServerNS(client) this.set = new ToolsOzoneSetNS(client) @@ -5778,6 +5824,252 @@ export class ToolsOzoneModerationNS { } } +export class ToolsOzoneQueueNS { + _client: XrpcClient + + constructor(client: XrpcClient) { + this._client = client + } + + assignModerator( + data?: ToolsOzoneQueueAssignModerator.InputSchema, + opts?: ToolsOzoneQueueAssignModerator.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.queue.assignModerator', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneQueueAssignModerator.toKnownErr(e) + }) + } + + createQueue( + data?: ToolsOzoneQueueCreateQueue.InputSchema, + opts?: ToolsOzoneQueueCreateQueue.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.queue.createQueue', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneQueueCreateQueue.toKnownErr(e) + }) + } + + deleteQueue( + data?: ToolsOzoneQueueDeleteQueue.InputSchema, + opts?: ToolsOzoneQueueDeleteQueue.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.queue.deleteQueue', + opts?.qp, + data, + opts, + ) + } + + getAssignments( + params?: ToolsOzoneQueueGetAssignments.QueryParams, + opts?: ToolsOzoneQueueGetAssignments.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.queue.getAssignments', + params, + undefined, + opts, + ) + } + + listQueues( + params?: ToolsOzoneQueueListQueues.QueryParams, + opts?: ToolsOzoneQueueListQueues.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.queue.listQueues', + params, + undefined, + opts, + ) + } + + routeReports( + data?: ToolsOzoneQueueRouteReports.InputSchema, + opts?: ToolsOzoneQueueRouteReports.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.queue.routeReports', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneQueueRouteReports.toKnownErr(e) + }) + } + + unassignModerator( + data?: ToolsOzoneQueueUnassignModerator.InputSchema, + opts?: ToolsOzoneQueueUnassignModerator.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.queue.unassignModerator', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneQueueUnassignModerator.toKnownErr(e) + }) + } + + updateQueue( + data?: ToolsOzoneQueueUpdateQueue.InputSchema, + opts?: ToolsOzoneQueueUpdateQueue.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.queue.updateQueue', + opts?.qp, + data, + opts, + ) + } +} + +export class ToolsOzoneReportNS { + _client: XrpcClient + + constructor(client: XrpcClient) { + this._client = client + } + + assignModerator( + data?: ToolsOzoneReportAssignModerator.InputSchema, + opts?: ToolsOzoneReportAssignModerator.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.report.assignModerator', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneReportAssignModerator.toKnownErr(e) + }) + } + + createActivity( + data?: ToolsOzoneReportCreateActivity.InputSchema, + opts?: ToolsOzoneReportCreateActivity.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.report.createActivity', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneReportCreateActivity.toKnownErr(e) + }) + } + + getAssignments( + params?: ToolsOzoneReportGetAssignments.QueryParams, + opts?: ToolsOzoneReportGetAssignments.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.report.getAssignments', + params, + undefined, + opts, + ) + } + + getHistoricalStats( + params?: ToolsOzoneReportGetHistoricalStats.QueryParams, + opts?: ToolsOzoneReportGetHistoricalStats.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.report.getHistoricalStats', + params, + undefined, + opts, + ) + } + + getLatestReport( + params?: ToolsOzoneReportGetLatestReport.QueryParams, + opts?: ToolsOzoneReportGetLatestReport.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.report.getLatestReport', params, undefined, opts) + .catch((e) => { + throw ToolsOzoneReportGetLatestReport.toKnownErr(e) + }) + } + + getLiveStats( + params?: ToolsOzoneReportGetLiveStats.QueryParams, + opts?: ToolsOzoneReportGetLiveStats.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.report.getLiveStats', + params, + undefined, + opts, + ) + } + + getReport( + params?: ToolsOzoneReportGetReport.QueryParams, + opts?: ToolsOzoneReportGetReport.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.report.getReport', params, undefined, opts) + .catch((e) => { + throw ToolsOzoneReportGetReport.toKnownErr(e) + }) + } + + listActivities( + params?: ToolsOzoneReportListActivities.QueryParams, + opts?: ToolsOzoneReportListActivities.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.report.listActivities', + params, + undefined, + opts, + ) + } + + queryReports( + params?: ToolsOzoneReportQueryReports.QueryParams, + opts?: ToolsOzoneReportQueryReports.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.report.queryReports', + params, + undefined, + opts, + ) + } + + reassignQueue( + data?: ToolsOzoneReportReassignQueue.InputSchema, + opts?: ToolsOzoneReportReassignQueue.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.report.reassignQueue', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneReportReassignQueue.toKnownErr(e) + }) + } + + refreshStats( + data?: ToolsOzoneReportRefreshStats.InputSchema, + opts?: ToolsOzoneReportRefreshStats.CallOptions, + ): Promise { + return this._client.call( + 'tools.ozone.report.refreshStats', + opts?.qp, + data, + opts, + ) + } + + unassignModerator( + data?: ToolsOzoneReportUnassignModerator.InputSchema, + opts?: ToolsOzoneReportUnassignModerator.CallOptions, + ): Promise { + return this._client + .call('tools.ozone.report.unassignModerator', opts?.qp, data, opts) + .catch((e) => { + throw ToolsOzoneReportUnassignModerator.toKnownErr(e) + }) + } +} + export class ToolsOzoneSafelinkNS { _client: XrpcClient diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 8bc62cd3670..77fd3860e52 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -19854,6 +19854,12 @@ export const schemaDict = { description: 'An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject.', }, + reportAction: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.emitEvent#reportAction', + description: + 'Optional report-level targeting. If provided, this event will be linked to specific reports and reporters may be notified.', + }, }, }, }, @@ -19875,6 +19881,36 @@ export const schemaDict = { }, ], }, + reportAction: { + type: 'object', + description: 'Target specific reports when emitting a moderation event', + properties: { + ids: { + type: 'array', + items: { + type: 'integer', + }, + description: 'Target specific report IDs', + }, + types: { + type: 'array', + items: { + type: 'string', + }, + description: + 'Target reports matching these report types on the subject (fully qualified NSIDs)', + }, + all: { + type: 'boolean', + description: 'Target ALL reports on the subject', + }, + note: { + type: 'string', + description: + 'Note to send to reporter(s) when actioning their report', + }, + }, + }, }, }, ToolsOzoneModerationGetAccountTimeline: { @@ -20975,210 +21011,929 @@ export const schemaDict = { }, }, }, - ToolsOzoneReportDefs: { + ToolsOzoneQueueAssignModerator: { lexicon: 1, - id: 'tools.ozone.report.defs', + id: 'tools.ozone.queue.assignModerator', defs: { - reasonType: { - type: 'string', - knownValues: [ - 'tools.ozone.report.defs#reasonAppeal', - 'tools.ozone.report.defs#reasonOther', - 'tools.ozone.report.defs#reasonViolenceAnimal', - 'tools.ozone.report.defs#reasonViolenceThreats', - 'tools.ozone.report.defs#reasonViolenceGraphicContent', - 'tools.ozone.report.defs#reasonViolenceGlorification', - 'tools.ozone.report.defs#reasonViolenceExtremistContent', - 'tools.ozone.report.defs#reasonViolenceTrafficking', - 'tools.ozone.report.defs#reasonViolenceOther', - 'tools.ozone.report.defs#reasonSexualAbuseContent', - 'tools.ozone.report.defs#reasonSexualNCII', - 'tools.ozone.report.defs#reasonSexualDeepfake', - 'tools.ozone.report.defs#reasonSexualAnimal', - 'tools.ozone.report.defs#reasonSexualUnlabeled', - 'tools.ozone.report.defs#reasonSexualOther', - 'tools.ozone.report.defs#reasonChildSafetyCSAM', - 'tools.ozone.report.defs#reasonChildSafetyGroom', - 'tools.ozone.report.defs#reasonChildSafetyPrivacy', - 'tools.ozone.report.defs#reasonChildSafetyHarassment', - 'tools.ozone.report.defs#reasonChildSafetyOther', - 'tools.ozone.report.defs#reasonHarassmentTroll', - 'tools.ozone.report.defs#reasonHarassmentTargeted', - 'tools.ozone.report.defs#reasonHarassmentHateSpeech', - 'tools.ozone.report.defs#reasonHarassmentDoxxing', - 'tools.ozone.report.defs#reasonHarassmentOther', - 'tools.ozone.report.defs#reasonMisleadingBot', - 'tools.ozone.report.defs#reasonMisleadingImpersonation', - 'tools.ozone.report.defs#reasonMisleadingSpam', - 'tools.ozone.report.defs#reasonMisleadingScam', - 'tools.ozone.report.defs#reasonMisleadingElections', - 'tools.ozone.report.defs#reasonMisleadingOther', - 'tools.ozone.report.defs#reasonRuleSiteSecurity', - 'tools.ozone.report.defs#reasonRuleProhibitedSales', - 'tools.ozone.report.defs#reasonRuleBanEvasion', - 'tools.ozone.report.defs#reasonRuleOther', - 'tools.ozone.report.defs#reasonSelfHarmContent', - 'tools.ozone.report.defs#reasonSelfHarmED', - 'tools.ozone.report.defs#reasonSelfHarmStunts', - 'tools.ozone.report.defs#reasonSelfHarmSubstances', - 'tools.ozone.report.defs#reasonSelfHarmOther', + main: { + type: 'procedure', + description: 'Assign a user to a queue.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId', 'did'], + properties: { + queueId: { + type: 'integer', + description: 'The ID of the queue to assign the user to.', + }, + did: { + type: 'string', + description: 'DID to be assigned.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#assignmentView', + }, + }, + errors: [ + { + name: 'InvalidAssignment', + description: + 'The specified queue does not exist or is not enabled.', + }, ], }, - reasonAppeal: { - type: 'token', - description: 'Appeal a previously taken moderation action', - }, - reasonOther: { - type: 'token', - description: 'An issue not included in these options', - }, - reasonViolenceAnimal: { - type: 'token', - description: 'Animal welfare violations', - }, - reasonViolenceThreats: { - type: 'token', - description: 'Threats or incitement', - }, - reasonViolenceGraphicContent: { - type: 'token', - description: 'Graphic violent content', - }, - reasonViolenceGlorification: { - type: 'token', - description: 'Glorification of violence', - }, - reasonViolenceExtremistContent: { - type: 'token', + }, + }, + ToolsOzoneQueueCreateQueue: { + lexicon: 1, + id: 'tools.ozone.queue.createQueue', + defs: { + main: { + type: 'procedure', description: - "Extremist content. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonViolenceTrafficking: { - type: 'token', - description: 'Human trafficking', - }, - reasonViolenceOther: { - type: 'token', - description: 'Other violent content', - }, - reasonSexualAbuseContent: { - type: 'token', - description: 'Adult sexual abuse content', - }, - reasonSexualNCII: { - type: 'token', - description: 'Non-consensual intimate imagery', + 'Create a new moderation queue. Will fail if the queue configuration conflicts with an existing queue.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['name', 'subjectTypes', 'reportTypes'], + properties: { + name: { + type: 'string', + description: 'Display name for the queue (must be unique)', + }, + subjectTypes: { + type: 'array', + minLength: 1, + items: { + type: 'string', + knownValues: ['account', 'record', 'message'], + }, + description: 'Subject types this queue accepts', + }, + collection: { + type: 'string', + format: 'nsid', + description: + "Collection name for record subjects. Required if subjectTypes includes 'record'.", + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + minLength: 1, + maxLength: 25, + description: 'Report reason types (fully qualified NSIDs)', + }, + description: { + type: 'string', + description: 'Optional description of the queue', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queue'], + properties: { + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + }, + }, + }, + errors: [ + { + name: 'ConflictingQueue', + description: + 'The queue configuration conflicts with an existing queue', + }, + ], }, - reasonSexualDeepfake: { - type: 'token', - description: 'Deepfake adult content', + }, + }, + ToolsOzoneQueueDefs: { + lexicon: 1, + id: 'tools.ozone.queue.defs', + defs: { + queueView: { + type: 'object', + required: [ + 'id', + 'name', + 'subjectTypes', + 'reportTypes', + 'createdBy', + 'createdAt', + 'updatedAt', + 'enabled', + 'stats', + ], + properties: { + id: { + type: 'integer', + description: 'Queue ID', + }, + name: { + type: 'string', + description: 'Display name of the queue', + }, + subjectTypes: { + type: 'array', + minLength: 1, + items: { + type: 'string', + knownValues: ['account', 'record', 'message'], + }, + description: 'Subject types this queue accepts.', + }, + collection: { + type: 'string', + format: 'nsid', + description: + "Collection name for record subjects (e.g., 'app.bsky.feed.post')", + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + minLength: 1, + description: + 'Report reason types this queue accepts (fully qualified NSIDs)', + }, + description: { + type: 'string', + description: 'Optional description of the queue', + }, + createdBy: { + type: 'string', + format: 'did', + description: 'DID of moderator who created this queue', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + updatedAt: { + type: 'string', + format: 'datetime', + }, + enabled: { + type: 'boolean', + description: 'Whether this queue is currently active', + }, + deletedAt: { + type: 'string', + format: 'datetime', + description: 'When the queue was deleted, if applicable', + }, + stats: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueStats', + description: 'Statistics about this queue', + }, + }, }, - reasonSexualAnimal: { - type: 'token', - description: 'Animal sexual abuse', - }, - reasonSexualUnlabeled: { - type: 'token', - description: 'Unlabelled adult content', + queueStats: { + type: 'object', + required: [], + properties: { + pendingCount: { + type: 'integer', + description: "Number of reports in 'open' status", + }, + actionedCount: { + type: 'integer', + description: "Number of reports in 'closed' status", + }, + escalatedCount: { + type: 'integer', + description: "Number of reports in 'escalated' status", + }, + inboundCount: { + type: 'integer', + description: 'Reports received in this queue in the last 24 hours.', + }, + actionRate: { + type: 'integer', + description: + 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. Absent when inboundCount is 0.', + }, + avgHandlingTimeSec: { + type: 'integer', + description: + 'Average time in seconds from report creation to close, for reports closed in this period.', + }, + lastUpdated: { + type: 'string', + format: 'datetime', + description: 'When these statistics were last computed', + }, + }, }, - reasonSexualOther: { - type: 'token', - description: 'Other sexual violence content', + assignmentView: { + type: 'object', + required: ['id', 'did', 'queue', 'startAt'], + properties: { + id: { + type: 'integer', + }, + did: { + type: 'string', + format: 'did', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: 'The moderator assigned to this queue', + }, + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + startAt: { + type: 'string', + format: 'datetime', + }, + endAt: { + type: 'string', + format: 'datetime', + }, + }, }, - reasonChildSafetyCSAM: { - type: 'token', + }, + }, + ToolsOzoneQueueDeleteQueue: { + lexicon: 1, + id: 'tools.ozone.queue.deleteQueue', + defs: { + main: { + type: 'procedure', description: - "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority.", + 'Delete a moderation queue. Optionally migrate reports to another queue.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId'], + properties: { + queueId: { + type: 'integer', + description: 'ID of the queue to delete', + }, + migrateToQueueId: { + type: 'integer', + description: + 'Optional: migrate all reports to this queue. If not specified, reports will be set to unassigned (-1).', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['deleted'], + properties: { + deleted: { + type: 'boolean', + }, + reportsMigrated: { + type: 'integer', + description: + 'Number of reports that were migrated (if migration occurred)', + }, + }, + }, + }, }, - reasonChildSafetyGroom: { - type: 'token', + }, + }, + ToolsOzoneQueueGetAssignments: { + lexicon: 1, + id: 'tools.ozone.queue.getAssignments', + defs: { + main: { + type: 'query', description: - "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonChildSafetyPrivacy: { - type: 'token', - description: 'Privacy violation involving a minor', + 'Get moderator assignments, optionally filtered by active status, queue, or moderator.', + parameters: { + type: 'params', + properties: { + onlyActive: { + type: 'boolean', + default: true, + description: 'When true, only returns active assignments.', + }, + queueIds: { + type: 'array', + items: { + type: 'integer', + }, + description: + 'If specified, returns assignments for these queues only.', + }, + dids: { + type: 'array', + items: { + type: 'string', + format: 'did', + }, + description: + 'If specified, returns assignments for these moderators only.', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['assignments'], + properties: { + cursor: { + type: 'string', + }, + assignments: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#assignmentView', + }, + }, + }, + }, + }, }, - reasonChildSafetyHarassment: { - type: 'token', - description: 'Harassment or bullying of minors', + }, + }, + ToolsOzoneQueueListQueues: { + lexicon: 1, + id: 'tools.ozone.queue.listQueues', + defs: { + main: { + type: 'query', + description: 'List all configured moderation queues with statistics.', + parameters: { + type: 'params', + properties: { + enabled: { + type: 'boolean', + description: + 'Filter by enabled status. If not specified, returns all queues.', + }, + subjectType: { + type: 'string', + description: + "Filter queues that handle this subject type ('account' or 'record').", + }, + collection: { + type: 'string', + description: + "Filter queues by collection name (e.g. 'app.bsky.feed.post').", + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + maxLength: 10, + description: + 'Filter queues that handle any of these report reason types.', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queues'], + properties: { + cursor: { + type: 'string', + }, + queues: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + }, + }, + }, + }, }, - reasonChildSafetyOther: { - type: 'token', + }, + }, + ToolsOzoneQueueRouteReports: { + lexicon: 1, + id: 'tools.ozone.queue.routeReports', + defs: { + main: { + type: 'procedure', description: - "Other child safety. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonHarassmentTroll: { - type: 'token', - description: 'Trolling', - }, - reasonHarassmentTargeted: { - type: 'token', - description: 'Targeted harassment', - }, - reasonHarassmentHateSpeech: { - type: 'token', - description: 'Hate speech', + 'Route reports within an ID range to matching queues based.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['startReportId', 'endReportId'], + properties: { + startReportId: { + type: 'integer', + description: 'Start of report ID range (inclusive).', + }, + endReportId: { + type: 'integer', + description: + 'End of report ID range (inclusive). Difference between start and end must be less than 5,000.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['assigned', 'unmatched'], + properties: { + assigned: { + type: 'integer', + description: 'The number of reports assigned to a queue.', + }, + unmatched: { + type: 'integer', + description: 'The number of reports with no matching queue.', + }, + }, + }, + }, + errors: [ + { + name: 'OutOfRange', + description: + 'The request is invalid, such as missing required fields or invalid field values.', + }, + ], }, - reasonHarassmentDoxxing: { - type: 'token', - description: 'Doxxing', + }, + }, + ToolsOzoneQueueUnassignModerator: { + lexicon: 1, + id: 'tools.ozone.queue.unassignModerator', + defs: { + main: { + type: 'procedure', + description: "Remove a user's assignment from a queue.", + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId', 'did'], + properties: { + queueId: { + type: 'integer', + description: 'The ID of the queue to unassign the user from.', + }, + did: { + type: 'string', + format: 'did', + description: 'DID to be unassigned.', + }, + }, + }, + }, + errors: [ + { + name: 'InvalidAssignment', + description: + 'No active assignment exists for the given queue and user.', + }, + ], }, - reasonHarassmentOther: { - type: 'token', - description: 'Other harassing or hateful content', + }, + }, + ToolsOzoneQueueUpdateQueue: { + lexicon: 1, + id: 'tools.ozone.queue.updateQueue', + defs: { + main: { + type: 'procedure', + description: + 'Update queue properties. Currently only supports updating the name and enabled status to prevent configuration conflicts.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId'], + properties: { + queueId: { + type: 'integer', + description: 'ID of the queue to update', + }, + name: { + type: 'string', + description: 'New display name for the queue', + }, + enabled: { + type: 'boolean', + description: 'Enable or disable the queue', + }, + description: { + type: 'string', + description: 'Optional description of the queue', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queue'], + properties: { + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + }, + }, + }, }, - reasonMisleadingBot: { - type: 'token', - description: 'Fake account or bot', + }, + }, + ToolsOzoneReportAssignModerator: { + lexicon: 1, + id: 'tools.ozone.report.assignModerator', + defs: { + main: { + type: 'procedure', + description: + 'Assign a report to a user. Defaults to the caller. Admins may assign to any moderator.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId'], + properties: { + reportId: { + type: 'integer', + description: 'The ID of the report to assign.', + }, + queueId: { + type: 'integer', + description: + 'Optional queue ID to associate the assignment with. If not provided and the report has been assigned on a queue before, it will stay on that queue.', + }, + did: { + type: 'string', + format: 'did', + description: + "DID to be assigned. Defaults to the caller's DID. Admins may assign to any moderator.", + }, + isPermanent: { + type: 'boolean', + description: + 'When true, the assignment has no expiry (endAt is null). Throws AlreadyAssigned if another user already has a permanent assignment on this report.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#assignmentView', + }, + }, + errors: [ + { + name: 'AlreadyAssigned', + description: 'The report is already assigned to another user.', + }, + { + name: 'InvalidAssignment', + description: 'The report ID or queue ID is invalid.', + }, + ], }, - reasonMisleadingImpersonation: { - type: 'token', - description: 'Impersonation', + }, + }, + ToolsOzoneReportCreateActivity: { + lexicon: 1, + id: 'tools.ozone.report.createActivity', + defs: { + main: { + type: 'procedure', + description: + 'Register an activity on a report. For state-change activity types, validates the transition and updates report.status atomically.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId', 'activity'], + properties: { + reportId: { + type: 'integer', + description: 'ID of the report to record activity on', + }, + activity: { + type: 'union', + refs: [ + 'lex:tools.ozone.report.defs#queueActivity', + 'lex:tools.ozone.report.defs#assignmentActivity', + 'lex:tools.ozone.report.defs#escalationActivity', + 'lex:tools.ozone.report.defs#closeActivity', + 'lex:tools.ozone.report.defs#reopenActivity', + 'lex:tools.ozone.report.defs#noteActivity', + ], + description: 'The type of activity to record.', + }, + internalNote: { + type: 'string', + description: + 'Optional moderator-only note. Not visible to reporters.', + }, + publicNote: { + type: 'string', + description: + 'Optional public-facing note, potentially visible to the reporter.', + }, + isAutomated: { + type: 'boolean', + description: + 'Set true when this activity is triggered by an automated process. Defaults to false.', + default: false, + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['activity'], + properties: { + activity: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportActivityView', + }, + }, + }, + }, + errors: [ + { + name: 'ReportNotFound', + description: 'No report exists with the given reportId', + }, + { + name: 'InvalidStateTransition', + description: + "The requested state transition is not permitted from the report's current status", + }, + { + name: 'AlreadyInTargetState', + description: + 'The report is already in the status implied by this activity type', + }, + ], }, - reasonMisleadingSpam: { - type: 'token', - description: 'Spam', + }, + }, + ToolsOzoneReportDefs: { + lexicon: 1, + id: 'tools.ozone.report.defs', + defs: { + reasonType: { + type: 'string', + knownValues: [ + 'tools.ozone.report.defs#reasonAppeal', + 'tools.ozone.report.defs#reasonOther', + 'tools.ozone.report.defs#reasonViolenceAnimal', + 'tools.ozone.report.defs#reasonViolenceThreats', + 'tools.ozone.report.defs#reasonViolenceGraphicContent', + 'tools.ozone.report.defs#reasonViolenceGlorification', + 'tools.ozone.report.defs#reasonViolenceExtremistContent', + 'tools.ozone.report.defs#reasonViolenceTrafficking', + 'tools.ozone.report.defs#reasonViolenceOther', + 'tools.ozone.report.defs#reasonSexualAbuseContent', + 'tools.ozone.report.defs#reasonSexualNCII', + 'tools.ozone.report.defs#reasonSexualDeepfake', + 'tools.ozone.report.defs#reasonSexualAnimal', + 'tools.ozone.report.defs#reasonSexualUnlabeled', + 'tools.ozone.report.defs#reasonSexualOther', + 'tools.ozone.report.defs#reasonChildSafetyCSAM', + 'tools.ozone.report.defs#reasonChildSafetyGroom', + 'tools.ozone.report.defs#reasonChildSafetyPrivacy', + 'tools.ozone.report.defs#reasonChildSafetyHarassment', + 'tools.ozone.report.defs#reasonChildSafetyOther', + 'tools.ozone.report.defs#reasonHarassmentTroll', + 'tools.ozone.report.defs#reasonHarassmentTargeted', + 'tools.ozone.report.defs#reasonHarassmentHateSpeech', + 'tools.ozone.report.defs#reasonHarassmentDoxxing', + 'tools.ozone.report.defs#reasonHarassmentOther', + 'tools.ozone.report.defs#reasonMisleadingBot', + 'tools.ozone.report.defs#reasonMisleadingImpersonation', + 'tools.ozone.report.defs#reasonMisleadingSpam', + 'tools.ozone.report.defs#reasonMisleadingScam', + 'tools.ozone.report.defs#reasonMisleadingElections', + 'tools.ozone.report.defs#reasonMisleadingOther', + 'tools.ozone.report.defs#reasonRuleSiteSecurity', + 'tools.ozone.report.defs#reasonRuleProhibitedSales', + 'tools.ozone.report.defs#reasonRuleBanEvasion', + 'tools.ozone.report.defs#reasonRuleOther', + 'tools.ozone.report.defs#reasonSelfHarmContent', + 'tools.ozone.report.defs#reasonSelfHarmED', + 'tools.ozone.report.defs#reasonSelfHarmStunts', + 'tools.ozone.report.defs#reasonSelfHarmSubstances', + 'tools.ozone.report.defs#reasonSelfHarmOther', + ], }, - reasonMisleadingScam: { + reasonAppeal: { type: 'token', - description: 'Scam', + description: 'Appeal a previously taken moderation action', }, - reasonMisleadingElections: { + reasonOther: { type: 'token', - description: 'False information about elections', + description: 'An issue not included in these options', }, - reasonMisleadingOther: { + reasonViolenceAnimal: { type: 'token', - description: 'Other misleading content', + description: 'Animal welfare violations', }, - reasonRuleSiteSecurity: { + reasonViolenceThreats: { type: 'token', - description: 'Hacking or system attacks', + description: 'Threats or incitement', }, - reasonRuleProhibitedSales: { + reasonViolenceGraphicContent: { type: 'token', - description: 'Promoting or selling prohibited items or services', + description: 'Graphic violent content', }, - reasonRuleBanEvasion: { + reasonViolenceGlorification: { type: 'token', - description: 'Banned user returning', + description: 'Glorification of violence', }, - reasonRuleOther: { + reasonViolenceExtremistContent: { type: 'token', - description: 'Other', + description: + "Extremist content. These reports will be sent only be sent to the application's Moderation Authority.", }, - reasonSelfHarmContent: { + reasonViolenceTrafficking: { type: 'token', - description: 'Content promoting or depicting self-harm', + description: 'Human trafficking', }, - reasonSelfHarmED: { + reasonViolenceOther: { type: 'token', - description: 'Eating disorders', + description: 'Other violent content', }, - reasonSelfHarmStunts: { + reasonSexualAbuseContent: { type: 'token', - description: 'Dangerous challenges or activities', + description: 'Adult sexual abuse content', + }, + reasonSexualNCII: { + type: 'token', + description: 'Non-consensual intimate imagery', + }, + reasonSexualDeepfake: { + type: 'token', + description: 'Deepfake adult content', + }, + reasonSexualAnimal: { + type: 'token', + description: 'Animal sexual abuse', + }, + reasonSexualUnlabeled: { + type: 'token', + description: 'Unlabelled adult content', + }, + reasonSexualOther: { + type: 'token', + description: 'Other sexual violence content', + }, + reasonChildSafetyCSAM: { + type: 'token', + description: + "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority.", + }, + reasonChildSafetyGroom: { + type: 'token', + description: + "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority.", + }, + reasonChildSafetyPrivacy: { + type: 'token', + description: 'Privacy violation involving a minor', + }, + reasonChildSafetyHarassment: { + type: 'token', + description: 'Harassment or bullying of minors', + }, + reasonChildSafetyOther: { + type: 'token', + description: + "Other child safety. These reports will be sent only be sent to the application's Moderation Authority.", + }, + reasonHarassmentTroll: { + type: 'token', + description: 'Trolling', + }, + reasonHarassmentTargeted: { + type: 'token', + description: 'Targeted harassment', + }, + reasonHarassmentHateSpeech: { + type: 'token', + description: 'Hate speech', + }, + reasonHarassmentDoxxing: { + type: 'token', + description: 'Doxxing', + }, + reasonHarassmentOther: { + type: 'token', + description: 'Other harassing or hateful content', + }, + reasonMisleadingBot: { + type: 'token', + description: 'Fake account or bot', + }, + reasonMisleadingImpersonation: { + type: 'token', + description: 'Impersonation', + }, + reasonMisleadingSpam: { + type: 'token', + description: 'Spam', + }, + reasonMisleadingScam: { + type: 'token', + description: 'Scam', + }, + reasonMisleadingElections: { + type: 'token', + description: 'False information about elections', + }, + reasonMisleadingOther: { + type: 'token', + description: 'Other misleading content', + }, + reasonRuleSiteSecurity: { + type: 'token', + description: 'Hacking or system attacks', + }, + reasonRuleProhibitedSales: { + type: 'token', + description: 'Promoting or selling prohibited items or services', + }, + reasonRuleBanEvasion: { + type: 'token', + description: 'Banned user returning', + }, + reasonRuleOther: { + type: 'token', + description: 'Other', + }, + reasonSelfHarmContent: { + type: 'token', + description: 'Content promoting or depicting self-harm', + }, + reasonSelfHarmED: { + type: 'token', + description: 'Eating disorders', + }, + reasonSelfHarmStunts: { + type: 'token', + description: 'Dangerous challenges or activities', }, reasonSelfHarmSubstances: { type: 'token', @@ -21188,6 +21943,974 @@ export const schemaDict = { type: 'token', description: 'Other dangerous content', }, + reportAssignment: { + type: 'object', + description: + 'Information about the moderator currently assigned to a report.', + required: ['did', 'assignedAt'], + properties: { + did: { + type: 'string', + format: 'did', + description: 'DID of the assigned moderator', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: 'Full member record of the assigned moderator', + }, + assignedAt: { + type: 'string', + format: 'datetime', + description: 'When the report was assigned', + }, + }, + }, + reportView: { + type: 'object', + required: [ + 'id', + 'eventId', + 'status', + 'subject', + 'reportType', + 'reportedBy', + 'reporter', + 'createdAt', + ], + properties: { + id: { + type: 'integer', + description: 'Report ID', + }, + eventId: { + type: 'integer', + description: 'ID of the moderation event that created this report', + }, + status: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: 'Current status of the report', + }, + subject: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#subjectView', + description: 'The subject that was reported with full details', + }, + reportType: { + type: 'ref', + ref: 'lex:com.atproto.moderation.defs#reasonType', + description: 'Type of report', + }, + reportedBy: { + type: 'string', + format: 'did', + description: 'DID of the user who made the report', + }, + reporter: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#subjectView', + description: 'Full subject view of the reporter account', + }, + comment: { + type: 'string', + description: 'Comment provided by the reporter', + }, + createdAt: { + type: 'string', + format: 'datetime', + description: 'When the report was created', + }, + updatedAt: { + type: 'string', + format: 'datetime', + description: 'When the report was last updated', + }, + queuedAt: { + type: 'string', + format: 'datetime', + description: 'When the report was assigned to its current queue', + }, + actionEventIds: { + type: 'array', + items: { + type: 'integer', + }, + description: + 'Array of moderation event IDs representing actions taken on this report (sorted DESC, most recent first)', + }, + actions: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#modEventView', + }, + description: 'Optional: expanded action events', + }, + actionNote: { + type: 'string', + description: 'Note sent to reporter when report was actioned', + }, + subjectStatus: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', + description: 'Current status of the reported subject', + }, + relatedReportCount: { + type: 'integer', + description: 'Number of other pending reports on the same subject', + }, + assignment: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportAssignment', + description: + 'Information about moderator currently assigned to this report (if any)', + }, + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + description: 'The queue this report is assigned to (if any)', + }, + isMuted: { + type: 'boolean', + description: + 'Whether this report is muted. A report is muted if the reporter was muted or the subject was muted at the time the report was created.', + }, + }, + }, + queueActivity: { + type: 'object', + description: 'Activity recording a report being routed to a queue.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + assignmentActivity: { + type: 'object', + description: + 'Activity recording a moderator being assigned to a report.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + escalationActivity: { + type: 'object', + description: 'Activity recording a report being escalated.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + closeActivity: { + type: 'object', + description: 'Activity recording a report being closed.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + reopenActivity: { + type: 'object', + description: + "Activity recording a closed report being reopened. Only valid when the report is in 'closed' status.", + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + noteActivity: { + type: 'object', + description: + 'Activity recording a note on a report. Use internalNote for moderator-only notes or publicNote for reporter-visible notes (or both).', + properties: {}, + }, + reportActivityView: { + type: 'object', + description: 'A single activity entry on a report.', + required: [ + 'id', + 'reportId', + 'activity', + 'isAutomated', + 'createdBy', + 'createdAt', + ], + properties: { + id: { + type: 'integer', + description: 'Activity ID', + }, + reportId: { + type: 'integer', + description: 'ID of the report this activity belongs to', + }, + activity: { + type: 'union', + refs: [ + 'lex:tools.ozone.report.defs#queueActivity', + 'lex:tools.ozone.report.defs#assignmentActivity', + 'lex:tools.ozone.report.defs#escalationActivity', + 'lex:tools.ozone.report.defs#closeActivity', + 'lex:tools.ozone.report.defs#reopenActivity', + 'lex:tools.ozone.report.defs#noteActivity', + ], + description: 'The typed activity object describing what occurred.', + }, + internalNote: { + type: 'string', + description: + 'Optional moderator-only note. Not visible to reporters.', + }, + publicNote: { + type: 'string', + description: + 'Optional public note, potentially visible to the reporter.', + }, + meta: { + type: 'unknown', + description: + 'Extensible JSON payload for loose activity-specific metadata (e.g. assignmentId).', + }, + isAutomated: { + type: 'boolean', + description: + 'True if this activity was created by an automated process (e.g. queue router) rather than a direct human action.', + }, + createdBy: { + type: 'string', + format: 'did', + description: + 'DID of the actor who created this activity, or the service DID for automated activities.', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: + 'Full member record of the moderator who created this activity', + }, + createdAt: { + type: 'string', + format: 'datetime', + description: 'When this activity was created', + }, + }, + }, + liveStats: { + description: + 'Live statistics for reports for the current calendar day, filterable by queue, moderator, or report type.', + type: 'object', + properties: { + pendingCount: { + type: 'integer', + description: 'Number of reports currently not closed.', + }, + actionedCount: { + type: 'integer', + description: 'Number of reports closed today.', + }, + escalatedCount: { + type: 'integer', + description: 'Number of reports escalated today.', + }, + inboundCount: { + type: 'integer', + description: 'Reports received today.', + }, + actionRate: { + type: 'integer', + description: + 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer.', + }, + avgHandlingTimeSec: { + type: 'integer', + description: + 'Average time in seconds from report creation (or moderator assignment) to close.', + }, + lastUpdated: { + type: 'string', + format: 'datetime', + description: 'When these statistics were last computed.', + }, + }, + }, + historicalStats: { + description: + 'A single daily snapshot of report statistics for a calendar date.', + type: 'object', + required: ['date'], + properties: { + date: { + type: 'string', + description: 'The calendar date this snapshot covers (YYYY-MM-DD).', + }, + computedAt: { + type: 'string', + format: 'datetime', + description: 'When this snapshot was last computed.', + }, + pendingCount: { + type: 'integer', + description: 'Number of reports not closed at time of computation.', + }, + actionedCount: { + type: 'integer', + description: 'Number of reports closed during this day.', + }, + escalatedCount: { + type: 'integer', + description: 'Number of reports escalated during this day.', + }, + inboundCount: { + type: 'integer', + description: 'Reports received during this day.', + }, + actionRate: { + type: 'integer', + description: + 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer.', + }, + avgHandlingTimeSec: { + type: 'integer', + description: + 'Average time in seconds from report creation (or moderator assignment) to close.', + }, + }, + }, + assignmentView: { + type: 'object', + required: ['id', 'did', 'reportId', 'startAt'], + properties: { + id: { + type: 'integer', + }, + did: { + type: 'string', + format: 'did', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: 'The moderator assigned to this report', + }, + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + reportId: { + type: 'integer', + }, + startAt: { + type: 'string', + format: 'datetime', + }, + endAt: { + type: 'string', + format: 'datetime', + }, + }, + }, + }, + }, + ToolsOzoneReportGetAssignments: { + lexicon: 1, + id: 'tools.ozone.report.getAssignments', + defs: { + main: { + type: 'query', + description: 'Get assignments for reports.', + parameters: { + type: 'params', + properties: { + onlyActive: { + type: 'boolean', + default: true, + description: 'When true, only returns active assignments.', + }, + reportIds: { + type: 'array', + items: { + type: 'integer', + }, + maxLength: 50, + description: + 'If specified, returns assignments for these reports only.', + }, + dids: { + type: 'array', + items: { + type: 'string', + format: 'did', + }, + maxLength: 50, + description: + 'If specified, returns assignments for these moderators only.', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['assignments'], + properties: { + cursor: { + type: 'string', + }, + assignments: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#assignmentView', + }, + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportGetHistoricalStats: { + lexicon: 1, + id: 'tools.ozone.report.getHistoricalStats', + defs: { + main: { + type: 'query', + description: + 'Get historical daily report statistics. Returns a paginated list of daily stat snapshots, newest first. Filter by queue, moderator, or report type.', + parameters: { + type: 'params', + properties: { + queueId: { + type: 'integer', + description: + 'Filter stats by queue. Use -1 for unqueued reports.', + }, + moderatorDid: { + type: 'string', + format: 'did', + description: 'Filter stats by moderator DID.', + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + description: 'Filter stats by report types.', + }, + startDate: { + type: 'string', + format: 'datetime', + description: 'Earliest date to include (inclusive).', + }, + endDate: { + type: 'string', + format: 'datetime', + description: 'Latest date to include (inclusive).', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 30, + description: 'Maximum number of entries to return.', + }, + cursor: { + type: 'string', + description: 'Pagination cursor.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['stats'], + properties: { + stats: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#historicalStats', + }, + }, + cursor: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportGetLatestReport: { + lexicon: 1, + id: 'tools.ozone.report.getLatestReport', + defs: { + main: { + type: 'query', + description: 'Get the most recent report.', + parameters: { + type: 'params', + properties: {}, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['report'], + properties: { + report: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + }, + }, + errors: [ + { + name: 'NotFound', + description: 'No report found.', + }, + ], + }, + }, + }, + ToolsOzoneReportGetLiveStats: { + lexicon: 1, + id: 'tools.ozone.report.getLiveStats', + defs: { + main: { + type: 'query', + description: + 'Get live report statistics from the past 24 hours. Filter by queue, moderator, or report type. Omit all parameters for aggregate stats.', + parameters: { + type: 'params', + properties: { + queueId: { + type: 'integer', + description: + 'Filter stats by queue. Use -1 for unqueued reports.', + }, + moderatorDid: { + type: 'string', + format: 'did', + description: 'Filter stats by moderator DID.', + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + description: 'Filter stats by report types.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['stats'], + properties: { + stats: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#liveStats', + description: 'Statistics for the requested filter.', + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportGetReport: { + lexicon: 1, + id: 'tools.ozone.report.getReport', + defs: { + main: { + type: 'query', + description: 'Get details about a single moderation report by ID.', + parameters: { + type: 'params', + required: ['id'], + properties: { + id: { + type: 'integer', + description: 'The ID of the report to retrieve.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + errors: [ + { + name: 'NotFound', + description: 'No report found.', + }, + ], + }, + }, + }, + ToolsOzoneReportListActivities: { + lexicon: 1, + id: 'tools.ozone.report.listActivities', + defs: { + main: { + type: 'query', + description: + 'List all activities for a report, sorted most-recent-first.', + parameters: { + type: 'params', + required: ['reportId'], + properties: { + reportId: { + type: 'integer', + description: 'ID of the report whose activities to list', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['activities'], + properties: { + activities: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportActivityView', + }, + }, + cursor: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportQueryReports: { + lexicon: 1, + id: 'tools.ozone.report.queryReports', + defs: { + main: { + type: 'query', + description: + 'View moderation reports. Reports are individual instances of content being reported, as opposed to subject statuses which aggregate reports at the subject level.', + parameters: { + type: 'params', + required: ['status'], + properties: { + queueId: { + type: 'integer', + description: 'Filter by queue ID. Use -1 for unassigned reports.', + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + description: + 'Filter by report types (fully qualified string in the format of com.atproto.moderation.defs#reason).', + }, + status: { + type: 'string', + knownValues: [ + 'open', + 'closed', + 'escalated', + 'queued', + 'assigned', + ], + description: 'Filter by report status.', + }, + subject: { + type: 'string', + format: 'uri', + description: 'Filter by subject DID or AT-URI.', + }, + did: { + type: 'string', + format: 'did', + description: + 'Filter to reports where the subject is this DID or any record owned by this DID. Unlike `subject` (which scopes to a specific account or record), this returns all reports tied to the DID across both account-level and record-level subjects.', + }, + subjectType: { + type: 'string', + description: + 'If specified, reports of the given type (account or record) will be returned.', + knownValues: ['account', 'record'], + }, + collections: { + type: 'array', + maxLength: 20, + description: + "If specified, reports where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", + items: { + type: 'string', + format: 'nsid', + }, + }, + reportedAfter: { + type: 'string', + format: 'datetime', + description: 'Retrieve reports created after a given timestamp', + }, + reportedBefore: { + type: 'string', + format: 'datetime', + description: 'Retrieve reports created before a given timestamp', + }, + isMuted: { + type: 'boolean', + default: false, + description: + 'Filter by muted status. true returns only muted reports, false returns only unmuted reports. Defaults to false.', + }, + assignedTo: { + type: 'string', + format: 'did', + description: + 'Filter by the DID of the moderator permanently assigned to the report.', + }, + sortField: { + type: 'string', + default: 'createdAt', + enum: ['createdAt', 'updatedAt'], + }, + sortDirection: { + type: 'string', + default: 'desc', + enum: ['asc', 'desc'], + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reports'], + properties: { + cursor: { + type: 'string', + }, + reports: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportReassignQueue: { + lexicon: 1, + id: 'tools.ozone.report.reassignQueue', + defs: { + main: { + type: 'procedure', + description: + 'Manually reassign a report to a different queue (or unassign it). Records a queueActivity entry on the report.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId', 'queueId'], + properties: { + reportId: { + type: 'integer', + description: 'ID of the report to reassign', + }, + queueId: { + type: 'integer', + description: + 'Target queue ID. Use -1 to unassign from any queue.', + }, + comment: { + type: 'string', + description: + 'Optional moderator-only note recorded on the resulting queueActivity as internalNote.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['report'], + properties: { + report: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + }, + }, + errors: [ + { + name: 'ReportNotFound', + description: 'No report exists with the given reportId', + }, + { + name: 'ReportClosed', + description: 'The report is closed and cannot be reassigned', + }, + { + name: 'AlreadyInTargetQueue', + description: 'The report is already assigned to the target queue', + }, + { + name: 'QueueNotFound', + description: 'No active queue exists with the given queueId', + }, + { + name: 'QueueDisabled', + description: + 'The target queue is disabled and cannot receive new assignments', + }, + ], + }, + }, + }, + ToolsOzoneReportRefreshStats: { + lexicon: 1, + id: 'tools.ozone.report.refreshStats', + defs: { + main: { + type: 'procedure', + description: + 'Recompute report statistics for a date range. Useful for backfilling after failures or data corrections.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['startDate', 'endDate'], + properties: { + startDate: { + type: 'string', + description: + 'Start date for recomputation, inclusive (YYYY-MM-DD).', + }, + endDate: { + type: 'string', + description: + 'End date for recomputation, inclusive (YYYY-MM-DD).', + }, + queueIds: { + type: 'array', + items: { + type: 'integer', + }, + description: + 'Optional list of queue IDs to recompute. Omit to recompute all groups.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: {}, + }, + }, + }, + }, + }, + ToolsOzoneReportUnassignModerator: { + lexicon: 1, + id: 'tools.ozone.report.unassignModerator', + defs: { + main: { + type: 'procedure', + description: 'Remove report assignment.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId'], + properties: { + reportId: { + type: 'integer', + description: 'The ID of the report to unassign.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#assignmentView', + }, + }, + errors: [ + { + name: 'InvalidAssignment', + description: 'The report ID is invalid.', + }, + ], + }, }, }, ToolsOzoneSafelinkAddRule: { @@ -23374,7 +25097,28 @@ export const ids = { ToolsOzoneModerationQueryStatuses: 'tools.ozone.moderation.queryStatuses', ToolsOzoneModerationScheduleAction: 'tools.ozone.moderation.scheduleAction', ToolsOzoneModerationSearchRepos: 'tools.ozone.moderation.searchRepos', + ToolsOzoneQueueAssignModerator: 'tools.ozone.queue.assignModerator', + ToolsOzoneQueueCreateQueue: 'tools.ozone.queue.createQueue', + ToolsOzoneQueueDefs: 'tools.ozone.queue.defs', + ToolsOzoneQueueDeleteQueue: 'tools.ozone.queue.deleteQueue', + ToolsOzoneQueueGetAssignments: 'tools.ozone.queue.getAssignments', + ToolsOzoneQueueListQueues: 'tools.ozone.queue.listQueues', + ToolsOzoneQueueRouteReports: 'tools.ozone.queue.routeReports', + ToolsOzoneQueueUnassignModerator: 'tools.ozone.queue.unassignModerator', + ToolsOzoneQueueUpdateQueue: 'tools.ozone.queue.updateQueue', + ToolsOzoneReportAssignModerator: 'tools.ozone.report.assignModerator', + ToolsOzoneReportCreateActivity: 'tools.ozone.report.createActivity', ToolsOzoneReportDefs: 'tools.ozone.report.defs', + ToolsOzoneReportGetAssignments: 'tools.ozone.report.getAssignments', + ToolsOzoneReportGetHistoricalStats: 'tools.ozone.report.getHistoricalStats', + ToolsOzoneReportGetLatestReport: 'tools.ozone.report.getLatestReport', + ToolsOzoneReportGetLiveStats: 'tools.ozone.report.getLiveStats', + ToolsOzoneReportGetReport: 'tools.ozone.report.getReport', + ToolsOzoneReportListActivities: 'tools.ozone.report.listActivities', + ToolsOzoneReportQueryReports: 'tools.ozone.report.queryReports', + ToolsOzoneReportReassignQueue: 'tools.ozone.report.reassignQueue', + ToolsOzoneReportRefreshStats: 'tools.ozone.report.refreshStats', + ToolsOzoneReportUnassignModerator: 'tools.ozone.report.unassignModerator', ToolsOzoneSafelinkAddRule: 'tools.ozone.safelink.addRule', ToolsOzoneSafelinkDefs: 'tools.ozone.safelink.defs', ToolsOzoneSafelinkQueryEvents: 'tools.ozone.safelink.queryEvents', diff --git a/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts b/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts index 43ae18e1975..7fc1dcce4c1 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts @@ -57,6 +57,7 @@ export interface InputSchema { modTool?: ToolsOzoneModerationDefs.ModTool /** An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject. */ externalId?: string + reportAction?: ReportAction } export type OutputSchema = ToolsOzoneModerationDefs.ModEventView @@ -95,3 +96,26 @@ export function toKnownErr(e: any) { return e } + +/** Target specific reports when emitting a moderation event */ +export interface ReportAction { + $type?: 'tools.ozone.moderation.emitEvent#reportAction' + /** Target specific report IDs */ + ids?: number[] + /** Target reports matching these report types on the subject (fully qualified NSIDs) */ + types?: string[] + /** Target ALL reports on the subject */ + all?: boolean + /** Note to send to reporter(s) when actioning their report */ + note?: string +} + +const hashReportAction = 'reportAction' + +export function isReportAction(v: V) { + return is$typed(v, id, hashReportAction) +} + +export function validateReportAction(v: V) { + return validate(v, id, hashReportAction) +} diff --git a/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts b/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts new file mode 100644 index 00000000000..1083591e700 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts @@ -0,0 +1,55 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.assignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the queue to assign the user to. */ + queueId: number + /** DID to be assigned. */ + did: string +} + +export type OutputSchema = ToolsOzoneQueueDefs.AssignmentView + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class InvalidAssignmentError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'InvalidAssignment') return new InvalidAssignmentError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/createQueue.ts b/packages/api/src/client/types/tools/ozone/queue/createQueue.ts new file mode 100644 index 00000000000..8f7685619c2 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/createQueue.ts @@ -0,0 +1,63 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.createQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** Display name for the queue (must be unique) */ + name: string + /** Subject types this queue accepts */ + subjectTypes: ('account' | 'record' | 'message' | (string & {}))[] + /** Collection name for record subjects. Required if subjectTypes includes 'record'. */ + collection?: string + /** Report reason types (fully qualified NSIDs) */ + reportTypes: string[] + /** Optional description of the queue */ + description?: string +} + +export interface OutputSchema { + queue: ToolsOzoneQueueDefs.QueueView +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class ConflictingQueueError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'ConflictingQueue') return new ConflictingQueueError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/defs.ts b/packages/api/src/client/types/tools/ozone/queue/defs.ts new file mode 100644 index 00000000000..14665397752 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/defs.ts @@ -0,0 +1,99 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneTeamDefs from '../team/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.defs' + +export interface QueueView { + $type?: 'tools.ozone.queue.defs#queueView' + /** Queue ID */ + id: number + /** Display name of the queue */ + name: string + /** Subject types this queue accepts. */ + subjectTypes: ('account' | 'record' | 'message' | (string & {}))[] + /** Collection name for record subjects (e.g., 'app.bsky.feed.post') */ + collection?: string + /** Report reason types this queue accepts (fully qualified NSIDs) */ + reportTypes: string[] + /** Optional description of the queue */ + description?: string + /** DID of moderator who created this queue */ + createdBy: string + createdAt: string + updatedAt: string + /** Whether this queue is currently active */ + enabled: boolean + /** When the queue was deleted, if applicable */ + deletedAt?: string + stats: QueueStats +} + +const hashQueueView = 'queueView' + +export function isQueueView(v: V) { + return is$typed(v, id, hashQueueView) +} + +export function validateQueueView(v: V) { + return validate(v, id, hashQueueView) +} + +export interface QueueStats { + $type?: 'tools.ozone.queue.defs#queueStats' + /** Number of reports in 'open' status */ + pendingCount?: number + /** Number of reports in 'closed' status */ + actionedCount?: number + /** Number of reports in 'escalated' status */ + escalatedCount?: number + /** Reports received in this queue in the last 24 hours. */ + inboundCount?: number + /** Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. Absent when inboundCount is 0. */ + actionRate?: number + /** Average time in seconds from report creation to close, for reports closed in this period. */ + avgHandlingTimeSec?: number + /** When these statistics were last computed */ + lastUpdated?: string +} + +const hashQueueStats = 'queueStats' + +export function isQueueStats(v: V) { + return is$typed(v, id, hashQueueStats) +} + +export function validateQueueStats(v: V) { + return validate(v, id, hashQueueStats) +} + +export interface AssignmentView { + $type?: 'tools.ozone.queue.defs#assignmentView' + id: number + did: string + moderator?: ToolsOzoneTeamDefs.Member + queue: QueueView + startAt: string + endAt?: string +} + +const hashAssignmentView = 'assignmentView' + +export function isAssignmentView(v: V) { + return is$typed(v, id, hashAssignmentView) +} + +export function validateAssignmentView(v: V) { + return validate(v, id, hashAssignmentView) +} diff --git a/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts b/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts new file mode 100644 index 00000000000..647f253fa57 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.deleteQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the queue to delete */ + queueId: number + /** Optional: migrate all reports to this queue. If not specified, reports will be set to unassigned (-1). */ + migrateToQueueId?: number +} + +export interface OutputSchema { + deleted: boolean + /** Number of reports that were migrated (if migration occurred) */ + reportsMigrated?: number +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts b/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts new file mode 100644 index 00000000000..fbb74784667 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.getAssignments' + +export type QueryParams = { + /** When true, only returns active assignments. */ + onlyActive?: boolean + /** If specified, returns assignments for these queues only. */ + queueIds?: number[] + /** If specified, returns assignments for these moderators only. */ + dids?: string[] + limit?: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + assignments: ToolsOzoneQueueDefs.AssignmentView[] +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/listQueues.ts b/packages/api/src/client/types/tools/ozone/queue/listQueues.ts new file mode 100644 index 00000000000..1b2ee5d3c10 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/listQueues.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.listQueues' + +export type QueryParams = { + /** Filter by enabled status. If not specified, returns all queues. */ + enabled?: boolean + /** Filter queues that handle this subject type ('account' or 'record'). */ + subjectType?: string + /** Filter queues by collection name (e.g. 'app.bsky.feed.post'). */ + collection?: string + /** Filter queues that handle any of these report reason types. */ + reportTypes?: string[] + limit?: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + queues: ToolsOzoneQueueDefs.QueueView[] +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/routeReports.ts b/packages/api/src/client/types/tools/ozone/queue/routeReports.ts new file mode 100644 index 00000000000..96694b8d09a --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/routeReports.ts @@ -0,0 +1,59 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.routeReports' + +export type QueryParams = {} + +export interface InputSchema { + /** Start of report ID range (inclusive). */ + startReportId: number + /** End of report ID range (inclusive). Difference between start and end must be less than 5,000. */ + endReportId: number +} + +export interface OutputSchema { + /** The number of reports assigned to a queue. */ + assigned: number + /** The number of reports with no matching queue. */ + unmatched: number +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class OutOfRangeError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'OutOfRange') return new OutOfRangeError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts b/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts new file mode 100644 index 00000000000..2a006c65576 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.unassignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the queue to unassign the user from. */ + queueId: number + /** DID to be unassigned. */ + did: string +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap +} + +export class InvalidAssignmentError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'InvalidAssignment') return new InvalidAssignmentError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts b/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts new file mode 100644 index 00000000000..786fe023eed --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.updateQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the queue to update */ + queueId: number + /** New display name for the queue */ + name?: string + /** Enable or disable the queue */ + enabled?: boolean + /** Optional description of the queue */ + description?: string +} + +export interface OutputSchema { + queue: ToolsOzoneQueueDefs.QueueView +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/assignModerator.ts b/packages/api/src/client/types/tools/ozone/report/assignModerator.ts new file mode 100644 index 00000000000..5ccb88c57b3 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/assignModerator.ts @@ -0,0 +1,66 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.assignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the report to assign. */ + reportId: number + /** Optional queue ID to associate the assignment with. If not provided and the report has been assigned on a queue before, it will stay on that queue. */ + queueId?: number + /** DID to be assigned. Defaults to the caller's DID. Admins may assign to any moderator. */ + did?: string + /** When true, the assignment has no expiry (endAt is null). Throws AlreadyAssigned if another user already has a permanent assignment on this report. */ + isPermanent?: boolean +} + +export type OutputSchema = ToolsOzoneReportDefs.AssignmentView + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class AlreadyAssignedError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class InvalidAssignmentError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'AlreadyAssigned') return new AlreadyAssignedError(e) + if (e.error === 'InvalidAssignment') return new InvalidAssignmentError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/createActivity.ts b/packages/api/src/client/types/tools/ozone/report/createActivity.ts new file mode 100644 index 00000000000..b220b270362 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/createActivity.ts @@ -0,0 +1,85 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.createActivity' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the report to record activity on */ + reportId: number + activity: + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } + /** Optional moderator-only note. Not visible to reporters. */ + internalNote?: string + /** Optional public-facing note, potentially visible to the reporter. */ + publicNote?: string + /** Set true when this activity is triggered by an automated process. Defaults to false. */ + isAutomated?: boolean +} + +export interface OutputSchema { + activity: ToolsOzoneReportDefs.ReportActivityView +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class ReportNotFoundError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class InvalidStateTransitionError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class AlreadyInTargetStateError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'ReportNotFound') return new ReportNotFoundError(e) + if (e.error === 'InvalidStateTransition') + return new InvalidStateTransitionError(e) + if (e.error === 'AlreadyInTargetState') + return new AlreadyInTargetStateError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/defs.ts b/packages/api/src/client/types/tools/ozone/report/defs.ts index 0cc03726dcd..c3bba7f72b2 100644 --- a/packages/api/src/client/types/tools/ozone/report/defs.ts +++ b/packages/api/src/client/types/tools/ozone/report/defs.ts @@ -9,6 +9,10 @@ import { is$typed as _is$typed, type OmitKey, } from '../../../../util' +import type * as ToolsOzoneTeamDefs from '../team/defs.js' +import type * as ToolsOzoneModerationDefs from '../moderation/defs.js' +import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' +import type * as ToolsOzoneQueueDefs from '../queue/defs.js' const is$typed = _is$typed, validate = _validate @@ -137,3 +141,326 @@ export const REASONSELFHARMSTUNTS = `${id}#reasonSelfHarmStunts` export const REASONSELFHARMSUBSTANCES = `${id}#reasonSelfHarmSubstances` /** Other dangerous content */ export const REASONSELFHARMOTHER = `${id}#reasonSelfHarmOther` + +/** Information about the moderator currently assigned to a report. */ +export interface ReportAssignment { + $type?: 'tools.ozone.report.defs#reportAssignment' + /** DID of the assigned moderator */ + did: string + moderator?: ToolsOzoneTeamDefs.Member + /** When the report was assigned */ + assignedAt: string +} + +const hashReportAssignment = 'reportAssignment' + +export function isReportAssignment(v: V) { + return is$typed(v, id, hashReportAssignment) +} + +export function validateReportAssignment(v: V) { + return validate(v, id, hashReportAssignment) +} + +export interface ReportView { + $type?: 'tools.ozone.report.defs#reportView' + /** Report ID */ + id: number + /** ID of the moderation event that created this report */ + eventId: number + /** Current status of the report */ + status: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) + subject: ToolsOzoneModerationDefs.SubjectView + reportType: ComAtprotoModerationDefs.ReasonType + /** DID of the user who made the report */ + reportedBy: string + reporter: ToolsOzoneModerationDefs.SubjectView + /** Comment provided by the reporter */ + comment?: string + /** When the report was created */ + createdAt: string + /** When the report was last updated */ + updatedAt?: string + /** When the report was assigned to its current queue */ + queuedAt?: string + /** Array of moderation event IDs representing actions taken on this report (sorted DESC, most recent first) */ + actionEventIds?: number[] + /** Optional: expanded action events */ + actions?: ToolsOzoneModerationDefs.ModEventView[] + /** Note sent to reporter when report was actioned */ + actionNote?: string + subjectStatus?: ToolsOzoneModerationDefs.SubjectStatusView + /** Number of other pending reports on the same subject */ + relatedReportCount?: number + assignment?: ReportAssignment + queue?: ToolsOzoneQueueDefs.QueueView + /** Whether this report is muted. A report is muted if the reporter was muted or the subject was muted at the time the report was created. */ + isMuted?: boolean +} + +const hashReportView = 'reportView' + +export function isReportView(v: V) { + return is$typed(v, id, hashReportView) +} + +export function validateReportView(v: V) { + return validate(v, id, hashReportView) +} + +/** Activity recording a report being routed to a queue. */ +export interface QueueActivity { + $type?: 'tools.ozone.report.defs#queueActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashQueueActivity = 'queueActivity' + +export function isQueueActivity(v: V) { + return is$typed(v, id, hashQueueActivity) +} + +export function validateQueueActivity(v: V) { + return validate(v, id, hashQueueActivity) +} + +/** Activity recording a moderator being assigned to a report. */ +export interface AssignmentActivity { + $type?: 'tools.ozone.report.defs#assignmentActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashAssignmentActivity = 'assignmentActivity' + +export function isAssignmentActivity(v: V) { + return is$typed(v, id, hashAssignmentActivity) +} + +export function validateAssignmentActivity(v: V) { + return validate(v, id, hashAssignmentActivity) +} + +/** Activity recording a report being escalated. */ +export interface EscalationActivity { + $type?: 'tools.ozone.report.defs#escalationActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashEscalationActivity = 'escalationActivity' + +export function isEscalationActivity(v: V) { + return is$typed(v, id, hashEscalationActivity) +} + +export function validateEscalationActivity(v: V) { + return validate(v, id, hashEscalationActivity) +} + +/** Activity recording a report being closed. */ +export interface CloseActivity { + $type?: 'tools.ozone.report.defs#closeActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashCloseActivity = 'closeActivity' + +export function isCloseActivity(v: V) { + return is$typed(v, id, hashCloseActivity) +} + +export function validateCloseActivity(v: V) { + return validate(v, id, hashCloseActivity) +} + +/** Activity recording a closed report being reopened. Only valid when the report is in 'closed' status. */ +export interface ReopenActivity { + $type?: 'tools.ozone.report.defs#reopenActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashReopenActivity = 'reopenActivity' + +export function isReopenActivity(v: V) { + return is$typed(v, id, hashReopenActivity) +} + +export function validateReopenActivity(v: V) { + return validate(v, id, hashReopenActivity) +} + +/** Activity recording a note on a report. Use internalNote for moderator-only notes or publicNote for reporter-visible notes (or both). */ +export interface NoteActivity { + $type?: 'tools.ozone.report.defs#noteActivity' +} + +const hashNoteActivity = 'noteActivity' + +export function isNoteActivity(v: V) { + return is$typed(v, id, hashNoteActivity) +} + +export function validateNoteActivity(v: V) { + return validate(v, id, hashNoteActivity) +} + +/** A single activity entry on a report. */ +export interface ReportActivityView { + $type?: 'tools.ozone.report.defs#reportActivityView' + /** Activity ID */ + id: number + /** ID of the report this activity belongs to */ + reportId: number + activity: + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } + /** Optional moderator-only note. Not visible to reporters. */ + internalNote?: string + /** Optional public note, potentially visible to the reporter. */ + publicNote?: string + /** Extensible JSON payload for loose activity-specific metadata (e.g. assignmentId). */ + meta?: { [_ in string]: unknown } + /** True if this activity was created by an automated process (e.g. queue router) rather than a direct human action. */ + isAutomated: boolean + /** DID of the actor who created this activity, or the service DID for automated activities. */ + createdBy: string + moderator?: ToolsOzoneTeamDefs.Member + /** When this activity was created */ + createdAt: string +} + +const hashReportActivityView = 'reportActivityView' + +export function isReportActivityView(v: V) { + return is$typed(v, id, hashReportActivityView) +} + +export function validateReportActivityView(v: V) { + return validate(v, id, hashReportActivityView) +} + +/** Live statistics for reports for the current calendar day, filterable by queue, moderator, or report type. */ +export interface LiveStats { + $type?: 'tools.ozone.report.defs#liveStats' + /** Number of reports currently not closed. */ + pendingCount?: number + /** Number of reports closed today. */ + actionedCount?: number + /** Number of reports escalated today. */ + escalatedCount?: number + /** Reports received today. */ + inboundCount?: number + /** Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. */ + actionRate?: number + /** Average time in seconds from report creation (or moderator assignment) to close. */ + avgHandlingTimeSec?: number + /** When these statistics were last computed. */ + lastUpdated?: string +} + +const hashLiveStats = 'liveStats' + +export function isLiveStats(v: V) { + return is$typed(v, id, hashLiveStats) +} + +export function validateLiveStats(v: V) { + return validate(v, id, hashLiveStats) +} + +/** A single daily snapshot of report statistics for a calendar date. */ +export interface HistoricalStats { + $type?: 'tools.ozone.report.defs#historicalStats' + /** The calendar date this snapshot covers (YYYY-MM-DD). */ + date: string + /** When this snapshot was last computed. */ + computedAt?: string + /** Number of reports not closed at time of computation. */ + pendingCount?: number + /** Number of reports closed during this day. */ + actionedCount?: number + /** Number of reports escalated during this day. */ + escalatedCount?: number + /** Reports received during this day. */ + inboundCount?: number + /** Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. */ + actionRate?: number + /** Average time in seconds from report creation (or moderator assignment) to close. */ + avgHandlingTimeSec?: number +} + +const hashHistoricalStats = 'historicalStats' + +export function isHistoricalStats(v: V) { + return is$typed(v, id, hashHistoricalStats) +} + +export function validateHistoricalStats(v: V) { + return validate(v, id, hashHistoricalStats) +} + +export interface AssignmentView { + $type?: 'tools.ozone.report.defs#assignmentView' + id: number + did: string + moderator?: ToolsOzoneTeamDefs.Member + queue?: ToolsOzoneQueueDefs.QueueView + reportId: number + startAt: string + endAt?: string +} + +const hashAssignmentView = 'assignmentView' + +export function isAssignmentView(v: V) { + return is$typed(v, id, hashAssignmentView) +} + +export function validateAssignmentView(v: V) { + return validate(v, id, hashAssignmentView) +} diff --git a/packages/api/src/client/types/tools/ozone/report/getAssignments.ts b/packages/api/src/client/types/tools/ozone/report/getAssignments.ts new file mode 100644 index 00000000000..27f3823a657 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/getAssignments.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getAssignments' + +export type QueryParams = { + /** When true, only returns active assignments. */ + onlyActive?: boolean + /** If specified, returns assignments for these reports only. */ + reportIds?: number[] + /** If specified, returns assignments for these moderators only. */ + dids?: string[] + limit?: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + assignments: ToolsOzoneReportDefs.AssignmentView[] +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts b/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts new file mode 100644 index 00000000000..3cd5c228dfb --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts @@ -0,0 +1,55 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getHistoricalStats' + +export type QueryParams = { + /** Filter stats by queue. Use -1 for unqueued reports. */ + queueId?: number + /** Filter stats by moderator DID. */ + moderatorDid?: string + /** Filter stats by report types. */ + reportTypes?: string[] + /** Earliest date to include (inclusive). */ + startDate?: string + /** Latest date to include (inclusive). */ + endDate?: string + /** Maximum number of entries to return. */ + limit?: number + /** Pagination cursor. */ + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + stats: ToolsOzoneReportDefs.HistoricalStats[] + cursor?: string +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts b/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts new file mode 100644 index 00000000000..43eb018540d --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getLatestReport' + +export type QueryParams = {} +export type InputSchema = undefined + +export interface OutputSchema { + report: ToolsOzoneReportDefs.ReportView +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class NotFoundError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'NotFound') return new NotFoundError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts b/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts new file mode 100644 index 00000000000..42567f5c859 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts @@ -0,0 +1,46 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getLiveStats' + +export type QueryParams = { + /** Filter stats by queue. Use -1 for unqueued reports. */ + queueId?: number + /** Filter stats by moderator DID. */ + moderatorDid?: string + /** Filter stats by report types. */ + reportTypes?: string[] +} +export type InputSchema = undefined + +export interface OutputSchema { + stats: ToolsOzoneReportDefs.LiveStats +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/getReport.ts b/packages/api/src/client/types/tools/ozone/report/getReport.ts new file mode 100644 index 00000000000..b159856ab92 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/getReport.ts @@ -0,0 +1,49 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getReport' + +export type QueryParams = { + /** The ID of the report to retrieve. */ + id: number +} +export type InputSchema = undefined +export type OutputSchema = ToolsOzoneReportDefs.ReportView + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class NotFoundError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'NotFound') return new NotFoundError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/listActivities.ts b/packages/api/src/client/types/tools/ozone/report/listActivities.ts new file mode 100644 index 00000000000..4cc9446e43f --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/listActivities.ts @@ -0,0 +1,45 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.listActivities' + +export type QueryParams = { + /** ID of the report whose activities to list */ + reportId: number + limit?: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + activities: ToolsOzoneReportDefs.ReportActivityView[] + cursor?: string +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/queryReports.ts b/packages/api/src/client/types/tools/ozone/report/queryReports.ts new file mode 100644 index 00000000000..ebecdbc959c --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/queryReports.ts @@ -0,0 +1,73 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.queryReports' + +export type QueryParams = { + /** Filter by queue ID. Use -1 for unassigned reports. */ + queueId?: number + /** Filter by report types (fully qualified string in the format of com.atproto.moderation.defs#reason). */ + reportTypes?: string[] + /** Filter by report status. */ + status: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) + /** Filter by subject DID or AT-URI. */ + subject?: string + /** Filter to reports where the subject is this DID or any record owned by this DID. Unlike `subject` (which scopes to a specific account or record), this returns all reports tied to the DID across both account-level and record-level subjects. */ + did?: string + /** If specified, reports of the given type (account or record) will be returned. */ + subjectType?: 'account' | 'record' | (string & {}) + /** If specified, reports where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored. */ + collections?: string[] + /** Retrieve reports created after a given timestamp */ + reportedAfter?: string + /** Retrieve reports created before a given timestamp */ + reportedBefore?: string + /** Filter by muted status. true returns only muted reports, false returns only unmuted reports. Defaults to false. */ + isMuted?: boolean + /** Filter by the DID of the moderator permanently assigned to the report. */ + assignedTo?: string + sortField?: 'createdAt' | 'updatedAt' + sortDirection?: 'asc' | 'desc' + limit?: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + reports: ToolsOzoneReportDefs.ReportView[] +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts b/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts new file mode 100644 index 00000000000..f7f9bbbf1c5 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts @@ -0,0 +1,88 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.reassignQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the report to reassign */ + reportId: number + /** Target queue ID. Use -1 to unassign from any queue. */ + queueId: number + /** Optional moderator-only note recorded on the resulting queueActivity as internalNote. */ + comment?: string +} + +export interface OutputSchema { + report: ToolsOzoneReportDefs.ReportView +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class ReportNotFoundError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class ReportClosedError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class AlreadyInTargetQueueError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class QueueNotFoundError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export class QueueDisabledError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'ReportNotFound') return new ReportNotFoundError(e) + if (e.error === 'ReportClosed') return new ReportClosedError(e) + if (e.error === 'AlreadyInTargetQueue') + return new AlreadyInTargetQueueError(e) + if (e.error === 'QueueNotFound') return new QueueNotFoundError(e) + if (e.error === 'QueueDisabled') return new QueueDisabledError(e) + } + + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/refreshStats.ts b/packages/api/src/client/types/tools/ozone/report/refreshStats.ts new file mode 100644 index 00000000000..4ce5773f427 --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/refreshStats.ts @@ -0,0 +1,46 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.refreshStats' + +export type QueryParams = {} + +export interface InputSchema { + /** Start date for recomputation, inclusive (YYYY-MM-DD). */ + startDate: string + /** End date for recomputation, inclusive (YYYY-MM-DD). */ + endDate: string + /** Optional list of queue IDs to recompute. Omit to recompute all groups. */ + queueIds?: number[] +} + +export interface OutputSchema {} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts b/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts new file mode 100644 index 00000000000..41684e2d53b --- /dev/null +++ b/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts @@ -0,0 +1,53 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.unassignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the report to unassign. */ + reportId: number +} + +export type OutputSchema = ToolsOzoneReportDefs.AssignmentView + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap + qp?: QueryParams + encoding?: 'application/json' +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export class InvalidAssignmentError extends XRPCError { + constructor(src: XRPCError) { + super(src.status, src.error, src.message, src.headers, { cause: src }) + } +} + +export function toKnownErr(e: any) { + if (e instanceof XRPCError) { + if (e.error === 'InvalidAssignment') return new InvalidAssignmentError(e) + } + + return e +} diff --git a/packages/dev-env/src/mock/index.ts b/packages/dev-env/src/mock/index.ts index 98c5b2ef8bb..9ccf5c7de0e 100644 --- a/packages/dev-env/src/mock/index.ts +++ b/packages/dev-env/src/mock/index.ts @@ -1,4 +1,5 @@ import { AtpAgent, COM_ATPROTO_MODERATION } from '@atproto/api' +import { ConflictingQueueError } from '@atproto/api/dist/client/types/tools/ozone/queue/createQueue' import { Database } from '@atproto/bsky' import { AtUri, AtUriString } from '@atproto/syntax' import { EXAMPLE_LABELER, RecordRef, TestNetwork } from '../index' @@ -109,7 +110,49 @@ export async function generateMockSetup(env: TestNetwork) { await env.ozone.addModeratorDid(mod.did) await env.ozone.addAdminDid(adminMod.did) - // Report one user + // Create report queues + const ozoneAgent = env.ozone.getAgent() + const adminHeaders = async (nsid: string) => + env.ozone.modHeaders(nsid, 'admin') + + const createQueue = async (input: { + name: string + subjectTypes: string[] + reportTypes: string[] + collection?: string + }): Promise => { + try { + await ozoneAgent.tools.ozone.queue.createQueue(input, { + encoding: 'application/json', + headers: await adminHeaders('tools.ozone.queue.createQueue'), + }) + } catch (err) { + if (!(err instanceof ConflictingQueueError)) { + throw err + } + } + } + + await Promise.all([ + createQueue({ + name: 'Spammy Accounts', + subjectTypes: ['account'], + reportTypes: [COM_ATPROTO_MODERATION.DefsReasonSpam], + }), + createQueue({ + name: 'Threatening Accounts', + subjectTypes: ['account'], + reportTypes: ['tools.ozone.report.defs#reasonViolenceThreats'], + }), + createQueue({ + name: 'Spammy Posts', + subjectTypes: ['record'], + reportTypes: [COM_ATPROTO_MODERATION.DefsReasonSpam], + collection: 'app.bsky.feed.post', + }), + ]) + + // Report one user (random) const reporter = picka(userAgents) await reporter.com.atproto.moderation.createReport({ reasonType: picka([ @@ -123,6 +166,21 @@ export async function generateMockSetup(env: TestNetwork) { }, }) + // Reports that target queues + await alice.com.atproto.moderation.createReport({ + reasonType: COM_ATPROTO_MODERATION.DefsReasonSpam, + reason: 'This account is spamming', + subject: { $type: 'com.atproto.admin.defs#repoRef', did: bob.did }, + }) + await bob.com.atproto.moderation.createReport({ + reasonType: 'tools.ozone.report.defs#reasonViolenceThreats', + reason: 'Threatened me', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: carla.did, + }, + }) + // everybody follows everybody const follow = async (author: AtpAgent, subject: AtpAgent) => { await author.app.bsky.graph.follow.create( @@ -179,6 +237,22 @@ export async function generateMockSetup(env: TestNetwork) { } } + // Spam post report + if (posts.length > 0) { + await carla.com.atproto.moderation.createReport({ + reasonType: COM_ATPROTO_MODERATION.DefsReasonSpam, + reason: 'This post is spam', + subject: { + $type: 'com.atproto.repo.strongRef', + uri: posts[0].uri, + cid: posts[0].cid, + }, + }) + } + + // Route all reports to queues + await env.ozone.daemon.ctx.queueRouter.routeReports() + // make some naughty posts & label them const file = Buffer.from(labeledImgB64, 'base64') const uploadedImg = await bob.com.atproto.repo.uploadBlob(file, { diff --git a/packages/dev-env/src/moderator-client.ts b/packages/dev-env/src/moderator-client.ts index d90d5e7fd38..7d77013d223 100644 --- a/packages/dev-env/src/moderator-client.ts +++ b/packages/dev-env/src/moderator-client.ts @@ -4,6 +4,7 @@ import { ToolsOzoneModerationEmitEvent as EmitModerationEvent, ToolsOzoneModerationQueryEvents as QueryModerationEvents, ToolsOzoneModerationQueryStatuses as QueryModerationStatuses, + ToolsOzoneReportQueryReports as QueryModerationReports, ToolsOzoneSettingRemoveOptions, ToolsOzoneSettingUpsertOption, } from '@atproto/api' @@ -12,6 +13,7 @@ import { TestOzone } from './ozone' type TakeActionInput = EmitModerationEvent.InputSchema type QueryStatusesParams = QueryModerationStatuses.QueryParams type QueryEventsParams = QueryModerationEvents.QueryParams +type QueryReportsParams = QueryModerationReports.QueryParams type ModLevel = 'admin' | 'moderator' | 'triage' export class ModeratorClient { @@ -69,6 +71,16 @@ export class ModeratorClient { return result.data } + async queryReports(input: QueryReportsParams, role?: ModLevel) { + const result = await this.agent.tools.ozone.report.queryReports(input, { + headers: await this.ozone.modHeaders( + 'tools.ozone.report.queryReports', + role, + ), + }) + return result.data + } + async emitEvent( opts: { event: TakeActionInput['event'] @@ -79,6 +91,7 @@ export class ModeratorClient { meta?: unknown modTool?: ToolsOzoneModerationDefs.ModTool externalId?: string + reportAction?: TakeActionInput['reportAction'] }, role?: ModLevel, ) { @@ -89,6 +102,7 @@ export class ModeratorClient { createdBy = 'did:example:admin', modTool, externalId, + reportAction, } = opts const result = await this.agent.tools.ozone.moderation.emitEvent( { @@ -98,6 +112,7 @@ export class ModeratorClient { createdBy, modTool, externalId, + reportAction, }, { encoding: 'application/json', @@ -228,4 +243,10 @@ export class ModeratorClient { return data } + + async computeStats() { + const db = this.ozone.ctx.db + const statsService = this.ozone.ctx.reportStatsService(db) + await statsService.materializeAll({ force: true }) + } } diff --git a/packages/ozone/src/api/index.ts b/packages/ozone/src/api/index.ts index 211cfca7ffc..e1725ff6d5e 100644 --- a/packages/ozone/src/api/index.ts +++ b/packages/ozone/src/api/index.ts @@ -24,7 +24,27 @@ import queryStatuses from './moderation/queryStatuses' import scheduleAction from './moderation/scheduleAction' import searchRepos from './moderation/searchRepos' import proxied from './proxied' +import assignQueueModerator from './queue/assignModerator' +import createQueue from './queue/createQueue' +import deleteQueue from './queue/deleteQueue' +import getQueueAssignments from './queue/getAssignments' +import listQueues from './queue/listQueues' +import routeReports from './queue/routeReports' +import unassignQueueModerator from './queue/unassignModerator' +import updateQueue from './queue/updateQueue' +import assignReportModerator from './report/assignModerator' +import createActivity from './report/createActivity' import createReport from './report/createReport' +import getReportAssignments from './report/getAssignments' +import getHistoricalStats from './report/getHistoricalStats' +import getLatestReport from './report/getLatestReport' +import getLiveStats from './report/getLiveStats' +import getReport from './report/getReport' +import listActivities from './report/listActivities' +import queryReports from './report/queryReports' +import reassignQueue from './report/reassignQueue' +import refreshStats from './report/refreshStats' +import unassignReportModerator from './report/unassignModerator' import addSafelinkRule from './safelink/addRule' import querySafelinkEvents from './safelink/queryEvents' import querySafelinkRules from './safelink/queryRules' @@ -62,6 +82,8 @@ export default function (server: Server, ctx: AppContext) { getRepos(server, ctx) getEvent(server, ctx) queryEvents(server, ctx) + getReport(server, ctx) + queryReports(server, ctx) queryStatuses(server, ctx) queryLabels(server, ctx) subscribeLabels(server, ctx) @@ -77,6 +99,10 @@ export default function (server: Server, ctx: AppContext) { chat(server, ctx) proxied(server, ctx) getConfig(server, ctx) + createQueue(server, ctx) + listQueues(server, ctx) + updateQueue(server, ctx) + deleteQueue(server, ctx) setAddValues(server, ctx) setGetValues(server, ctx) querySets(server, ctx) @@ -100,5 +126,19 @@ export default function (server: Server, ctx: AppContext) { scheduleAction(server, ctx) listScheduledActions(server, ctx) cancelScheduledActions(server, ctx) + routeReports(server, ctx) + getLiveStats(server, ctx) + getHistoricalStats(server, ctx) + refreshStats(server, ctx) + assignQueueModerator(server, ctx) + unassignQueueModerator(server, ctx) + getQueueAssignments(server, ctx) + getLatestReport(server, ctx) + assignReportModerator(server, ctx) + unassignReportModerator(server, ctx) + getReportAssignments(server, ctx) + createActivity(server, ctx) + listActivities(server, ctx) + reassignQueue(server, ctx) return server } diff --git a/packages/ozone/src/api/moderation/emitEvent.ts b/packages/ozone/src/api/moderation/emitEvent.ts index f41359572e6..99e15e6244b 100644 --- a/packages/ozone/src/api/moderation/emitEvent.ts +++ b/packages/ozone/src/api/moderation/emitEvent.ts @@ -26,6 +26,7 @@ import { } from '../../lexicon/types/tools/ozone/moderation/defs' import { HandlerInput } from '../../lexicon/types/tools/ozone/moderation/emitEvent' import { httpLogger } from '../../logger' +import { processReportAction } from '../../mod-service/report' import { subjectFromInput } from '../../mod-service/subject' import { SettingService } from '../../setting/service' import { TagService } from '../../tag-service' @@ -240,6 +241,21 @@ const handleModerationEvent = async ({ } } + // Validate reportAction if provided (actual processing happens after event is logged) + if (input.body.reportAction) { + // Validate that at least one targeting criteria is provided + const { reportAction } = input.body + if ( + !reportAction.ids?.length && + !reportAction.types?.length && + !reportAction.all + ) { + throw new InvalidRequestError( + 'reportAction must specify ids, types, or all', + ) + } + } + const result = await moderationTxn.logEvent({ event, subject, @@ -248,6 +264,28 @@ const handleModerationEvent = async ({ externalId, }) + // Update reports if reportAction was provided + if (input.body.reportAction) { + const subjectUri = subject.isRecord() ? subject.uri : null + try { + await processReportAction({ + db: dbTxn, + reportAction: input.body.reportAction, + subjectDid: subject.did, + subjectUri, + eventId: result.event.id, + eventType: event.$type, + createdBy, + }) + } catch (err) { + throw new InvalidRequestError( + err instanceof Error + ? err.message + : 'Failed to process report action', + ) + } + } + const tagService = new TagService( subject, result.subjectStatus, diff --git a/packages/ozone/src/api/queue/assignModerator.ts b/packages/ozone/src/api/queue/assignModerator.ts new file mode 100644 index 00000000000..27d52f5922a --- /dev/null +++ b/packages/ozone/src/api/queue/assignModerator.ts @@ -0,0 +1,31 @@ +import { ForbiddenError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getAuthDid } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.assignModerator({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const { queueId, did } = input.body + const authDid = getAuthDid(auth, ctx.cfg.service.did) + + // RBAC + if (!auth.credentials.isModerator) { + throw new ForbiddenError('Unauthorized') + } + + // RuBAC + if (did !== authDid && !auth.credentials.isAdmin) { + throw new ForbiddenError('Unauthorized') + } + + const result = await ctx.assignmentService.assignQueue({ did, queueId }) + + return { + encoding: 'application/json', + body: result, + } + }, + }) +} diff --git a/packages/ozone/src/api/queue/createQueue.ts b/packages/ozone/src/api/queue/createQueue.ts new file mode 100644 index 00000000000..5e36f61b860 --- /dev/null +++ b/packages/ozone/src/api/queue/createQueue.ts @@ -0,0 +1,62 @@ +import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +const VALID_SUBJECT_TYPES = ['account', 'record', 'message'] + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.createQueue({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const access = auth.credentials + + if (!access.isModerator) { + throw new AuthRequiredError('Must be a moderator to create a queue') + } + + const { name, subjectTypes, collection, reportTypes, description } = + input.body + const createdBy = + access.type === 'admin_token' ? 'admin_token' : access.iss + + const invalidTypes = subjectTypes.filter( + (t) => !VALID_SUBJECT_TYPES.includes(t), + ) + if (invalidTypes.length > 0) { + throw new InvalidRequestError( + `Invalid subject types: ${invalidTypes.join(', ')}. Allowed values: ${VALID_SUBJECT_TYPES.join(', ')}`, + 'InvalidSubjectType', + ) + } + + if (collection && !subjectTypes.includes('record')) { + throw new InvalidRequestError( + 'collection can only be specified when subjectTypes includes "record"', + 'InvalidCollection', + ) + } + + const queueService = ctx.queueService(ctx.db) + + await queueService.checkConflict({ + subjectTypes, + collection, + reportTypes, + }) + + const queue = await queueService.create({ + name, + subjectTypes, + collection, + reportTypes, + description, + createdBy, + }) + + return { + encoding: 'application/json', + body: { queue: queueService.view(queue) }, + } + }, + }) +} diff --git a/packages/ozone/src/api/queue/deleteQueue.ts b/packages/ozone/src/api/queue/deleteQueue.ts new file mode 100644 index 00000000000..289d60cf814 --- /dev/null +++ b/packages/ozone/src/api/queue/deleteQueue.ts @@ -0,0 +1,56 @@ +import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.deleteQueue({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const access = auth.credentials + + if (!access.isModerator) { + throw new AuthRequiredError('Must be a moderator to delete a queue') + } + + const { queueId, migrateToQueueId } = input.body + + const queueService = ctx.queueService(ctx.db) + + const existing = await queueService.getById(queueId) + if (!existing) { + throw new InvalidRequestError( + `Queue with id ${queueId} does not exist`, + 'QueueNotFound', + ) + } + + if (migrateToQueueId !== undefined) { + const targetQueue = await queueService.getById(migrateToQueueId) + if (!targetQueue) { + throw new InvalidRequestError( + `Target queue with id ${migrateToQueueId} does not exist`, + 'QueueNotFound', + ) + } + } + + // Migrate non-closed reports before soft-deleting the queue. + // Closed reports are left assigned to the deleted queue — their history is preserved. + // Non-closed reports go to migrateToQueueId if specified, otherwise to -1 (unmatched). + const reportsMigrated = await queueService.migrateReports( + queueId, + migrateToQueueId, + ) + + await queueService.delete(queueId) + + return { + encoding: 'application/json', + body: { + deleted: true, + reportsMigrated, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/queue/getAssignments.ts b/packages/ozone/src/api/queue/getAssignments.ts new file mode 100644 index 00000000000..6e2830ced8c --- /dev/null +++ b/packages/ozone/src/api/queue/getAssignments.ts @@ -0,0 +1,19 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.getAssignments({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params }) => { + const result = await ctx.assignmentService.getQueueAssignments(params) + + return { + encoding: 'application/json', + body: { + assignments: result.assignments, + cursor: result.cursor, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/queue/listQueues.ts b/packages/ozone/src/api/queue/listQueues.ts new file mode 100644 index 00000000000..32ca5b58ee0 --- /dev/null +++ b/packages/ozone/src/api/queue/listQueues.ts @@ -0,0 +1,39 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.listQueues({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params }) => { + const { + limit = 50, + cursor, + enabled, + subjectType, + collection, + reportTypes, + } = params + + const queueService = ctx.queueService(ctx.db) + + const result = await queueService.list({ + limit, + cursor, + enabled, + subjectType, + collection, + reportTypes, + }) + + const queues = await queueService.viewsWithStats(result.queues) + + return { + encoding: 'application/json', + body: { + queues, + cursor: result.cursor, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/queue/routeReports.ts b/packages/ozone/src/api/queue/routeReports.ts new file mode 100644 index 00000000000..4956f74f9d8 --- /dev/null +++ b/packages/ozone/src/api/queue/routeReports.ts @@ -0,0 +1,44 @@ +import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +const MAX_REPORTS = 5000 + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.routeReports({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const access = auth.credentials + const { startReportId, endReportId } = input.body + + if (!access.isModerator) { + throw new AuthRequiredError('Must be an admin to re-route reports') + } + if (startReportId > endReportId) { + throw new InvalidRequestError( + 'startReportId must be less than or equal to endReportId', + ) + } + if (endReportId - startReportId + 1 > MAX_REPORTS) { + throw new InvalidRequestError( + `Cannot route more than ${MAX_REPORTS} reports at a time`, + 'OutOfRange', + ) + } + + const queueService = ctx.queueService(ctx.db) + const { assigned, unmatched } = await queueService.assignReportBatch( + { start: startReportId, end: endReportId, limit: MAX_REPORTS }, + { includeUnmatched: true }, + ) + + return { + encoding: 'application/json', + body: { + assigned, + unmatched, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/queue/unassignModerator.ts b/packages/ozone/src/api/queue/unassignModerator.ts new file mode 100644 index 00000000000..17488f41df8 --- /dev/null +++ b/packages/ozone/src/api/queue/unassignModerator.ts @@ -0,0 +1,26 @@ +import { ForbiddenError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getAuthDid } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.unassignModerator({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const { queueId, did } = input.body + const authDid = getAuthDid(auth, ctx.cfg.service.did) + + // RBAC + if (!auth.credentials.isModerator) { + throw new ForbiddenError('Unauthorized') + } + + // RuBAC + if (did !== authDid && !auth.credentials.isAdmin) { + throw new ForbiddenError('Unauthorized') + } + + await ctx.assignmentService.unassignQueue({ did, queueId }) + }, + }) +} diff --git a/packages/ozone/src/api/queue/updateQueue.ts b/packages/ozone/src/api/queue/updateQueue.ts new file mode 100644 index 00000000000..e90949f23c1 --- /dev/null +++ b/packages/ozone/src/api/queue/updateQueue.ts @@ -0,0 +1,54 @@ +import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.queue.updateQueue({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const access = auth.credentials + + if (!access.isModerator) { + throw new AuthRequiredError('Must be a moderator to update a queue') + } + + const { queueId, name, enabled, description } = input.body + + if ( + name === undefined && + enabled === undefined && + description === undefined + ) { + throw new InvalidRequestError( + 'At least one of name, enabled, or description must be provided', + ) + } + + const queueService = ctx.queueService(ctx.db) + + const existing = await queueService.getById(queueId) + if (!existing) { + throw new InvalidRequestError( + `Queue with id ${queueId} does not exist`, + 'QueueNotFound', + ) + } + + const updates: { + name?: string + enabled?: boolean + description?: string + } = {} + if (name !== undefined) updates.name = name + if (enabled !== undefined) updates.enabled = enabled + if (description !== undefined) updates.description = description + + const queue = await queueService.update(queueId, updates) + + return { + encoding: 'application/json', + body: { queue: queueService.view(queue) }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/assignModerator.ts b/packages/ozone/src/api/report/assignModerator.ts new file mode 100644 index 00000000000..7200fee458f --- /dev/null +++ b/packages/ozone/src/api/report/assignModerator.ts @@ -0,0 +1,36 @@ +import { ForbiddenError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getAuthDid } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.assignModerator({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const authDid = getAuthDid(auth, ctx.cfg.service.did) + const did = input.body.did ?? authDid + + if (!did) { + throw new ForbiddenError('No one to assign report to') + } + + // RuBAC: only admins can assign to a different user + if (did !== authDid && !auth.credentials.isAdmin) { + throw new ForbiddenError('Unauthorized') + } + + const result = await ctx.assignmentService.assignReport({ + did, + createdBy: authDid, + reportId: input.body.reportId, + queueId: input.body.queueId, + isPermanent: input.body.isPermanent, + }) + + return { + encoding: 'application/json', + body: result, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/createActivity.ts b/packages/ozone/src/api/report/createActivity.ts new file mode 100644 index 00000000000..49424be25e2 --- /dev/null +++ b/packages/ozone/src/api/report/createActivity.ts @@ -0,0 +1,57 @@ +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { + ActivityType, + createReportActivity, + formatActivityView, +} from '../../report/activity' +import { getAuthDid } from '../util' + +const VALID_ACTIVITY_TYPES = new Set([ + 'queueActivity', + 'assignmentActivity', + 'escalationActivity', + 'closeActivity', + 'reopenActivity', + 'noteActivity', +]) + +const DEFS_PREFIX = 'tools.ozone.report.defs#' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.createActivity({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const createdBy = getAuthDid(auth, ctx.cfg.service.did) + const { reportId, activity, internalNote, publicNote, isAutomated } = + input.body + + const rawType = activity.$type ?? '' + const activityType = rawType.startsWith(DEFS_PREFIX) + ? rawType.slice(DEFS_PREFIX.length) + : rawType + + if (!VALID_ACTIVITY_TYPES.has(activityType as ActivityType)) { + throw new InvalidRequestError( + `Unknown activity type: ${rawType}`, + 'InvalidActivityType', + ) + } + + const row = await createReportActivity(ctx.db, { + reportId, + activityType: activityType as ActivityType, + internalNote: internalNote ?? undefined, + publicNote: publicNote ?? undefined, + isAutomated: isAutomated ?? false, + createdBy: createdBy ?? ctx.cfg.service.did, + }) + + return { + encoding: 'application/json', + body: { activity: formatActivityView(row) }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/getAssignments.ts b/packages/ozone/src/api/report/getAssignments.ts new file mode 100644 index 00000000000..a5d124cd72d --- /dev/null +++ b/packages/ozone/src/api/report/getAssignments.ts @@ -0,0 +1,20 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.getAssignments({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params }) => { + const { assignments, cursor } = + await ctx.assignmentService.getReportAssignments(params) + + return { + encoding: 'application/json', + body: { + assignments, + cursor, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/getHistoricalStats.ts b/packages/ozone/src/api/report/getHistoricalStats.ts new file mode 100644 index 00000000000..c4814fb68bb --- /dev/null +++ b/packages/ozone/src/api/report/getHistoricalStats.ts @@ -0,0 +1,41 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { viewHistoricalStats } from '../../report/views' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.getHistoricalStats({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params }) => { + const { + queueId, + moderatorDid, + reportTypes, + startDate, + endDate, + limit, + cursor, + } = params + + const reportStatsService = ctx.reportStatsService(ctx.db) + const result = await reportStatsService.getHistoricalStats({ + group: { + queueId: queueId ?? null, + moderatorDid: moderatorDid ?? null, + reportTypes: reportTypes?.length ? reportTypes : null, + }, + startDate, + endDate, + limit: limit ?? 30, + cursor, + }) + + return { + encoding: 'application/json', + body: { + stats: result.stats.map(viewHistoricalStats), + cursor: result.cursor, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/getLatestReport.ts b/packages/ozone/src/api/report/getLatestReport.ts new file mode 100644 index 00000000000..0857b611354 --- /dev/null +++ b/packages/ozone/src/api/report/getLatestReport.ts @@ -0,0 +1,44 @@ +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getLatestReport } from '../../mod-service/report' +import { buildReportView, hydrateReportInfo } from '../../report/views' +import { getPdsAccountInfos } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.getLatestReport({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ auth, req }) => { + const db = ctx.db + const modService = ctx.modService(db) + const labelers = ctx.reqLabelers(req) + + const report = await getLatestReport(db) + if (!report) { + throw new InvalidRequestError('No report found', 'NotFound') + } + + const queueService = ctx.queueService(db) + const teamService = ctx.teamService(db) + const hydrated = await hydrateReportInfo( + [report], + modService.views, + (dids) => getPdsAccountInfos(ctx, dids), + (queueIds) => queueService.getViewsByIds(queueIds), + (dids) => teamService.viewByDids(dids), + labelers, + ) + + return { + encoding: 'application/json', + body: { + report: buildReportView( + report, + hydrated, + auth.credentials.isModerator, + ), + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/getLiveStats.ts b/packages/ozone/src/api/report/getLiveStats.ts new file mode 100644 index 00000000000..722155b7fc6 --- /dev/null +++ b/packages/ozone/src/api/report/getLiveStats.ts @@ -0,0 +1,26 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { viewLiveStats } from '../../report/views' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.getLiveStats({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params }) => { + const { queueId, moderatorDid, reportTypes } = params + + const reportStatsService = ctx.reportStatsService(ctx.db) + const row = await reportStatsService.getLiveStats({ + queueId: queueId ?? null, + moderatorDid: moderatorDid ?? null, + reportTypes: reportTypes?.length ? reportTypes : null, + }) + + return { + encoding: 'application/json', + body: { + stats: viewLiveStats(row), + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/getReport.ts b/packages/ozone/src/api/report/getReport.ts new file mode 100644 index 00000000000..ddd2b9d8c27 --- /dev/null +++ b/packages/ozone/src/api/report/getReport.ts @@ -0,0 +1,55 @@ +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getReportById } from '../../mod-service/report' +import { buildReportView, hydrateReportInfo } from '../../report/views' +import { getPdsAccountInfos } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.getReport({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params, auth, req }) => { + const db = ctx.db + const modService = ctx.modService(db) + const labelers = ctx.reqLabelers(req) + + const report = await getReportById(db, params.id) + if (!report) { + throw new InvalidRequestError( + `Report not found: ${params.id}`, + 'NotFound', + ) + } + + const queueService = ctx.queueService(db) + const teamService = ctx.teamService(db) + const [hydrated, actionEvents] = await Promise.all([ + hydrateReportInfo( + [report], + modService.views, + (dids) => getPdsAccountInfos(ctx, dids), + (queueIds) => queueService.getViewsByIds(queueIds), + (dids) => teamService.viewByDids(dids), + labelers, + ), + Array.isArray(report.actionEventIds) && report.actionEventIds.length + ? modService.getEventsByIds(report.actionEventIds as number[]) + : Promise.resolve([]), + ]) + + const actions = actionEvents.map((evt) => + modService.views.formatEvent(evt), + ) + + return { + encoding: 'application/json', + body: buildReportView( + report, + hydrated, + auth.credentials.isModerator, + actions, + ), + } + }, + }) +} diff --git a/packages/ozone/src/api/report/listActivities.ts b/packages/ozone/src/api/report/listActivities.ts new file mode 100644 index 00000000000..5b01ea078bd --- /dev/null +++ b/packages/ozone/src/api/report/listActivities.ts @@ -0,0 +1,34 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { formatActivityView, listReportActivities } from '../../report/activity' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.listActivities({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params }) => { + const { reportId, limit, cursor } = params + + const { activities, cursor: nextCursor } = await listReportActivities( + ctx.db, + { reportId, limit, cursor }, + ) + + // Fetch team members for all createdBy DIDs + const createdByDids = Array.from( + new Set(activities.map((a) => a.createdBy)), + ) + const teamService = ctx.teamService(ctx.db) + const memberViews = await teamService.viewByDids(createdByDids) + + return { + encoding: 'application/json', + body: { + activities: activities.map((activity) => + formatActivityView(activity, memberViews), + ), + cursor: nextCursor, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/queryReports.ts b/packages/ozone/src/api/report/queryReports.ts new file mode 100644 index 00000000000..3c0d576fc50 --- /dev/null +++ b/packages/ozone/src/api/report/queryReports.ts @@ -0,0 +1,44 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { queryReports } from '../../mod-service/report' +import { buildReportView, hydrateReportInfo } from '../../report/views' +import { getPdsAccountInfos } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.queryReports({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ params, auth, req }) => { + const db = ctx.db + const modService = ctx.modService(db) + const labelers = ctx.reqLabelers(req) + + const { reports: reportsToReturn, cursor } = await queryReports( + db, + params, + ) + + const queueService = ctx.queueService(db) + const teamService = ctx.teamService(db) + const hydrated = await hydrateReportInfo( + reportsToReturn, + modService.views, + (dids) => getPdsAccountInfos(ctx, dids), + (queueIds) => queueService.getViewsByIds(queueIds), + (dids) => teamService.viewByDids(dids), + labelers, + ) + + const reportViews = reportsToReturn.map((report) => + buildReportView(report, hydrated, auth.credentials.isModerator), + ) + + return { + encoding: 'application/json', + body: { + cursor, + reports: reportViews, + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/reassignQueue.ts b/packages/ozone/src/api/report/reassignQueue.ts new file mode 100644 index 00000000000..71f58878464 --- /dev/null +++ b/packages/ozone/src/api/report/reassignQueue.ts @@ -0,0 +1,68 @@ +import { InvalidRequestError } from '@atproto/xrpc-server' +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getReportById } from '../../mod-service/report' +import { reassignReportQueue } from '../../report/reassign' +import { buildReportView, hydrateReportInfo } from '../../report/views' +import { getAuthDid, getPdsAccountInfos } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.reassignQueue({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth, req }) => { + const createdBy = + getAuthDid(auth, ctx.cfg.service.did) ?? ctx.cfg.service.did + const db = ctx.db + const queueService = ctx.queueService(db) + + await reassignReportQueue(db, queueService, { + reportId: input.body.reportId, + toQueueId: input.body.queueId, + comment: input.body.comment, + createdBy, + }) + + const report = await getReportById(db, input.body.reportId) + if (!report) { + throw new InvalidRequestError( + `Report ${input.body.reportId} not found after reassignment`, + 'ReportNotFound', + ) + } + + const modService = ctx.modService(db) + const teamService = ctx.teamService(db) + const labelers = ctx.reqLabelers(req) + + const [hydrated, actionEvents] = await Promise.all([ + hydrateReportInfo( + [report], + modService.views, + (dids) => getPdsAccountInfos(ctx, dids), + (queueIds) => queueService.getViewsByIds(queueIds), + (dids) => teamService.viewByDids(dids), + labelers, + ), + Array.isArray(report.actionEventIds) && report.actionEventIds.length + ? modService.getEventsByIds(report.actionEventIds as number[]) + : Promise.resolve([]), + ]) + + const actions = actionEvents.map((evt) => + modService.views.formatEvent(evt), + ) + + return { + encoding: 'application/json', + body: { + report: buildReportView( + report, + hydrated, + auth.credentials.isModerator, + actions, + ), + }, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/refreshStats.ts b/packages/ozone/src/api/report/refreshStats.ts new file mode 100644 index 00000000000..b1572de6aef --- /dev/null +++ b/packages/ozone/src/api/report/refreshStats.ts @@ -0,0 +1,27 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.refreshStats({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const access = auth.credentials + if (!access.isModerator) { + throw new Error('Must be a moderator to refresh stats') + } + + const { startDate, endDate, queueIds } = input.body + const reportStatsService = ctx.reportStatsService(ctx.db) + await reportStatsService.refreshDateRange({ + startDate, + endDate, + queueIds, + }) + + return { + encoding: 'application/json', + body: {}, + } + }, + }) +} diff --git a/packages/ozone/src/api/report/unassignModerator.ts b/packages/ozone/src/api/report/unassignModerator.ts new file mode 100644 index 00000000000..4bf84531939 --- /dev/null +++ b/packages/ozone/src/api/report/unassignModerator.ts @@ -0,0 +1,21 @@ +import { AppContext } from '../../context' +import { Server } from '../../lexicon' +import { getAuthDid } from '../util' + +export default function (server: Server, ctx: AppContext) { + server.tools.ozone.report.unassignModerator({ + auth: ctx.authVerifier.modOrAdminToken, + handler: async ({ input, auth }) => { + const authDid = getAuthDid(auth, ctx.cfg.service.did) + const result = await ctx.assignmentService.unassignReport({ + reportId: input.body.reportId, + createdBy: authDid, + }) + + return { + encoding: 'application/json', + body: result, + } + }, + }) +} diff --git a/packages/ozone/src/api/util.ts b/packages/ozone/src/api/util.ts index efb9dcbbaac..04f5b7257c3 100644 --- a/packages/ozone/src/api/util.ts +++ b/packages/ozone/src/api/util.ts @@ -1,4 +1,5 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { AdminTokenOutput, ModeratorOutput } from '../auth-verifier' import { AppContext } from '../context' import { Member } from '../db/schema/member' import { ModerationEvent } from '../db/schema/moderation_event' @@ -21,6 +22,17 @@ import { } from '../lexicon/types/tools/ozone/team/defs' import { ModerationSubjectStatusRow } from '../mod-service/types' +export const getAuthDid = ( + auth: ModeratorOutput | AdminTokenOutput, + serviceDid: string, +): string | undefined => { + return auth.credentials.type === 'moderator' + ? auth.credentials.iss + : auth.credentials.type === 'admin_token' + ? serviceDid + : undefined +} + export const getPdsAccountInfos = async ( ctx: AppContext, dids: string[], diff --git a/packages/ozone/src/assignment/index.ts b/packages/ozone/src/assignment/index.ts new file mode 100644 index 00000000000..38b1f875e6c --- /dev/null +++ b/packages/ozone/src/assignment/index.ts @@ -0,0 +1,731 @@ +import { Selectable } from 'kysely' +import { ToolsOzoneQueueDefs } from '@atproto/api' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { Database } from '../db' +import { EndAtIdKeyset, paginate } from '../db/pagination' +import { ModeratorAssignment } from '../db/schema/moderator_assignment' +import { ReportQueue } from '../db/schema/report_queue' +import type * as ToolsOzoneReportDefs from '../lexicon/types/tools/ozone/report/defs' +import type { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs' +import { QueueService, QueueServiceCreator } from '../queue/service' +import { createReportActivity } from '../report/activity' +import { TeamService, TeamServiceCreator } from '../team' + +export interface AssignmentServiceOpts { + queueDurationMs: number + reportDurationMs: number +} + +// Queue +export interface GetQueueAssignmentsInput { + onlyActive?: boolean + queueIds?: number[] + dids?: string[] + limit?: number + cursor?: string +} +export interface AssignQueueInput { + did: string + queueId: number +} +export interface UnassignQueueInput { + did: string + queueId: number +} + +// Report +export interface GetReportAssignmentsInput { + onlyActive?: boolean + reportIds?: number[] + queueIds?: number[] + dids?: string[] + limit?: number + cursor?: string +} +export interface AssignReportInput { + did: string + reportId: number + queueId?: number | null + isPermanent?: boolean + createdBy?: string +} +export interface UnassignReportInput { + reportId: number + createdBy?: string +} + +type AssignmentRowWithQueue = Selectable & { + queueName: string | null + queueSubjectTypes: string[] | null + queueCollection: string | null + queueDescription: string | null + queueReportTypes: string[] | null + queueCreatedBy: string | null + queueCreatedAt: string | null + queueUpdatedAt: string | null + queueEnabled: boolean | null + queueDeletedAt: string | null +} + +export type AssignmentServiceCreator = (db: Database) => AssignmentService + +export class AssignmentService { + constructor( + public db: Database, + public opts: AssignmentServiceOpts, + private queueService: QueueService, + private teamService: TeamService, + ) {} + + static creator( + opts: AssignmentServiceOpts, + queueServiceCreator: QueueServiceCreator, + teamServiceCreator: TeamServiceCreator, + ): AssignmentServiceCreator { + return (db: Database) => + new AssignmentService( + db, + opts, + queueServiceCreator(db), + teamServiceCreator(db), + ) + } + + private async fetchMemberViews( + dids: string[], + ): Promise> { + return this.teamService.viewByDids(dids) + } + + async getQueueAssignments(input: GetQueueAssignmentsInput): Promise<{ + assignments: ToolsOzoneQueueDefs.AssignmentView[] + cursor?: string + }> { + const { onlyActive, queueIds, dids, limit, cursor } = input + const { ref } = this.db.db.dynamic + + let query = this.db.db + .selectFrom('moderator_assignment') + .leftJoin( + 'report_queue', + 'report_queue.id', + 'moderator_assignment.queueId', + ) + .selectAll('moderator_assignment') + .select([ + 'report_queue.name as queueName', + 'report_queue.subjectTypes as queueSubjectTypes', + 'report_queue.collection as queueCollection', + 'report_queue.description as queueDescription', + 'report_queue.reportTypes as queueReportTypes', + 'report_queue.createdBy as queueCreatedBy', + 'report_queue.createdAt as queueCreatedAt', + 'report_queue.updatedAt as queueUpdatedAt', + 'report_queue.enabled as queueEnabled', + 'report_queue.deletedAt as queueDeletedAt', + ]) + .where('reportId', 'is', null) + .where('queueId', 'is not', null) + + if (onlyActive) { + const now = new Date().toISOString() + query = query.where((qb) => + qb.where('endAt', 'is', null).orWhere('endAt', '>', now), + ) + } + + if (queueIds?.length) { + query = query.where('queueId', 'in', queueIds) + } + + if (dids?.length) { + query = query.where('did', 'in', dids) + } + + // use endAt to take advantage of indexes + // Qualify column refs to avoid ambiguity with the report_queue join + const keyset = new EndAtIdKeyset( + ref('moderator_assignment.endAt'), + ref('moderator_assignment.id'), + ) + const paginatedQuery = paginate(query, { + limit, + cursor, + keyset, + direction: 'desc', + tryIndex: true, + }) + + const results = await paginatedQuery.execute() + const memberViews = await this.fetchMemberViews(results.map((r) => r.did)) + + return { + assignments: results.map((row) => + this.viewQueueAssignment(row, memberViews.get(row.did)), + ), + cursor: keyset.packFromResult(results), + } + } + + async getReportAssignments(input: GetReportAssignmentsInput): Promise<{ + assignments: ToolsOzoneReportDefs.AssignmentView[] + cursor?: string + }> { + const { onlyActive, reportIds, queueIds, dids, limit, cursor } = input + const { ref } = this.db.db.dynamic + + let query = this.db.db + .selectFrom('moderator_assignment') + .leftJoin( + 'report_queue', + 'report_queue.id', + 'moderator_assignment.queueId', + ) + .selectAll('moderator_assignment') + .select([ + 'report_queue.name as queueName', + 'report_queue.subjectTypes as queueSubjectTypes', + 'report_queue.collection as queueCollection', + 'report_queue.description as queueDescription', + 'report_queue.reportTypes as queueReportTypes', + 'report_queue.createdBy as queueCreatedBy', + 'report_queue.createdAt as queueCreatedAt', + 'report_queue.updatedAt as queueUpdatedAt', + 'report_queue.enabled as queueEnabled', + 'report_queue.deletedAt as queueDeletedAt', + ]) + .where('reportId', 'is not', null) + + if (onlyActive) { + const now = new Date().toISOString() + query = query.where((qb) => + qb.where('endAt', '>', now).orWhere('endAt', 'is', null), + ) + } + + if (reportIds?.length) { + query = query.where('reportId', 'in', reportIds) + } + + if (queueIds?.length) { + query = query.where('queueId', 'in', queueIds) + } + + if (dids?.length) { + query = query.where('did', 'in', dids) + } + + // Qualify column refs to avoid ambiguity with the report_queue join + const keyset = new EndAtIdKeyset( + ref('moderator_assignment.endAt'), + ref('moderator_assignment.id'), + ) + const paginatedQuery = paginate(query, { + limit, + cursor, + keyset, + direction: 'desc', + tryIndex: true, + }) + + const results = await paginatedQuery.execute() + const memberViews = await this.fetchMemberViews(results.map((r) => r.did)) + + return { + assignments: results.map((row) => + this.viewReportAssignment(row, memberViews.get(row.did)), + ), + cursor: keyset.packFromResult(results), + } + } + + async assignQueue( + input: AssignQueueInput, + ): Promise { + const { did, queueId } = input + const now = new Date() + + // Check queue since we aren't using foreign keys + const queue = await this.db.db + .selectFrom('report_queue') + .selectAll() + .where('id', '=', queueId) + .where('enabled', '=', true) + .where('deletedAt', 'is', null) + .executeTakeFirst() + if (!queue) { + throw new InvalidRequestError('Invalid queue', 'InvalidAssignment') + } + + // Queue assignments are permanent (endAt = null). Upgrade any existing + // active expiry-based row to permanent; otherwise insert a new permanent row. + const result = await this.db.transaction(async (dbTxn) => { + const existing = await dbTxn.db + .selectFrom('moderator_assignment') + .selectAll() + .where('did', '=', did) + .where('queueId', '=', queueId) + .where('reportId', 'is', null) + .where((qb) => + qb + .where('endAt', 'is', null) + .orWhere('endAt', '>', now.toISOString()), + ) + .executeTakeFirst() + if (existing) { + if (existing.endAt === null) { + return existing + } + const updated = await dbTxn.db + .updateTable('moderator_assignment') + .set({ endAt: null }) + .where('id', '=', existing.id) + .returningAll() + .executeTakeFirstOrThrow() + return updated + } + const created = await dbTxn.db + .insertInto('moderator_assignment') + .values({ + did, + queueId, + startAt: now.toISOString(), + endAt: null, + }) + .returningAll() + .executeTakeFirstOrThrow() + return created + }) + + if (result.queueId === null || result.reportId !== null) { + throw new Error('Failed to assign moderator to queue') + } + + const row = await this.db.db + .selectFrom('moderator_assignment') + .leftJoin( + 'report_queue', + 'report_queue.id', + 'moderator_assignment.queueId', + ) + .selectAll('moderator_assignment') + .select([ + 'report_queue.name as queueName', + 'report_queue.subjectTypes as queueSubjectTypes', + 'report_queue.collection as queueCollection', + 'report_queue.description as queueDescription', + 'report_queue.reportTypes as queueReportTypes', + 'report_queue.createdBy as queueCreatedBy', + 'report_queue.createdAt as queueCreatedAt', + 'report_queue.updatedAt as queueUpdatedAt', + 'report_queue.enabled as queueEnabled', + 'report_queue.deletedAt as queueDeletedAt', + ]) + .where('moderator_assignment.id', '=', result.id) + .executeTakeFirstOrThrow() + + const memberViews = await this.fetchMemberViews([result.did]) + return this.viewQueueAssignment(row, memberViews.get(result.did)) + } + + async unassignQueue(input: UnassignQueueInput): Promise { + const { did, queueId } = input + const now = new Date() + + const existing = await this.db.db + .selectFrom('moderator_assignment') + .selectAll() + .where('did', '=', did) + .where('queueId', '=', queueId) + .where('reportId', 'is', null) + .where((qb) => + qb.where('endAt', 'is', null).orWhere('endAt', '>', now.toISOString()), + ) + .executeTakeFirst() + + if (!existing) { + throw new InvalidRequestError( + 'No active assignment found', + 'InvalidAssignment', + ) + } + + await this.db.db + .updateTable('moderator_assignment') + .set({ endAt: now.toISOString() }) + .where('id', '=', existing.id) + .execute() + } + + async assignReport( + input: AssignReportInput, + ): Promise { + const { did, reportId, queueId, isPermanent = false } = input + const now = new Date() + + // Check report and queue since we aren't using foreign keys + await this.checkReport(reportId) + if (queueId !== undefined && queueId !== null) { + await this.checkQueue(queueId) + } + + // Make assignment + const result = await this.db.transaction(async (dbTxn) => { + if (isPermanent) { + // Check for an existing permanent assignment (endAt IS NULL) + const permanentExisting = await dbTxn.db + .selectFrom('moderator_assignment') + .selectAll() + .where('reportId', '=', reportId) + .where('endAt', 'is', null) + .executeTakeFirst() + + let result: Selectable + + if (permanentExisting) { + if (permanentExisting.did !== did) { + throw new InvalidRequestError( + 'Report already assigned', + 'AlreadyAssigned', + ) + } + // Same user — update queueId if provided + result = await dbTxn.db + .updateTable('moderator_assignment') + .set({ queueId: queueId ?? permanentExisting.queueId ?? null }) + .where('id', '=', permanentExisting.id) + .returningAll() + .executeTakeFirstOrThrow() + } else { + // Upgrade an existing active (non-permanent) assignment to permanent + const activeExisting = await dbTxn.db + .selectFrom('moderator_assignment') + .selectAll() + .where('reportId', '=', reportId) + .where('endAt', '>', now.toISOString()) + .executeTakeFirst() + + if (activeExisting) { + result = await dbTxn.db + .updateTable('moderator_assignment') + .set({ + did, + endAt: null, + queueId: queueId ?? activeExisting.queueId ?? null, + }) + .where('id', '=', activeExisting.id) + .returningAll() + .executeTakeFirstOrThrow() + } else { + // Create new permanent assignment + result = await dbTxn.db + .insertInto('moderator_assignment') + .values({ + did, + reportId, + queueId: queueId, + startAt: now.toISOString(), + endAt: null, + }) + .returningAll() + .executeTakeFirstOrThrow() + } + } + + // Sync denormalized assignment fields on report table + await dbTxn.db + .updateTable('report') + .set({ assignedTo: did, assignedAt: now.toISOString() }) + .where('id', '=', reportId) + .execute() + + return result + } + + // Non-permanent: find any active or permanent assignment + const existing = await dbTxn.db + .selectFrom('moderator_assignment') + .selectAll() + .where('reportId', '=', reportId) + .where((qb) => + qb + .where('endAt', '>', now.toISOString()) + .orWhere('endAt', 'is', null), + ) + .executeTakeFirst() + + if (existing) { + if (existing.did !== did) { + throw new InvalidRequestError( + 'Report already assigned', + 'AlreadyAssigned', + ) + } + // Refresh the expiry unless the assignment is already permanent + const newEndAt = + existing.endAt === null + ? null + : new Date(now.getTime() + this.opts.reportDurationMs).toISOString() + return dbTxn.db + .updateTable('moderator_assignment') + .set({ + endAt: newEndAt, + queueId: queueId ?? existing.queueId ?? null, + }) + .where('id', '=', existing.id) + .returningAll() + .executeTakeFirstOrThrow() + } + + const endAt = new Date( + now.getTime() + this.opts.reportDurationMs, + ).toISOString() + return dbTxn.db + .insertInto('moderator_assignment') + .values({ + did, + reportId, + queueId: queueId, + startAt: now.toISOString(), + endAt, + }) + .returningAll() + .executeTakeFirstOrThrow() + }) + + // Log an assignmentActivity ONLY for permanent assignments. Swallow AlreadyInTargetState + // so that re-assignments (e.g. refreshing expiry) don't throw. + if (input.isPermanent) { + try { + await createReportActivity(this.db, { + reportId, + activityType: 'assignmentActivity', + isAutomated: false, + createdBy: input.createdBy ?? did, + meta: { assignedTo: did }, + }) + } catch (err) { + if ( + err instanceof InvalidRequestError && + err.customErrorName === 'AlreadyInTargetState' + ) { + // no-op — report already assigned, no state change to record + } else { + throw err + } + } + } + + return this.hydrateReportAssignment(result.id) + } + + async unassignReport( + input: UnassignReportInput, + ): Promise { + const { reportId, createdBy } = input + const now = new Date() + + await this.checkReport(reportId) + + const { result, reportStatus } = await this.db.transaction( + async (dbTxn) => { + const existing = await dbTxn.db + .selectFrom('moderator_assignment') + .selectAll() + .where('reportId', '=', reportId) + .where((qb) => + qb + .where('endAt', '>', now.toISOString()) + .orWhere('endAt', 'is', null), + ) + .executeTakeFirst() + + if (!existing) { + throw new InvalidRequestError( + 'Report is not assigned', + 'InvalidAssignment', + ) + } + + const updated = await dbTxn.db + .updateTable('moderator_assignment') + .set({ endAt: now.toISOString() }) + .where('id', '=', existing.id) + .returningAll() + .executeTakeFirstOrThrow() + + // Capture status before any update so we can decide on the next status. + const reportRow = await dbTxn.db + .selectFrom('report') + .select('status') + .where('id', '=', reportId) + .forUpdate() + .executeTakeFirstOrThrow() + + // If the report had moved to 'assigned' and the assignment was not tied + // to a queue, send it back to 'open' so it isn't stuck in 'assigned' + // after the moderator releases it. The 'queued' transition (when there + // is a queueId) is handled below via createReportActivity. + const updateSet: Record = { + assignedTo: null, + assignedAt: null, + } + if (reportRow.status === 'assigned' && existing.queueId === null) { + updateSet.status = 'open' + updateSet.updatedAt = now.toISOString() + } + await dbTxn.db + .updateTable('report') + .set(updateSet) + .where('id', '=', reportId) + .execute() + + return { result: updated, reportStatus: reportRow.status } + }, + ) + + // If unassigning from a queued report (status moved to 'assigned' on + // permanent assign) before any other status change, send it back to + // 'queued' so other moderators can pick it up. + if (reportStatus === 'assigned' && result.queueId !== null) { + try { + await createReportActivity(this.db, { + reportId, + activityType: 'queueActivity', + isAutomated: false, + createdBy: createdBy ?? result.did, + }) + } catch (err) { + if ( + err instanceof InvalidRequestError && + (err.customErrorName === 'AlreadyInTargetState' || + err.customErrorName === 'InvalidStateTransition') + ) { + // no-op — status changed concurrently; leave it alone + } else { + throw err + } + } + } + + return this.hydrateReportAssignment(result.id) + } + + private async checkReport(reportId: number): Promise { + const report = await this.db.db + .selectFrom('report') + .selectAll() + .where('id', '=', reportId) + .executeTakeFirst() + if (!report) { + throw new InvalidRequestError('Invalid report', 'InvalidAssignment') + } + } + + private async checkQueue(queueId: number): Promise { + const queue = await this.db.db + .selectFrom('report_queue') + .selectAll() + .where('id', '=', queueId) + .where('enabled', '=', true) + .where('deletedAt', 'is', null) + .executeTakeFirst() + if (!queue) { + throw new InvalidRequestError('Invalid queue', 'InvalidAssignment') + } + } + + private async hydrateReportAssignment( + assignmentId: number, + ): Promise { + const row = await this.db.db + .selectFrom('moderator_assignment') + .leftJoin( + 'report_queue', + 'report_queue.id', + 'moderator_assignment.queueId', + ) + .selectAll('moderator_assignment') + .select([ + 'report_queue.name as queueName', + 'report_queue.subjectTypes as queueSubjectTypes', + 'report_queue.collection as queueCollection', + 'report_queue.description as queueDescription', + 'report_queue.reportTypes as queueReportTypes', + 'report_queue.createdBy as queueCreatedBy', + 'report_queue.createdAt as queueCreatedAt', + 'report_queue.updatedAt as queueUpdatedAt', + 'report_queue.enabled as queueEnabled', + 'report_queue.deletedAt as queueDeletedAt', + ]) + .where('moderator_assignment.id', '=', assignmentId) + .executeTakeFirstOrThrow() + + const memberViews = await this.fetchMemberViews([row.did]) + return this.viewReportAssignment(row, memberViews.get(row.did)) + } + + queueFromJoined( + row: AssignmentRowWithQueue, + ): Selectable | undefined { + if (row.queueId === null || row.queueName === null) { + return undefined + } + + return { + id: row.queueId, + name: row.queueName, + subjectTypes: row.queueSubjectTypes ?? [], + collection: row.queueCollection, + reportTypes: row.queueReportTypes ?? [], + description: row.queueDescription ?? null, + createdBy: row.queueCreatedBy ?? '', + createdAt: row.queueCreatedAt ?? '', + updatedAt: row.queueUpdatedAt ?? '', + enabled: row.queueEnabled ?? false, + deletedAt: row.queueDeletedAt, + } + } + + viewQueueAssignment( + row: AssignmentRowWithQueue, + member?: TeamMember, + ): ToolsOzoneQueueDefs.AssignmentView { + const queueService = this.queueService + + const queue = this.queueFromJoined(row) + const queueView = queue ? queueService.view(queue) : undefined + if (!queueView) { + throw new Error('Failed to hydrate queue') + } + + return { + id: row.id, + did: row.did, + ...(member ? { moderator: member } : {}), + queue: queueView, + startAt: row.startAt, + ...(row.endAt !== null ? { endAt: row.endAt } : {}), + } + } + + viewReportAssignment( + row: AssignmentRowWithQueue, + member?: TeamMember, + ): ToolsOzoneReportDefs.AssignmentView { + const queueService = this.queueService + + const queue = this.queueFromJoined(row) + const queueView = queue ? queueService.view(queue) : undefined + + return { + id: row.id, + did: row.did, + ...(member ? { moderator: member } : {}), + reportId: row.reportId!, + ...(queueView ? { queue: queueView } : {}), + startAt: row.startAt, + ...(row.endAt !== null ? { endAt: row.endAt } : {}), + } + } +} diff --git a/packages/ozone/src/config/config.ts b/packages/ozone/src/config/config.ts index 3d3ad51697d..5de8d3cb3fa 100644 --- a/packages/ozone/src/config/config.ts +++ b/packages/ozone/src/config/config.ts @@ -90,6 +90,15 @@ export const envToCfg = (env: OzoneEnvironment): OzoneConfig => { } : null + const assignmentsCfg: OzoneConfig['assignments'] = { + queueDurationMs: env.assignmentQueueDurationMs ?? 5 * MINUTE, + reportDurationMs: env.assignmentReportDurationMs ?? 5 * MINUTE, + } + + const statsCfg: OzoneConfig['stats'] = { + computerIntervalMinutes: env.statsComputerIntervalMinutes ?? 15, + } + return { service: serviceCfg, db: dbCfg, @@ -101,6 +110,8 @@ export const envToCfg = (env: OzoneEnvironment): OzoneConfig => { blobDivert: blobDivertServiceCfg, access: accessCfg, verifier: verifierCfg, + assignments: assignmentsCfg, + stats: statsCfg, jetstreamUrl: env.jetstreamUrl, } } @@ -115,10 +126,21 @@ export type OzoneConfig = { identity: IdentityConfig blobDivert: BlobDivertConfig | null access: AccessConfig + assignments: AssignmentsConfig + stats: StatsConfig jetstreamUrl?: string verifier: VerifierConfig | null } +export type StatsConfig = { + /** + * Minutes between stats computer cycles. + * Defaults to 15. Minimum is 1. + * Set to -1 to disable the stats computer. + */ + computerIntervalMinutes: number +} + export type ServiceConfig = { port: number publicUrl: string @@ -182,3 +204,8 @@ export type VerifierConfig = { jetstreamUrl?: string issuersToIndex?: string[] } + +export type AssignmentsConfig = { + queueDurationMs: number + reportDurationMs: number +} diff --git a/packages/ozone/src/config/env.ts b/packages/ozone/src/config/env.ts index cc78aeb79bc..4824866cb40 100644 --- a/packages/ozone/src/config/env.ts +++ b/packages/ozone/src/config/env.ts @@ -43,6 +43,11 @@ export const readEnv = (): OzoneEnvironment => { verifierPassword: envStr('OZONE_VERIFIER_PASSWORD'), verifierIssuersToIndex: envList('OZONE_VERIFIER_ISSUERS_TO_INDEX'), jetstreamUrl: envStr('OZONE_JETSTREAM_URL'), + assignmentQueueDurationMs: envInt('OZONE_ASSIGNMENT_QUEUE_DURATION_MS'), + assignmentReportDurationMs: envInt('OZONE_ASSIGNMENT_REPORT_DURATION_MS'), + statsComputerIntervalMinutes: envInt( + 'OZONE_STATS_COMPUTER_INTERVAL_MINUTES', + ), } } @@ -84,4 +89,7 @@ export type OzoneEnvironment = { verifierPassword?: string verifierIssuersToIndex?: string[] jetstreamUrl?: string + assignmentQueueDurationMs?: number + assignmentReportDurationMs?: number + statsComputerIntervalMinutes?: number } diff --git a/packages/ozone/src/context.ts b/packages/ozone/src/context.ts index 48b500c147e..7c6e4851dd0 100644 --- a/packages/ozone/src/context.ts +++ b/packages/ozone/src/context.ts @@ -5,6 +5,7 @@ import { AtpAgent } from '@atproto/api' import { Keypair, Secp256k1Keypair } from '@atproto/crypto' import { DidCache, IdResolver, MemoryCache } from '@atproto/identity' import { createServiceAuthHeaders } from '@atproto/xrpc-server' +import { AssignmentService } from './assignment' import { AuthVerifier } from './auth-verifier' import { BackgroundQueue } from './background' import { @@ -22,6 +23,8 @@ import { ModerationServiceProfileCreator, } from './mod-service/profile' import { StrikeService, StrikeServiceCreator } from './mod-service/strike' +import { QueueService, QueueServiceCreator } from './queue/service' +import { ReportStatsService, ReportStatsServiceCreator } from './report/stats' import { SafelinkRuleService, SafelinkRuleServiceCreator, @@ -58,6 +61,8 @@ export type AppContextOptions = { communicationTemplateService: CommunicationTemplateServiceCreator safelinkRuleService: SafelinkRuleServiceCreator scheduledActionService: ScheduledActionServiceCreator + queueService: QueueServiceCreator + reportStatsService: ReportStatsServiceCreator setService: SetServiceCreator settingService: SettingServiceCreator strikeService: StrikeServiceCreator @@ -73,6 +78,7 @@ export type AppContextOptions = { imgInvalidator?: ImageInvalidator backgroundQueue: BackgroundQueue sequencer: Sequencer + assignmentService: AssignmentService authVerifier: AuthVerifier verificationService: VerificationServiceCreator verificationIssuer: VerificationIssuerCreator @@ -143,6 +149,8 @@ export class AppContext { cfg.appview.did, createAuthHeaders, ) + const queueService = QueueService.creator() + const reportStatsService = ReportStatsService.creator() const setService = SetService.creator() const settingService = SettingService.creator() const strikeService = StrikeService.creator() @@ -164,6 +172,14 @@ export class AppContext { strikeService, overrides?.imgInvalidator, ) + const assignmentService = AssignmentService.creator( + { + queueDurationMs: cfg.assignments.queueDurationMs, + reportDurationMs: cfg.assignments.reportDurationMs, + }, + queueService, + teamService, + )(db) const sequencer = new Sequencer(modService(db)) @@ -183,6 +199,8 @@ export class AppContext { safelinkRuleService, scheduledActionService, teamService, + queueService, + reportStatsService, setService, settingService, strikeService, @@ -195,6 +213,7 @@ export class AppContext { idResolver, backgroundQueue, sequencer, + assignmentService, authVerifier, blobDiverter, verificationService, @@ -245,6 +264,14 @@ export class AppContext { return this.opts.teamService } + get queueService(): QueueServiceCreator { + return this.opts.queueService + } + + get reportStatsService(): ReportStatsServiceCreator { + return this.opts.reportStatsService + } + get setService(): SetServiceCreator { return this.opts.setService } @@ -309,6 +336,10 @@ export class AppContext { return this.opts.sequencer } + get assignmentService(): AssignmentService { + return this.opts.assignmentService + } + get authVerifier(): AuthVerifier { return this.opts.authVerifier } diff --git a/packages/ozone/src/daemon/context.ts b/packages/ozone/src/daemon/context.ts index 87cb7acace8..9011fde33a2 100644 --- a/packages/ozone/src/daemon/context.ts +++ b/packages/ozone/src/daemon/context.ts @@ -8,6 +8,8 @@ import { OzoneConfig, OzoneSecrets } from '../config' import { Database } from '../db' import { ModerationService } from '../mod-service' import { StrikeService } from '../mod-service/strike' +import { QueueService } from '../queue/service' +import { ReportStatsService } from '../report/stats' import { ScheduledActionService } from '../scheduled-action/service' import { SettingService } from '../setting/service' import { TeamService } from '../team' @@ -15,7 +17,9 @@ import { getSigningKeyId } from '../util' import { EventPusher } from './event-pusher' import { EventReverser } from './event-reverser' import { MaterializedViewRefresher } from './materialized-view-refresher' +import { QueueRouter } from './queue-router' import { ScheduledActionProcessor } from './scheduled-action-processor' +import { StatsComputer } from './stats-computer' import { StrikeExpiryProcessor } from './strike-expiry-processor' import { TeamProfileSynchronizer } from './team-profile-synchronizer' import { VerificationListener } from './verification-listener' @@ -31,7 +35,9 @@ export type DaemonContextOptions = { teamProfileSynchronizer: TeamProfileSynchronizer scheduledActionProcessor: ScheduledActionProcessor strikeExpiryProcessor: StrikeExpiryProcessor + queueRouter: QueueRouter verificationListener?: VerificationListener + statsComputer?: StatsComputer } export class DaemonContext { @@ -111,6 +117,16 @@ export class DaemonContext { const strikeExpiryProcessor = new StrikeExpiryProcessor(db, strikeService) + const queueService = QueueService.creator() + const queueRouter = new QueueRouter(db, queueService) + + const reportStatsService = ReportStatsService.creator() + const statsComputer = new StatsComputer( + db, + reportStatsService, + cfg.stats.computerIntervalMinutes, + ) + // Only spawn the listener if verifier config exists and a jetstream URL is provided const verificationListener = cfg.verifier && cfg.jetstreamUrl @@ -132,7 +148,9 @@ export class DaemonContext { teamProfileSynchronizer, scheduledActionProcessor, strikeExpiryProcessor, + queueRouter, verificationListener, + statsComputer, ...(overrides ?? {}), }) } @@ -173,10 +191,18 @@ export class DaemonContext { return this.opts.strikeExpiryProcessor } + get queueRouter(): QueueRouter { + return this.opts.queueRouter + } + get verificationListener(): VerificationListener | undefined { return this.opts.verificationListener } + get statsComputer(): StatsComputer | undefined { + return this.opts.statsComputer + } + async start() { this.eventPusher.start() this.eventReverser.start() @@ -184,12 +210,18 @@ export class DaemonContext { this.teamProfileSynchronizer.start() this.scheduledActionProcessor.start() this.strikeExpiryProcessor.start() + this.queueRouter.start() this.verificationListener?.start() + this.statsComputer?.start() } async processAll() { // Sequential because the materialized view values depend on the events. await this.eventPusher.processAll() + // Drain pending modEventReport rows into the report table so test code + // that calls processAll() after creating reports sees the report rows + // immediately (in production this happens via the 1-min poll). + await this.queueRouter.routeReports() await this.materializedViewRefresher.run() await this.teamProfileSynchronizer.run() } @@ -203,7 +235,9 @@ export class DaemonContext { this.teamProfileSynchronizer.destroy(), this.scheduledActionProcessor.destroy(), this.strikeExpiryProcessor.destroy(), + this.queueRouter.destroy(), this.verificationListener?.stop(), + this.statsComputer?.destroy(), ]) } finally { await this.backgroundQueue.destroy() diff --git a/packages/ozone/src/daemon/job-cursor.ts b/packages/ozone/src/daemon/job-cursor.ts new file mode 100644 index 00000000000..61d4ea5e5f3 --- /dev/null +++ b/packages/ozone/src/daemon/job-cursor.ts @@ -0,0 +1,33 @@ +import { Database } from '../db' + +export async function initJobCursor(db: Database, job: string): Promise { + await db.db + .insertInto('job_cursor') + .values({ job, cursor: null }) + .onConflict((oc) => oc.doNothing()) + .execute() +} + +export async function getJobCursor( + db: Database, + job: string, +): Promise { + const entry = await db.db + .selectFrom('job_cursor') + .select('cursor') + .where('job', '=', job) + .executeTakeFirst() + return entry?.cursor ?? null +} + +export async function updateJobCursor( + db: Database, + job: string, + cursor: string, +): Promise { + await db.db + .updateTable('job_cursor') + .set({ cursor }) + .where('job', '=', job) + .execute() +} diff --git a/packages/ozone/src/daemon/queue-router.ts b/packages/ozone/src/daemon/queue-router.ts new file mode 100644 index 00000000000..4888cfb713e --- /dev/null +++ b/packages/ozone/src/daemon/queue-router.ts @@ -0,0 +1,101 @@ +import { MINUTE } from '@atproto/common' +import { Database } from '../db' +import { dbLogger } from '../logger' +import { QueueServiceCreator } from '../queue/service' +import { initJobCursor } from './job-cursor' + +const JOB_NAME = 'queue_router' +const BATCH_SIZE = 100 + +export class QueueRouter { + destroyed = false + processingPromise: Promise = Promise.resolve() + timer?: NodeJS.Timeout + + constructor( + private db: Database, + private queueServiceCreator: QueueServiceCreator, + ) {} + + start() { + this.initializeCursor().then(() => this.poll()) + } + + poll() { + if (this.destroyed) return + this.processingPromise = this.routeReports() + .catch((err) => dbLogger.error({ err }, 'queue routing errored')) + .finally(() => { + this.timer = setTimeout(() => this.poll(), getInterval()) + }) + } + + async destroy() { + this.destroyed = true + if (this.timer) { + clearTimeout(this.timer) + this.timer = undefined + } + await this.processingPromise + } + + async initializeCursor() { + await initJobCursor(this.db, JOB_NAME) + } + + async getCursor(): Promise { + const row = await this.db.db + .selectFrom('job_cursor') + .select('cursor') + .where('job', '=', JOB_NAME) + .executeTakeFirst() + return row?.cursor ? parseInt(row.cursor, 10) : null + } + + async routeReports() { + await this.db.transaction(async (txn) => { + // Acquire row lock on the job_cursor row. A second daemon instance + // hitting this same query blocks here until the first transaction + // commits, then reads the now-advanced cursor and processes the next + // range. The lock is held for the whole batch (~50–200ms). + const row = await txn.db + .selectFrom('job_cursor') + .selectAll() + .where('job', '=', JOB_NAME) + .forUpdate() + .executeTakeFirst() + if (!row) return + const cursor = row.cursor ? parseInt(row.cursor, 10) : null + + const queueService = this.queueServiceCreator(txn) + const result = await queueService.insertReportsFromEvents({ + cursor, + limit: BATCH_SIZE, + }) + + if (result.processed === 0) { + dbLogger.info('no new report events to route') + return + } + + await txn.db + .updateTable('job_cursor') + .set({ cursor: String(result.maxEventId) }) + .where('job', '=', JOB_NAME) + .execute() + + dbLogger.info( + { + processed: result.processed, + assigned: result.assigned, + unmatched: result.unmatched, + maxEventId: result.maxEventId, + }, + 'queue routing completed', + ) + }) + } +} + +// Poll every 1 minute +const getInterval = (): number => 1 * MINUTE diff --git a/packages/ozone/src/daemon/stats-computer.ts b/packages/ozone/src/daemon/stats-computer.ts new file mode 100644 index 00000000000..565601ce108 --- /dev/null +++ b/packages/ozone/src/daemon/stats-computer.ts @@ -0,0 +1,101 @@ +import { sql } from 'kysely' +import { MINUTE } from '@atproto/common' +import { Database } from '../db' +import { dbLogger } from '../logger' +import { ReportStatsServiceCreator } from '../report/stats' + +// Stable lock ID for pg_try_advisory_lock across all instances +const ADVISORY_LOCK_ID = 7_239_401 + +/** + * Background daemon that materializes report statistics on an interval (default is 15 minutes). + * + * Each cycle computes calendar-day snapshots: today's stats are recomputed (in-progress day), + * and yesterday's snapshot is finalized if it wasn't already. Historical snapshots (completed + * days) are write-once and never recomputed unless explicitly refreshed via the API. + * + * Query profile per cycle (assuming ~10K reports/day, 10 queues, 20 moderators, 9 type groups): + * - 7 batched GROUP BY queries against the report table for today's date window + * (+ 7 more for yesterday if finalization is needed). + * Day-window queries scan ~10K rows. Pending-count queries use partial indexes + * (WHERE status != 'closed') so only scan open reports, not the full table. + * Expected: ~10-50ms per query, ~100-350ms total report-table time. + * - ~40 lightweight reads against report_stat for freshness checks (small indexed table). + * - ~40 lightweight writes to report_stat for upserts. + * + * Locking: Uses pg_try_advisory_lock to ensure only one instance materializes at a time + * when running multiple containers. Advisory locks are cooperative, session-level locks — + * they do NOT block any table reads, writes, row locks, or transactions from other sessions. + * Normal application queries (report creation, moderation actions, API reads) are completely + * unaffected. If another instance already holds the lock, this instance skips the cycle + * immediately without blocking. + */ +export class StatsComputer { + destroyed = false + processingPromise: Promise = Promise.resolve() + timer?: NodeJS.Timeout + + constructor( + private db: Database, + private reportStatsServiceCreator: ReportStatsServiceCreator, + /** + * Minutes between stats computer cycles. + * Defaults to 15. Minimum is 1. + * Set to -1 to disable the stats computer. + */ + private intervalMinutes: number, + ) {} + + get disabled() { + return this.intervalMinutes < 1 + } + + start() { + this.poll() + } + + poll() { + if (this.destroyed || this.disabled) return + this.processingPromise = this.materializeStats() + .catch((err) => dbLogger.error({ err }, 'stats materialization errored')) + .finally(() => { + this.timer = setTimeout( + () => this.poll(), + this.intervalMinutes * MINUTE, + ) + }) + } + + private async materializeStats() { + const lockResult = await sql<{ + locked: boolean + }>`SELECT pg_try_advisory_lock(${ADVISORY_LOCK_ID}) as locked`.execute( + this.db.db, + ) + const acquired = lockResult.rows[0]?.locked === true + if (!acquired) { + dbLogger.info( + 'stats materialization skipped, another instance holds lock', + ) + return + } + + try { + const statsService = this.reportStatsServiceCreator(this.db) + await statsService.materializeAll() + } finally { + await sql`SELECT pg_advisory_unlock(${ADVISORY_LOCK_ID})`.execute( + this.db.db, + ) + } + } + + async destroy() { + this.destroyed = true + if (this.timer) { + clearTimeout(this.timer) + this.timer = undefined + } + await this.processingPromise + } +} diff --git a/packages/ozone/src/daemon/strike-expiry-processor.ts b/packages/ozone/src/daemon/strike-expiry-processor.ts index a89abe8257b..d1861d72c0c 100644 --- a/packages/ozone/src/daemon/strike-expiry-processor.ts +++ b/packages/ozone/src/daemon/strike-expiry-processor.ts @@ -2,6 +2,7 @@ import { HOUR } from '@atproto/common' import { Database } from '../db' import { dbLogger } from '../logger' import { StrikeServiceCreator } from '../mod-service/strike' +import { getJobCursor, initJobCursor, updateJobCursor } from './job-cursor' const JOB_NAME = 'strike_expiry' @@ -40,32 +41,15 @@ export class StrikeExpiryProcessor { } async initializeCursor() { - await this.db.db - .insertInto('job_cursor') - .values({ - job: JOB_NAME, - cursor: null, - }) - .onConflict((oc) => oc.doNothing()) - .execute() + await initJobCursor(this.db, JOB_NAME) } async getCursor(): Promise { - const entry = await this.db.db - .selectFrom('job_cursor') - .select('cursor') - .where('job', '=', JOB_NAME) - .executeTakeFirst() - - return entry?.cursor || null + return getJobCursor(this.db, JOB_NAME) } async updateCursor(cursor: string): Promise { - await this.db.db - .updateTable('job_cursor') - .set({ cursor }) - .where('job', '=', JOB_NAME) - .execute() + await updateJobCursor(this.db, JOB_NAME, cursor) } async processExpiredStrikes() { diff --git a/packages/ozone/src/db/migrations/20260219T164523000Z-create-report-table.ts b/packages/ozone/src/db/migrations/20260219T164523000Z-create-report-table.ts new file mode 100644 index 00000000000..d38d0066d13 --- /dev/null +++ b/packages/ozone/src/db/migrations/20260219T164523000Z-create-report-table.ts @@ -0,0 +1,155 @@ +import { Kysely, sql } from 'kysely' + +export async function up(db: Kysely): Promise { + // Report table - bridges report events to action events + await db.schema + .createTable('report') + .addColumn('id', 'serial', (col) => col.primaryKey()) + + // Core link to report event (display data still comes from moderation_event via JOIN) + .addColumn('eventId', 'integer', (col) => col.notNull().unique()) + + // Queue assignment (computed by background job in future iteration) + .addColumn('queueId', 'integer') // NULL = not yet assigned, -1 = no matching queue + .addColumn('queuedAt', 'varchar') + + // Action linkage (sorted DESC, most recent first) + .addColumn('actionEventIds', 'jsonb') // Array of event IDs: [newest_id, ..., oldest_id] + + // Reporter communication + .addColumn('actionNote', 'text') + + // Whether the report is muted (reporter was muted or subject was muted at creation time) + .addColumn('isMuted', 'boolean', (col) => col.notNull().defaultTo(false)) + + // Status of the ticket/report + .addColumn('status', 'varchar', (col) => col.notNull().defaultTo('open')) // "open", "closed", "escalated" + + // Denormalized from moderation_event for filtering without JOIN + .addColumn('reportType', 'varchar', (col) => col.notNull()) + .addColumn('did', 'varchar', (col) => col.notNull()) + .addColumn('recordPath', 'varchar', (col) => col.notNull().defaultTo('')) // '' = account/message, 'collection/rkey' = record + .addColumn('subjectMessageId', 'varchar') // NULL for non-message subjects + + // Timestamps + .addColumn('createdAt', 'varchar', (col) => col.notNull()) + .addColumn('updatedAt', 'varchar', (col) => col.notNull()) + .addColumn('assignedTo', 'varchar') // DID of permanently assigned moderator + .addColumn('assignedAt', 'varchar') // When the permanent assignment was created + .addColumn('closedAt', 'varchar') + .execute() + + // ─── Indexes ─── + // Primary JOIN index - critical for every query that fetches display data from moderation_event + await db.schema + .createIndex('idx_report_event') + .on('report') + .column('eventId') + .execute() + + // ─── Hot path: active reports (status != 'closed') ─── + // Partial filter keeps these tight even as closed reports accumulate (~90% of table long-term). + // No isMuted in key (low cardinality, rarely filtered) and no INCLUDE columns + // (display data comes from moderation_event JOIN anyway). + + // queryReports: queueId + status, paginated by createdAt + await sql`CREATE INDEX idx_report_active_queue_created ON report + ("queueId", status, "createdAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // queryReports: queueId + status, paginated by updatedAt + await sql`CREATE INDEX idx_report_active_queue_updated ON report + ("queueId", status, "updatedAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // queryReports: status only, paginated by createdAt + await sql`CREATE INDEX idx_report_active_status_created ON report + (status, "createdAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // queryReports: status only, paginated by updatedAt + await sql`CREATE INDEX idx_report_active_status_updated ON report + (status, "updatedAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // Active reports for a specific account (with optional queueId post-filter) + await sql`CREATE INDEX idx_report_active_did_created ON report + (did, status, "createdAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // A moderator's active workload (with optional queueId post-filter) + await sql`CREATE INDEX idx_report_active_assigned_created ON report + ("assignedTo", status, "createdAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // findReportsForSubject hot path — always filters NOT IN ('closed'). + // did + recordPath identify the subject (account or specific record). + await sql`CREATE INDEX idx_report_subject_active ON report + (did, "recordPath", "createdAt" DESC, id DESC) + WHERE status != 'closed'`.execute(db) + + // ─── Closed history (status = 'closed') ─── + // Closed reports are terminal; only sort by createdAt. + + // Closed pagination per queue + await sql`CREATE INDEX idx_report_closed_queue_created ON report + ("queueId", "createdAt" DESC, id DESC) + WHERE status = 'closed'`.execute(db) + + // Closed history for an account + await sql`CREATE INDEX idx_report_closed_did_created ON report + (did, "createdAt" DESC, id DESC) + WHERE status = 'closed'`.execute(db) + + // Moderator's closed-report history + await sql`CREATE INDEX idx_report_closed_assigned_created ON report + ("assignedTo", "createdAt" DESC, id DESC) + WHERE status = 'closed'`.execute(db) + + // ─── Other access patterns ─── + + // Collection prefix queries: left-anchored LIKE 'app.bsky.feed.post/%' or 'app.bsky.%' + // text_pattern_ops enables btree-scannable prefix matching (supported since Postgres 8.x) + await sql`CREATE INDEX idx_report_record_path_pattern ON report + ("recordPath" text_pattern_ops)`.execute(db) + + // Queue-router covering partial: index-only scan over unrouted, non-closed rows. + // Selects exactly the columns the router reads, eliminating heap fetches per batch. + await sql`CREATE INDEX idx_report_unassigned_id ON report (id) + INCLUDE (status, "reportType", "recordPath", "subjectMessageId") + WHERE "queueId" IS NULL AND status != 'closed'`.execute(db) + + // Index for report statistics + await db.schema + .createIndex('idx_report_queue_created_id') + .on('report') + .columns(['queueId', 'createdAt', 'id']) + .execute() + + // aggregate pending count query + await sql`CREATE INDEX idx_report_pending ON report (id) WHERE status != 'closed'`.execute( + db, + ) + // per-queue pending count query + await sql`CREATE INDEX idx_report_queue_pending ON report ("queueId") WHERE status != 'closed'`.execute( + db, + ) + + // Queue-router event-source partial: scans new modEventReport rows by id + // for the daemon that inserts report rows from moderation_event. + await sql`CREATE INDEX moderation_event_report_id_idx + ON moderation_event (id) + WHERE action = 'tools.ozone.moderation.defs#modEventReport'`.execute(db) + + // Stats windowed queries: aggregate/typeWindow filter by createdAt range and + // include both open and closed reports, so they cannot use the partial indexes + // above. (createdAt, reportType) ordering serves the date-range scan and + // satisfies GROUP BY reportType from the index without a heap fetch. + await sql`CREATE INDEX idx_report_created_type + ON report ("createdAt", "reportType")`.execute(db) +} + +export async function down(db: Kysely): Promise { + await db.schema.dropIndex('moderation_event_report_id_idx').execute() + await db.schema.dropTable('report').execute() +} diff --git a/packages/ozone/src/db/migrations/20260219T165302248Z-moderator-assignment.ts b/packages/ozone/src/db/migrations/20260219T165302248Z-moderator-assignment.ts new file mode 100644 index 00000000000..bb8b95ad242 --- /dev/null +++ b/packages/ozone/src/db/migrations/20260219T165302248Z-moderator-assignment.ts @@ -0,0 +1,42 @@ +import { Kysely, sql } from 'kysely' + +export async function up(db: Kysely): Promise { + await db.schema + .createTable('moderator_assignment') + .addColumn('id', 'serial', (col) => col.primaryKey()) + // assignee + .addColumn('did', 'text', (col) => col.notNull()) + // assigned over + .addColumn('reportId', 'integer') + .addColumn('queueId', 'integer') + // validity + .addColumn('startAt', 'varchar', (col) => col.notNull()) + .addColumn('endAt', 'varchar') + .execute() + + // Partial index for getting active queue assignments + await sql`CREATE INDEX idx_assignment_queue_active ON moderator_assignment ("endAt") WHERE "reportId" IS NULL`.execute( + db, + ) + + // Partial index for getting active report assignments for queue + await sql`CREATE INDEX idx_assignment_report_by_queue ON moderator_assignment ("queueId", "endAt") WHERE "reportId" IS NOT NULL`.execute( + db, + ) + + // Index for checking active report assignment + await db.schema + .createIndex('idx_assignment_report_active') + .on('moderator_assignment') + .columns(['reportId', 'endAt']) + .execute() + + // Partial index for permanent report assignments by moderator + await sql`CREATE INDEX idx_assignment_permanent_did ON moderator_assignment (did, "reportId") WHERE "endAt" IS NULL`.execute( + db, + ) +} + +export async function down(db: Kysely): Promise { + await db.schema.dropTable('moderator_assignment').ifExists().execute() +} diff --git a/packages/ozone/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts b/packages/ozone/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts new file mode 100644 index 00000000000..108b05db7c8 --- /dev/null +++ b/packages/ozone/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts @@ -0,0 +1,41 @@ +import { Kysely, sql } from 'kysely' + +export async function up(db: Kysely): Promise { + // Report queue configuration table + await db.schema + .createTable('report_queue') + .addColumn('id', 'serial', (col) => col.primaryKey()) + .addColumn('name', 'varchar', (col) => col.notNull()) // uniqueness enforced via partial index below + .addColumn('description', 'varchar') // Optional description of the queue + + // Queue filters (determine assignment) + .addColumn('subjectTypes', 'jsonb', (col) => col.notNull()) // Array: ['account'] or ['record'] or both + .addColumn('collection', 'varchar') // Collection name (e.g., 'app.bsky.feed.post'), NULL for accounts + .addColumn('reportTypes', 'jsonb', (col) => col.notNull()) // Array: report reason types + + // Metadata + .addColumn('createdBy', 'varchar', (col) => col.notNull()) // DID of mod who created queue + .addColumn('createdAt', 'varchar', (col) => col.notNull()) + .addColumn('updatedAt', 'varchar', (col) => col.notNull()) + .addColumn('enabled', 'boolean', (col) => col.notNull().defaultTo(true)) + .addColumn('deletedAt', 'varchar') // NULL = active, timestamp = soft-deleted + .execute() + + // Partial unique index on name — only enforces uniqueness for non-deleted queues, + // so a soft-deleted queue's name can be reused by a new queue. + await sql`CREATE UNIQUE INDEX idx_queue_name_unique ON report_queue (name) WHERE "deletedAt" IS NULL`.execute( + db, + ) + + // Partial composite index covers all list queries on active queues: filter by enabled, + // sort by createdAt/id. The WHERE clause keeps the index small (deleted rows excluded). + await sql`CREATE INDEX idx_queue_active ON report_queue (enabled, "createdAt", id) WHERE "deletedAt" IS NULL`.execute( + db, + ) +} + +export async function down(db: Kysely): Promise { + await db.schema.dropIndex('idx_queue_name_unique').execute() + await db.schema.dropIndex('idx_queue_active').execute() + await db.schema.dropTable('report_queue').execute() +} diff --git a/packages/ozone/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts b/packages/ozone/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts new file mode 100644 index 00000000000..abea228f3cc --- /dev/null +++ b/packages/ozone/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts @@ -0,0 +1,48 @@ +import { Kysely, sql } from 'kysely' + +export async function up(db: Kysely): Promise { + await db.schema + .createTable('report_activity') + .addColumn('id', 'serial', (col) => col.primaryKey()) + .addColumn('reportId', 'integer', (col) => col.notNull()) + + // Discriminator: one of queueActivity | assignmentActivity | escalationActivity + // | closeActivity | internalNoteActivity | publicNoteActivity + .addColumn('activityType', 'varchar', (col) => col.notNull()) + + // The report's status at the moment this activity was recorded. + // Populated for state-change activity types; null for note-only activities. + .addColumn('previousStatus', 'varchar') + + // Note fields — separated by audience + .addColumn('internalNote', 'text') // moderator-only + .addColumn('publicNote', 'text') // potentially reporter-visible + + // Free-form JSON for loose activity-specific metadata (e.g. { assignmentId: 42 }) + .addColumn('meta', 'jsonb') + + // True when created by an automated process (e.g. queue router) + .addColumn('isAutomated', 'boolean', (col) => + col.notNull().defaultTo(false), + ) + + .addColumn('createdBy', 'text', (col) => col.notNull()) + .addColumn('createdAt', 'varchar', (col) => col.notNull()) + .execute() + + // Primary filter: all activities for a given report, sorted most-recent-first + await db.schema + .createIndex('idx_report_activity_report_created') + .on('report_activity') + .columns(['reportId', 'createdAt', 'id']) + .execute() + + // Partial index to efficiently find automated activities per report + await sql`CREATE INDEX idx_report_activity_automated ON report_activity ("reportId", "createdAt", id) WHERE "isAutomated" = true`.execute( + db, + ) +} + +export async function down(db: Kysely): Promise { + await db.schema.dropTable('report_activity').execute() +} diff --git a/packages/ozone/src/db/migrations/20260318T152058935Z-add-report-stat.ts b/packages/ozone/src/db/migrations/20260318T152058935Z-add-report-stat.ts new file mode 100644 index 00000000000..f2ba806be1c --- /dev/null +++ b/packages/ozone/src/db/migrations/20260318T152058935Z-add-report-stat.ts @@ -0,0 +1,35 @@ +import { Kysely, sql } from 'kysely' + +export async function up(db: Kysely): Promise { + await db.schema + .createTable('report_stat') + + // metadata + .addColumn('id', 'serial', (col) => col.primaryKey()) + .addColumn('computedAt', 'varchar', (col) => col.notNull()) + + // group + .addColumn('date', 'varchar', (col) => col.notNull()) // ISO date e.g. '2026-04-15' + .addColumn('queueId', 'integer') // NULL = aggregate across all queues + .addColumn('reportTypes', 'jsonb') // NULL = aggregate across all report types + .addColumn('moderatorDid', 'varchar') // NULL = aggregate across all moderators + + // stats + .addColumn('inboundCount', 'integer') + .addColumn('pendingCount', 'integer') + .addColumn('actionedCount', 'integer') + .addColumn('escalatedCount', 'integer') + .addColumn('actionRate', 'integer') + .addColumn('avgHandlingTimeSec', 'integer') + .execute() + + // Lookup by date + group dimensions (covers getLiveStats and getHistoricalStats queries) + await sql`CREATE INDEX idx_report_stat_lookup ON report_stat ( + date, "queueId", "moderatorDid", "reportTypes", "computedAt" + )`.execute(db) +} + +export async function down(db: Kysely): Promise { + await db.schema.dropIndex('idx_report_stat_lookup').ifExists().execute() + await db.schema.dropTable('report_stat').ifExists().execute() +} diff --git a/packages/ozone/src/db/migrations/index.ts b/packages/ozone/src/db/migrations/index.ts index e8da896387c..32ad1c8f49b 100644 --- a/packages/ozone/src/db/migrations/index.ts +++ b/packages/ozone/src/db/migrations/index.ts @@ -34,4 +34,9 @@ export * as _20250813T000000000Z from './20250813T000000000Z-mod-tool-batch-id-i export * as _20250923T000000000Z from './20250923T000000000Z-scheduled-actions' export * as _20251008T120000000Z from './20251008T120000000Z-add-strike-system' export * as _20260210T154806448Z from './20260210T154806448Z-mod-event-created-by-indexes' +export * as _20260219T164523000Z from './20260219T164523000Z-create-report-table' +export * as _20260219T165302248Z from './20260219T165302248Z-moderator-assignment' +export * as _20260225T000000000Z from './20260225T000000000Z-add-report-queue-table' +export * as _20260313T000000000Z from './20260313T000000000Z-add-report-activity-table' +export * as _20260318T152058935Z from './20260318T152058935Z-add-report-stat' export * as _20260428T000000000Z from './20260428T000000000Z-add-expiring-tag-table' diff --git a/packages/ozone/src/db/pagination.ts b/packages/ozone/src/db/pagination.ts index 2c0fcf2d83b..b7429e375f2 100644 --- a/packages/ozone/src/db/pagination.ts +++ b/packages/ozone/src/db/pagination.ts @@ -204,6 +204,91 @@ export class CreatedAtUriKeyset extends GenericKeyset< } } +type EndAtIdKeysetParam = { + id: number + endAt: string | null +} + +// Special value used here to represent a "permanent" endAt (i.e. a record that should be sorted as if it has an endAt infinitely far in the future). +// Chosen to sort before all real timestamps in DESC order. +const PERMANENT_ENDSAT = '9999-12-31T23:59:59.999Z' + +export class EndAtIdKeyset extends GenericKeyset { + labelResult(result: EndAtIdKeysetParam): Cursor + labelResult(result: EndAtIdKeysetParam) { + return { + primary: result.endAt ?? PERMANENT_ENDSAT, + secondary: result.id.toString(), + } + } + labeledResultToCursor(labeled: Cursor) { + return { + primary: new Date(labeled.primary).getTime().toString(), + secondary: labeled.secondary, + } + } + cursorToLabeledResult(cursor: Cursor) { + const primaryDate = new Date(parseInt(cursor.primary, 10)) + if (isNaN(primaryDate.getTime())) { + throw new InvalidRequestError('Malformed cursor') + } + return { + primary: primaryDate.toISOString(), + secondary: cursor.secondary, + } + } + // Override to substitute the PERMANENT_ENDSAT sentinel for NULL endAt rows + // so cursor pagination works across permanent (endAt IS NULL) assignments. + getSql(labeled?: Cursor, direction?: 'asc' | 'desc', tryIndex?: boolean) { + if (labeled === undefined) return + const primaryRef = sql`COALESCE(${this.primary}, ${PERMANENT_ENDSAT})` + if (tryIndex) { + if (direction === 'asc') { + return sql`((${primaryRef}, ${this.secondary}) > (${labeled.primary}, ${labeled.secondary}))` + } else { + return sql`((${primaryRef}, ${this.secondary}) < (${labeled.primary}, ${labeled.secondary}))` + } + } else { + if (direction === 'asc') { + return sql`((${primaryRef} > ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} > ${labeled.secondary}))` + } else { + return sql`((${primaryRef} < ${labeled.primary}) or (${primaryRef} = ${labeled.primary} and ${this.secondary} < ${labeled.secondary}))` + } + } + } +} + +type ComputedAtIdKeysetParam = { + id: number + computedAt: string | Date +} + +export class ComputedAtIdKeyset extends GenericKeyset< + ComputedAtIdKeysetParam, + Cursor +> { + labelResult(result: ComputedAtIdKeysetParam): Cursor + labelResult(result: ComputedAtIdKeysetParam) { + return { primary: result.computedAt, secondary: result.id.toString() } + } + labeledResultToCursor(labeled: Cursor) { + return { + primary: new Date(labeled.primary).getTime().toString(), + secondary: labeled.secondary, + } + } + cursorToLabeledResult(cursor: Cursor) { + const primaryDate = new Date(parseInt(cursor.primary, 10)) + if (isNaN(primaryDate.getTime())) { + throw new InvalidRequestError('Malformed cursor') + } + return { + primary: primaryDate.toISOString(), + secondary: cursor.secondary, + } + } +} + export const paginate = < QB extends AnyQb, K extends GenericKeyset, diff --git a/packages/ozone/src/db/schema/index.ts b/packages/ozone/src/db/schema/index.ts index 645f8eebe25..b279e7b5529 100644 --- a/packages/ozone/src/db/schema/index.ts +++ b/packages/ozone/src/db/schema/index.ts @@ -12,10 +12,15 @@ import * as label from './label' import * as member from './member' import * as modEvent from './moderation_event' import * as modSubjectStatus from './moderation_subject_status' +import * as moderatorAssignment from './moderator_assignment' import * as set from './ozone_set' import * as recordEventsStats from './record_events_stats' import * as recordPushEvent from './record_push_event' import * as repoPushEvent from './repo_push_event' +import * as report from './report' +import * as reportActivity from './report_activity' +import * as reportQueue from './report_queue' +import * as reportStat from './report_stat' import * as safelink from './safelink' import * as scheduledAction from './scheduled-action' import * as setting from './setting' @@ -24,6 +29,9 @@ import * as verification from './verification' export type DatabaseSchemaType = modEvent.PartialDB & modSubjectStatus.PartialDB & + report.PartialDB & + reportActivity.PartialDB & + reportQueue.PartialDB & label.PartialDB & signingKey.PartialDB & repoPushEvent.PartialDB & @@ -43,6 +51,8 @@ export type DatabaseSchemaType = modEvent.PartialDB & jobCursor.PartialDB & safelink.PartialDB & scheduledAction.PartialDB & + moderatorAssignment.PartialDB & + reportStat.PartialDB & expiringTag.PartialDB export type DatabaseSchema = Kysely diff --git a/packages/ozone/src/db/schema/moderator_assignment.ts b/packages/ozone/src/db/schema/moderator_assignment.ts new file mode 100644 index 00000000000..c1508e0b671 --- /dev/null +++ b/packages/ozone/src/db/schema/moderator_assignment.ts @@ -0,0 +1,16 @@ +import { Generated } from 'kysely' + +export const moderatorAssignmentTableName = 'moderator_assignment' + +export interface ModeratorAssignment { + id: Generated + did: string + reportId: number | null + queueId: number | null + startAt: string + endAt: string | null +} + +export type PartialDB = { + [moderatorAssignmentTableName]: ModeratorAssignment +} diff --git a/packages/ozone/src/db/schema/report.ts b/packages/ozone/src/db/schema/report.ts new file mode 100644 index 00000000000..d37410f6265 --- /dev/null +++ b/packages/ozone/src/db/schema/report.ts @@ -0,0 +1,27 @@ +import { Generated } from 'kysely' + +export const reportTableName = 'report' + +export interface Report { + id: Generated + eventId: number // References moderation_event.id + queueId: number | null // NULL = not yet assigned, -1 = no matching queue + queuedAt: string | null + actionEventIds: number[] | null // Array of event IDs, sorted DESC [newest, ..., oldest] + actionNote: string | null + isMuted: boolean + status: string // 'open', 'closed', 'escalated', 'queued', 'assigned' + reportType: string // Denormalized from moderation_event.meta.reportType + did: string // Denormalized from moderation_event.subjectDid + recordPath: string // '' = account/message, 'collection/rkey' = record + subjectMessageId: string | null // Denormalized from moderation_event.subjectMessageId + createdAt: string + updatedAt: string + assignedTo: string | null // DID of permanently assigned moderator, null if unassigned + assignedAt: string | null // When the permanent assignment was created + closedAt: string | null +} + +export type PartialDB = { + [reportTableName]: Report +} diff --git a/packages/ozone/src/db/schema/report_activity.ts b/packages/ozone/src/db/schema/report_activity.ts new file mode 100644 index 00000000000..e7af372e5bd --- /dev/null +++ b/packages/ozone/src/db/schema/report_activity.ts @@ -0,0 +1,22 @@ +import { Generated } from 'kysely' + +export const reportActivityTableName = 'report_activity' + +export interface ReportActivity { + id: Generated + reportId: number + // One of: queueActivity | assignmentActivity | escalationActivity + // | closeActivity | internalNoteActivity | publicNoteActivity + activityType: string + previousStatus: string | null // report status before this activity; null for note-only types + internalNote: string | null // moderator-only note + publicNote: string | null // potentially reporter-visible note + meta: unknown | null // loose activity-specific metadata (e.g. { assignmentId: 42 }) + isAutomated: boolean + createdBy: string // DID of actor (or service DID for automated activities) + createdAt: string // ISO string +} + +export type PartialDB = { + [reportActivityTableName]: ReportActivity +} diff --git a/packages/ozone/src/db/schema/report_queue.ts b/packages/ozone/src/db/schema/report_queue.ts new file mode 100644 index 00000000000..269c40a81f0 --- /dev/null +++ b/packages/ozone/src/db/schema/report_queue.ts @@ -0,0 +1,21 @@ +import { Generated } from 'kysely' + +export const reportQueueTableName = 'report_queue' + +export interface ReportQueue { + id: Generated + name: string + subjectTypes: string[] // ['account'] or ['record'] or ['account', 'record'] + collection: string | null // Collection name (e.g., 'app.bsky.feed.post'), NULL for accounts + reportTypes: string[] // Array of report reason types (fully qualified NSIDs) + description: string | null // Optional description of the queue + createdBy: string // DID of moderator who created this queue + createdAt: string + updatedAt: string + enabled: boolean + deletedAt: string | null // NULL = active, timestamp = soft-deleted +} + +export type PartialDB = { + [reportQueueTableName]: ReportQueue +} diff --git a/packages/ozone/src/db/schema/report_stat.ts b/packages/ozone/src/db/schema/report_stat.ts new file mode 100644 index 00000000000..5ee40eb109d --- /dev/null +++ b/packages/ozone/src/db/schema/report_stat.ts @@ -0,0 +1,27 @@ +import { Generated } from 'kysely' + +export const reportStatTableName = 'report_stat' + +export interface ReportStat { + // metadata + id: Generated + computedAt: string // When this snapshot was last computed + + // group + date: string // ISO date e.g. '2026-04-15' — the calendar day this snapshot covers + queueId: number | null // NULL = aggregate across all queues + reportTypes: string[] | null // NULL = aggregate across all report types + moderatorDid: string | null // NULL = aggregate, non-null = per-moderator + + // stats + inboundCount: number | null // Reports received during this calendar day + pendingCount: number | null // Reports with status != 'closed' at time of computation + actionedCount: number | null // Reports closed during this calendar day + escalatedCount: number | null // Reports escalated during this calendar day + actionRate: number | null // actionedCount / inboundCount * 100 + avgHandlingTimeSec: number | null // Average time from creation/assignment to close, in seconds +} + +export type PartialDB = { + [reportStatTableName]: ReportStat +} diff --git a/packages/ozone/src/lexicon/index.ts b/packages/ozone/src/lexicon/index.ts index 13e59e3f3d0..d51182aa757 100644 --- a/packages/ozone/src/lexicon/index.ts +++ b/packages/ozone/src/lexicon/index.ts @@ -266,6 +266,26 @@ import * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation import * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js' import * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js' import * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js' +import * as ToolsOzoneQueueAssignModerator from './types/tools/ozone/queue/assignModerator.js' +import * as ToolsOzoneQueueCreateQueue from './types/tools/ozone/queue/createQueue.js' +import * as ToolsOzoneQueueDeleteQueue from './types/tools/ozone/queue/deleteQueue.js' +import * as ToolsOzoneQueueGetAssignments from './types/tools/ozone/queue/getAssignments.js' +import * as ToolsOzoneQueueListQueues from './types/tools/ozone/queue/listQueues.js' +import * as ToolsOzoneQueueRouteReports from './types/tools/ozone/queue/routeReports.js' +import * as ToolsOzoneQueueUnassignModerator from './types/tools/ozone/queue/unassignModerator.js' +import * as ToolsOzoneQueueUpdateQueue from './types/tools/ozone/queue/updateQueue.js' +import * as ToolsOzoneReportAssignModerator from './types/tools/ozone/report/assignModerator.js' +import * as ToolsOzoneReportCreateActivity from './types/tools/ozone/report/createActivity.js' +import * as ToolsOzoneReportGetAssignments from './types/tools/ozone/report/getAssignments.js' +import * as ToolsOzoneReportGetHistoricalStats from './types/tools/ozone/report/getHistoricalStats.js' +import * as ToolsOzoneReportGetLatestReport from './types/tools/ozone/report/getLatestReport.js' +import * as ToolsOzoneReportGetLiveStats from './types/tools/ozone/report/getLiveStats.js' +import * as ToolsOzoneReportGetReport from './types/tools/ozone/report/getReport.js' +import * as ToolsOzoneReportListActivities from './types/tools/ozone/report/listActivities.js' +import * as ToolsOzoneReportQueryReports from './types/tools/ozone/report/queryReports.js' +import * as ToolsOzoneReportReassignQueue from './types/tools/ozone/report/reassignQueue.js' +import * as ToolsOzoneReportRefreshStats from './types/tools/ozone/report/refreshStats.js' +import * as ToolsOzoneReportUnassignModerator from './types/tools/ozone/report/unassignModerator.js' import * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js' import * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js' import * as ToolsOzoneSafelinkQueryRules from './types/tools/ozone/safelink/queryRules.js' @@ -3578,6 +3598,8 @@ export class ToolsOzoneNS { communication: ToolsOzoneCommunicationNS hosting: ToolsOzoneHostingNS moderation: ToolsOzoneModerationNS + queue: ToolsOzoneQueueNS + report: ToolsOzoneReportNS safelink: ToolsOzoneSafelinkNS server: ToolsOzoneServerNS set: ToolsOzoneSetNS @@ -3591,6 +3613,8 @@ export class ToolsOzoneNS { this.communication = new ToolsOzoneCommunicationNS(server) this.hosting = new ToolsOzoneHostingNS(server) this.moderation = new ToolsOzoneModerationNS(server) + this.queue = new ToolsOzoneQueueNS(server) + this.report = new ToolsOzoneReportNS(server) this.safelink = new ToolsOzoneSafelinkNS(server) this.server = new ToolsOzoneServerNS(server) this.set = new ToolsOzoneSetNS(server) @@ -3865,6 +3889,262 @@ export class ToolsOzoneModerationNS { } } +export class ToolsOzoneQueueNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + assignModerator( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueAssignModerator.QueryParams, + ToolsOzoneQueueAssignModerator.HandlerInput, + ToolsOzoneQueueAssignModerator.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.assignModerator' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + createQueue( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueCreateQueue.QueryParams, + ToolsOzoneQueueCreateQueue.HandlerInput, + ToolsOzoneQueueCreateQueue.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.createQueue' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + deleteQueue( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueDeleteQueue.QueryParams, + ToolsOzoneQueueDeleteQueue.HandlerInput, + ToolsOzoneQueueDeleteQueue.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.deleteQueue' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getAssignments( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueGetAssignments.QueryParams, + ToolsOzoneQueueGetAssignments.HandlerInput, + ToolsOzoneQueueGetAssignments.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.getAssignments' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + listQueues( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueListQueues.QueryParams, + ToolsOzoneQueueListQueues.HandlerInput, + ToolsOzoneQueueListQueues.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.listQueues' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + routeReports( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueRouteReports.QueryParams, + ToolsOzoneQueueRouteReports.HandlerInput, + ToolsOzoneQueueRouteReports.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.routeReports' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + unassignModerator( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueUnassignModerator.QueryParams, + ToolsOzoneQueueUnassignModerator.HandlerInput, + ToolsOzoneQueueUnassignModerator.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.unassignModerator' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + updateQueue( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneQueueUpdateQueue.QueryParams, + ToolsOzoneQueueUpdateQueue.HandlerInput, + ToolsOzoneQueueUpdateQueue.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.queue.updateQueue' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + +export class ToolsOzoneReportNS { + _server: Server + + constructor(server: Server) { + this._server = server + } + + assignModerator( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportAssignModerator.QueryParams, + ToolsOzoneReportAssignModerator.HandlerInput, + ToolsOzoneReportAssignModerator.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.assignModerator' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + createActivity( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportCreateActivity.QueryParams, + ToolsOzoneReportCreateActivity.HandlerInput, + ToolsOzoneReportCreateActivity.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.createActivity' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getAssignments( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportGetAssignments.QueryParams, + ToolsOzoneReportGetAssignments.HandlerInput, + ToolsOzoneReportGetAssignments.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.getAssignments' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getHistoricalStats( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportGetHistoricalStats.QueryParams, + ToolsOzoneReportGetHistoricalStats.HandlerInput, + ToolsOzoneReportGetHistoricalStats.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.getHistoricalStats' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getLatestReport( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportGetLatestReport.QueryParams, + ToolsOzoneReportGetLatestReport.HandlerInput, + ToolsOzoneReportGetLatestReport.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.getLatestReport' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getLiveStats( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportGetLiveStats.QueryParams, + ToolsOzoneReportGetLiveStats.HandlerInput, + ToolsOzoneReportGetLiveStats.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.getLiveStats' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + getReport( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportGetReport.QueryParams, + ToolsOzoneReportGetReport.HandlerInput, + ToolsOzoneReportGetReport.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.getReport' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + listActivities( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportListActivities.QueryParams, + ToolsOzoneReportListActivities.HandlerInput, + ToolsOzoneReportListActivities.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.listActivities' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + queryReports( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportQueryReports.QueryParams, + ToolsOzoneReportQueryReports.HandlerInput, + ToolsOzoneReportQueryReports.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.queryReports' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + reassignQueue( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportReassignQueue.QueryParams, + ToolsOzoneReportReassignQueue.HandlerInput, + ToolsOzoneReportReassignQueue.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.reassignQueue' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + refreshStats( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportRefreshStats.QueryParams, + ToolsOzoneReportRefreshStats.HandlerInput, + ToolsOzoneReportRefreshStats.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.refreshStats' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + + unassignModerator( + cfg: MethodConfigOrHandler< + A, + ToolsOzoneReportUnassignModerator.QueryParams, + ToolsOzoneReportUnassignModerator.HandlerInput, + ToolsOzoneReportUnassignModerator.HandlerOutput + >, + ) { + const nsid = 'tools.ozone.report.unassignModerator' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } +} + export class ToolsOzoneSafelinkNS { _server: Server diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 94befb59763..359e0b8827f 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -19785,6 +19785,12 @@ export const schemaDict = { description: 'An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject.', }, + reportAction: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.emitEvent#reportAction', + description: + 'Optional report-level targeting. If provided, this event will be linked to specific reports and reporters may be notified.', + }, }, }, }, @@ -19806,6 +19812,36 @@ export const schemaDict = { }, ], }, + reportAction: { + type: 'object', + description: 'Target specific reports when emitting a moderation event', + properties: { + ids: { + type: 'array', + items: { + type: 'integer', + }, + description: 'Target specific report IDs', + }, + types: { + type: 'array', + items: { + type: 'string', + }, + description: + 'Target reports matching these report types on the subject (fully qualified NSIDs)', + }, + all: { + type: 'boolean', + description: 'Target ALL reports on the subject', + }, + note: { + type: 'string', + description: + 'Note to send to reporter(s) when actioning their report', + }, + }, + }, }, }, ToolsOzoneModerationGetAccountTimeline: { @@ -20906,210 +20942,929 @@ export const schemaDict = { }, }, }, - ToolsOzoneReportDefs: { + ToolsOzoneQueueAssignModerator: { lexicon: 1, - id: 'tools.ozone.report.defs', + id: 'tools.ozone.queue.assignModerator', defs: { - reasonType: { - type: 'string', - knownValues: [ - 'tools.ozone.report.defs#reasonAppeal', - 'tools.ozone.report.defs#reasonOther', - 'tools.ozone.report.defs#reasonViolenceAnimal', - 'tools.ozone.report.defs#reasonViolenceThreats', - 'tools.ozone.report.defs#reasonViolenceGraphicContent', - 'tools.ozone.report.defs#reasonViolenceGlorification', - 'tools.ozone.report.defs#reasonViolenceExtremistContent', - 'tools.ozone.report.defs#reasonViolenceTrafficking', - 'tools.ozone.report.defs#reasonViolenceOther', - 'tools.ozone.report.defs#reasonSexualAbuseContent', - 'tools.ozone.report.defs#reasonSexualNCII', - 'tools.ozone.report.defs#reasonSexualDeepfake', - 'tools.ozone.report.defs#reasonSexualAnimal', - 'tools.ozone.report.defs#reasonSexualUnlabeled', - 'tools.ozone.report.defs#reasonSexualOther', - 'tools.ozone.report.defs#reasonChildSafetyCSAM', - 'tools.ozone.report.defs#reasonChildSafetyGroom', - 'tools.ozone.report.defs#reasonChildSafetyPrivacy', - 'tools.ozone.report.defs#reasonChildSafetyHarassment', - 'tools.ozone.report.defs#reasonChildSafetyOther', - 'tools.ozone.report.defs#reasonHarassmentTroll', - 'tools.ozone.report.defs#reasonHarassmentTargeted', - 'tools.ozone.report.defs#reasonHarassmentHateSpeech', - 'tools.ozone.report.defs#reasonHarassmentDoxxing', - 'tools.ozone.report.defs#reasonHarassmentOther', - 'tools.ozone.report.defs#reasonMisleadingBot', - 'tools.ozone.report.defs#reasonMisleadingImpersonation', - 'tools.ozone.report.defs#reasonMisleadingSpam', - 'tools.ozone.report.defs#reasonMisleadingScam', - 'tools.ozone.report.defs#reasonMisleadingElections', - 'tools.ozone.report.defs#reasonMisleadingOther', - 'tools.ozone.report.defs#reasonRuleSiteSecurity', - 'tools.ozone.report.defs#reasonRuleProhibitedSales', - 'tools.ozone.report.defs#reasonRuleBanEvasion', - 'tools.ozone.report.defs#reasonRuleOther', - 'tools.ozone.report.defs#reasonSelfHarmContent', - 'tools.ozone.report.defs#reasonSelfHarmED', - 'tools.ozone.report.defs#reasonSelfHarmStunts', - 'tools.ozone.report.defs#reasonSelfHarmSubstances', - 'tools.ozone.report.defs#reasonSelfHarmOther', + main: { + type: 'procedure', + description: 'Assign a user to a queue.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId', 'did'], + properties: { + queueId: { + type: 'integer', + description: 'The ID of the queue to assign the user to.', + }, + did: { + type: 'string', + description: 'DID to be assigned.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#assignmentView', + }, + }, + errors: [ + { + name: 'InvalidAssignment', + description: + 'The specified queue does not exist or is not enabled.', + }, ], }, - reasonAppeal: { - type: 'token', - description: 'Appeal a previously taken moderation action', - }, - reasonOther: { - type: 'token', - description: 'An issue not included in these options', - }, - reasonViolenceAnimal: { - type: 'token', - description: 'Animal welfare violations', - }, - reasonViolenceThreats: { - type: 'token', - description: 'Threats or incitement', - }, - reasonViolenceGraphicContent: { - type: 'token', - description: 'Graphic violent content', - }, - reasonViolenceGlorification: { - type: 'token', - description: 'Glorification of violence', - }, - reasonViolenceExtremistContent: { - type: 'token', + }, + }, + ToolsOzoneQueueCreateQueue: { + lexicon: 1, + id: 'tools.ozone.queue.createQueue', + defs: { + main: { + type: 'procedure', description: - "Extremist content. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonViolenceTrafficking: { - type: 'token', - description: 'Human trafficking', - }, - reasonViolenceOther: { - type: 'token', - description: 'Other violent content', - }, - reasonSexualAbuseContent: { - type: 'token', - description: 'Adult sexual abuse content', - }, - reasonSexualNCII: { - type: 'token', - description: 'Non-consensual intimate imagery', + 'Create a new moderation queue. Will fail if the queue configuration conflicts with an existing queue.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['name', 'subjectTypes', 'reportTypes'], + properties: { + name: { + type: 'string', + description: 'Display name for the queue (must be unique)', + }, + subjectTypes: { + type: 'array', + minLength: 1, + items: { + type: 'string', + knownValues: ['account', 'record', 'message'], + }, + description: 'Subject types this queue accepts', + }, + collection: { + type: 'string', + format: 'nsid', + description: + "Collection name for record subjects. Required if subjectTypes includes 'record'.", + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + minLength: 1, + maxLength: 25, + description: 'Report reason types (fully qualified NSIDs)', + }, + description: { + type: 'string', + description: 'Optional description of the queue', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queue'], + properties: { + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + }, + }, + }, + errors: [ + { + name: 'ConflictingQueue', + description: + 'The queue configuration conflicts with an existing queue', + }, + ], }, - reasonSexualDeepfake: { - type: 'token', - description: 'Deepfake adult content', + }, + }, + ToolsOzoneQueueDefs: { + lexicon: 1, + id: 'tools.ozone.queue.defs', + defs: { + queueView: { + type: 'object', + required: [ + 'id', + 'name', + 'subjectTypes', + 'reportTypes', + 'createdBy', + 'createdAt', + 'updatedAt', + 'enabled', + 'stats', + ], + properties: { + id: { + type: 'integer', + description: 'Queue ID', + }, + name: { + type: 'string', + description: 'Display name of the queue', + }, + subjectTypes: { + type: 'array', + minLength: 1, + items: { + type: 'string', + knownValues: ['account', 'record', 'message'], + }, + description: 'Subject types this queue accepts.', + }, + collection: { + type: 'string', + format: 'nsid', + description: + "Collection name for record subjects (e.g., 'app.bsky.feed.post')", + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + minLength: 1, + description: + 'Report reason types this queue accepts (fully qualified NSIDs)', + }, + description: { + type: 'string', + description: 'Optional description of the queue', + }, + createdBy: { + type: 'string', + format: 'did', + description: 'DID of moderator who created this queue', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + updatedAt: { + type: 'string', + format: 'datetime', + }, + enabled: { + type: 'boolean', + description: 'Whether this queue is currently active', + }, + deletedAt: { + type: 'string', + format: 'datetime', + description: 'When the queue was deleted, if applicable', + }, + stats: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueStats', + description: 'Statistics about this queue', + }, + }, }, - reasonSexualAnimal: { - type: 'token', - description: 'Animal sexual abuse', - }, - reasonSexualUnlabeled: { - type: 'token', - description: 'Unlabelled adult content', + queueStats: { + type: 'object', + required: [], + properties: { + pendingCount: { + type: 'integer', + description: "Number of reports in 'open' status", + }, + actionedCount: { + type: 'integer', + description: "Number of reports in 'closed' status", + }, + escalatedCount: { + type: 'integer', + description: "Number of reports in 'escalated' status", + }, + inboundCount: { + type: 'integer', + description: 'Reports received in this queue in the last 24 hours.', + }, + actionRate: { + type: 'integer', + description: + 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. Absent when inboundCount is 0.', + }, + avgHandlingTimeSec: { + type: 'integer', + description: + 'Average time in seconds from report creation to close, for reports closed in this period.', + }, + lastUpdated: { + type: 'string', + format: 'datetime', + description: 'When these statistics were last computed', + }, + }, }, - reasonSexualOther: { - type: 'token', - description: 'Other sexual violence content', + assignmentView: { + type: 'object', + required: ['id', 'did', 'queue', 'startAt'], + properties: { + id: { + type: 'integer', + }, + did: { + type: 'string', + format: 'did', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: 'The moderator assigned to this queue', + }, + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + startAt: { + type: 'string', + format: 'datetime', + }, + endAt: { + type: 'string', + format: 'datetime', + }, + }, }, - reasonChildSafetyCSAM: { - type: 'token', + }, + }, + ToolsOzoneQueueDeleteQueue: { + lexicon: 1, + id: 'tools.ozone.queue.deleteQueue', + defs: { + main: { + type: 'procedure', description: - "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority.", + 'Delete a moderation queue. Optionally migrate reports to another queue.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId'], + properties: { + queueId: { + type: 'integer', + description: 'ID of the queue to delete', + }, + migrateToQueueId: { + type: 'integer', + description: + 'Optional: migrate all reports to this queue. If not specified, reports will be set to unassigned (-1).', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['deleted'], + properties: { + deleted: { + type: 'boolean', + }, + reportsMigrated: { + type: 'integer', + description: + 'Number of reports that were migrated (if migration occurred)', + }, + }, + }, + }, }, - reasonChildSafetyGroom: { - type: 'token', + }, + }, + ToolsOzoneQueueGetAssignments: { + lexicon: 1, + id: 'tools.ozone.queue.getAssignments', + defs: { + main: { + type: 'query', description: - "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonChildSafetyPrivacy: { - type: 'token', - description: 'Privacy violation involving a minor', + 'Get moderator assignments, optionally filtered by active status, queue, or moderator.', + parameters: { + type: 'params', + properties: { + onlyActive: { + type: 'boolean', + default: true, + description: 'When true, only returns active assignments.', + }, + queueIds: { + type: 'array', + items: { + type: 'integer', + }, + description: + 'If specified, returns assignments for these queues only.', + }, + dids: { + type: 'array', + items: { + type: 'string', + format: 'did', + }, + description: + 'If specified, returns assignments for these moderators only.', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['assignments'], + properties: { + cursor: { + type: 'string', + }, + assignments: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#assignmentView', + }, + }, + }, + }, + }, }, - reasonChildSafetyHarassment: { - type: 'token', - description: 'Harassment or bullying of minors', + }, + }, + ToolsOzoneQueueListQueues: { + lexicon: 1, + id: 'tools.ozone.queue.listQueues', + defs: { + main: { + type: 'query', + description: 'List all configured moderation queues with statistics.', + parameters: { + type: 'params', + properties: { + enabled: { + type: 'boolean', + description: + 'Filter by enabled status. If not specified, returns all queues.', + }, + subjectType: { + type: 'string', + description: + "Filter queues that handle this subject type ('account' or 'record').", + }, + collection: { + type: 'string', + description: + "Filter queues by collection name (e.g. 'app.bsky.feed.post').", + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + maxLength: 10, + description: + 'Filter queues that handle any of these report reason types.', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queues'], + properties: { + cursor: { + type: 'string', + }, + queues: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + }, + }, + }, + }, }, - reasonChildSafetyOther: { - type: 'token', + }, + }, + ToolsOzoneQueueRouteReports: { + lexicon: 1, + id: 'tools.ozone.queue.routeReports', + defs: { + main: { + type: 'procedure', description: - "Other child safety. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonHarassmentTroll: { - type: 'token', - description: 'Trolling', - }, - reasonHarassmentTargeted: { - type: 'token', - description: 'Targeted harassment', - }, - reasonHarassmentHateSpeech: { - type: 'token', - description: 'Hate speech', + 'Route reports within an ID range to matching queues based.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['startReportId', 'endReportId'], + properties: { + startReportId: { + type: 'integer', + description: 'Start of report ID range (inclusive).', + }, + endReportId: { + type: 'integer', + description: + 'End of report ID range (inclusive). Difference between start and end must be less than 5,000.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['assigned', 'unmatched'], + properties: { + assigned: { + type: 'integer', + description: 'The number of reports assigned to a queue.', + }, + unmatched: { + type: 'integer', + description: 'The number of reports with no matching queue.', + }, + }, + }, + }, + errors: [ + { + name: 'OutOfRange', + description: + 'The request is invalid, such as missing required fields or invalid field values.', + }, + ], }, - reasonHarassmentDoxxing: { - type: 'token', - description: 'Doxxing', + }, + }, + ToolsOzoneQueueUnassignModerator: { + lexicon: 1, + id: 'tools.ozone.queue.unassignModerator', + defs: { + main: { + type: 'procedure', + description: "Remove a user's assignment from a queue.", + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId', 'did'], + properties: { + queueId: { + type: 'integer', + description: 'The ID of the queue to unassign the user from.', + }, + did: { + type: 'string', + format: 'did', + description: 'DID to be unassigned.', + }, + }, + }, + }, + errors: [ + { + name: 'InvalidAssignment', + description: + 'No active assignment exists for the given queue and user.', + }, + ], }, - reasonHarassmentOther: { - type: 'token', - description: 'Other harassing or hateful content', + }, + }, + ToolsOzoneQueueUpdateQueue: { + lexicon: 1, + id: 'tools.ozone.queue.updateQueue', + defs: { + main: { + type: 'procedure', + description: + 'Update queue properties. Currently only supports updating the name and enabled status to prevent configuration conflicts.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queueId'], + properties: { + queueId: { + type: 'integer', + description: 'ID of the queue to update', + }, + name: { + type: 'string', + description: 'New display name for the queue', + }, + enabled: { + type: 'boolean', + description: 'Enable or disable the queue', + }, + description: { + type: 'string', + description: 'Optional description of the queue', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['queue'], + properties: { + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + }, + }, + }, }, - reasonMisleadingBot: { - type: 'token', - description: 'Fake account or bot', + }, + }, + ToolsOzoneReportAssignModerator: { + lexicon: 1, + id: 'tools.ozone.report.assignModerator', + defs: { + main: { + type: 'procedure', + description: + 'Assign a report to a user. Defaults to the caller. Admins may assign to any moderator.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId'], + properties: { + reportId: { + type: 'integer', + description: 'The ID of the report to assign.', + }, + queueId: { + type: 'integer', + description: + 'Optional queue ID to associate the assignment with. If not provided and the report has been assigned on a queue before, it will stay on that queue.', + }, + did: { + type: 'string', + format: 'did', + description: + "DID to be assigned. Defaults to the caller's DID. Admins may assign to any moderator.", + }, + isPermanent: { + type: 'boolean', + description: + 'When true, the assignment has no expiry (endAt is null). Throws AlreadyAssigned if another user already has a permanent assignment on this report.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#assignmentView', + }, + }, + errors: [ + { + name: 'AlreadyAssigned', + description: 'The report is already assigned to another user.', + }, + { + name: 'InvalidAssignment', + description: 'The report ID or queue ID is invalid.', + }, + ], }, - reasonMisleadingImpersonation: { - type: 'token', - description: 'Impersonation', + }, + }, + ToolsOzoneReportCreateActivity: { + lexicon: 1, + id: 'tools.ozone.report.createActivity', + defs: { + main: { + type: 'procedure', + description: + 'Register an activity on a report. For state-change activity types, validates the transition and updates report.status atomically.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId', 'activity'], + properties: { + reportId: { + type: 'integer', + description: 'ID of the report to record activity on', + }, + activity: { + type: 'union', + refs: [ + 'lex:tools.ozone.report.defs#queueActivity', + 'lex:tools.ozone.report.defs#assignmentActivity', + 'lex:tools.ozone.report.defs#escalationActivity', + 'lex:tools.ozone.report.defs#closeActivity', + 'lex:tools.ozone.report.defs#reopenActivity', + 'lex:tools.ozone.report.defs#noteActivity', + ], + description: 'The type of activity to record.', + }, + internalNote: { + type: 'string', + description: + 'Optional moderator-only note. Not visible to reporters.', + }, + publicNote: { + type: 'string', + description: + 'Optional public-facing note, potentially visible to the reporter.', + }, + isAutomated: { + type: 'boolean', + description: + 'Set true when this activity is triggered by an automated process. Defaults to false.', + default: false, + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['activity'], + properties: { + activity: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportActivityView', + }, + }, + }, + }, + errors: [ + { + name: 'ReportNotFound', + description: 'No report exists with the given reportId', + }, + { + name: 'InvalidStateTransition', + description: + "The requested state transition is not permitted from the report's current status", + }, + { + name: 'AlreadyInTargetState', + description: + 'The report is already in the status implied by this activity type', + }, + ], }, - reasonMisleadingSpam: { - type: 'token', - description: 'Spam', + }, + }, + ToolsOzoneReportDefs: { + lexicon: 1, + id: 'tools.ozone.report.defs', + defs: { + reasonType: { + type: 'string', + knownValues: [ + 'tools.ozone.report.defs#reasonAppeal', + 'tools.ozone.report.defs#reasonOther', + 'tools.ozone.report.defs#reasonViolenceAnimal', + 'tools.ozone.report.defs#reasonViolenceThreats', + 'tools.ozone.report.defs#reasonViolenceGraphicContent', + 'tools.ozone.report.defs#reasonViolenceGlorification', + 'tools.ozone.report.defs#reasonViolenceExtremistContent', + 'tools.ozone.report.defs#reasonViolenceTrafficking', + 'tools.ozone.report.defs#reasonViolenceOther', + 'tools.ozone.report.defs#reasonSexualAbuseContent', + 'tools.ozone.report.defs#reasonSexualNCII', + 'tools.ozone.report.defs#reasonSexualDeepfake', + 'tools.ozone.report.defs#reasonSexualAnimal', + 'tools.ozone.report.defs#reasonSexualUnlabeled', + 'tools.ozone.report.defs#reasonSexualOther', + 'tools.ozone.report.defs#reasonChildSafetyCSAM', + 'tools.ozone.report.defs#reasonChildSafetyGroom', + 'tools.ozone.report.defs#reasonChildSafetyPrivacy', + 'tools.ozone.report.defs#reasonChildSafetyHarassment', + 'tools.ozone.report.defs#reasonChildSafetyOther', + 'tools.ozone.report.defs#reasonHarassmentTroll', + 'tools.ozone.report.defs#reasonHarassmentTargeted', + 'tools.ozone.report.defs#reasonHarassmentHateSpeech', + 'tools.ozone.report.defs#reasonHarassmentDoxxing', + 'tools.ozone.report.defs#reasonHarassmentOther', + 'tools.ozone.report.defs#reasonMisleadingBot', + 'tools.ozone.report.defs#reasonMisleadingImpersonation', + 'tools.ozone.report.defs#reasonMisleadingSpam', + 'tools.ozone.report.defs#reasonMisleadingScam', + 'tools.ozone.report.defs#reasonMisleadingElections', + 'tools.ozone.report.defs#reasonMisleadingOther', + 'tools.ozone.report.defs#reasonRuleSiteSecurity', + 'tools.ozone.report.defs#reasonRuleProhibitedSales', + 'tools.ozone.report.defs#reasonRuleBanEvasion', + 'tools.ozone.report.defs#reasonRuleOther', + 'tools.ozone.report.defs#reasonSelfHarmContent', + 'tools.ozone.report.defs#reasonSelfHarmED', + 'tools.ozone.report.defs#reasonSelfHarmStunts', + 'tools.ozone.report.defs#reasonSelfHarmSubstances', + 'tools.ozone.report.defs#reasonSelfHarmOther', + ], }, - reasonMisleadingScam: { + reasonAppeal: { type: 'token', - description: 'Scam', + description: 'Appeal a previously taken moderation action', }, - reasonMisleadingElections: { + reasonOther: { type: 'token', - description: 'False information about elections', + description: 'An issue not included in these options', }, - reasonMisleadingOther: { + reasonViolenceAnimal: { type: 'token', - description: 'Other misleading content', + description: 'Animal welfare violations', }, - reasonRuleSiteSecurity: { + reasonViolenceThreats: { type: 'token', - description: 'Hacking or system attacks', + description: 'Threats or incitement', }, - reasonRuleProhibitedSales: { + reasonViolenceGraphicContent: { type: 'token', - description: 'Promoting or selling prohibited items or services', + description: 'Graphic violent content', }, - reasonRuleBanEvasion: { + reasonViolenceGlorification: { type: 'token', - description: 'Banned user returning', + description: 'Glorification of violence', }, - reasonRuleOther: { + reasonViolenceExtremistContent: { type: 'token', - description: 'Other', + description: + "Extremist content. These reports will be sent only be sent to the application's Moderation Authority.", }, - reasonSelfHarmContent: { + reasonViolenceTrafficking: { type: 'token', - description: 'Content promoting or depicting self-harm', + description: 'Human trafficking', }, - reasonSelfHarmED: { + reasonViolenceOther: { type: 'token', - description: 'Eating disorders', + description: 'Other violent content', }, - reasonSelfHarmStunts: { + reasonSexualAbuseContent: { type: 'token', - description: 'Dangerous challenges or activities', + description: 'Adult sexual abuse content', + }, + reasonSexualNCII: { + type: 'token', + description: 'Non-consensual intimate imagery', + }, + reasonSexualDeepfake: { + type: 'token', + description: 'Deepfake adult content', + }, + reasonSexualAnimal: { + type: 'token', + description: 'Animal sexual abuse', + }, + reasonSexualUnlabeled: { + type: 'token', + description: 'Unlabelled adult content', + }, + reasonSexualOther: { + type: 'token', + description: 'Other sexual violence content', + }, + reasonChildSafetyCSAM: { + type: 'token', + description: + "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority.", + }, + reasonChildSafetyGroom: { + type: 'token', + description: + "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority.", + }, + reasonChildSafetyPrivacy: { + type: 'token', + description: 'Privacy violation involving a minor', + }, + reasonChildSafetyHarassment: { + type: 'token', + description: 'Harassment or bullying of minors', + }, + reasonChildSafetyOther: { + type: 'token', + description: + "Other child safety. These reports will be sent only be sent to the application's Moderation Authority.", + }, + reasonHarassmentTroll: { + type: 'token', + description: 'Trolling', + }, + reasonHarassmentTargeted: { + type: 'token', + description: 'Targeted harassment', + }, + reasonHarassmentHateSpeech: { + type: 'token', + description: 'Hate speech', + }, + reasonHarassmentDoxxing: { + type: 'token', + description: 'Doxxing', + }, + reasonHarassmentOther: { + type: 'token', + description: 'Other harassing or hateful content', + }, + reasonMisleadingBot: { + type: 'token', + description: 'Fake account or bot', + }, + reasonMisleadingImpersonation: { + type: 'token', + description: 'Impersonation', + }, + reasonMisleadingSpam: { + type: 'token', + description: 'Spam', + }, + reasonMisleadingScam: { + type: 'token', + description: 'Scam', + }, + reasonMisleadingElections: { + type: 'token', + description: 'False information about elections', + }, + reasonMisleadingOther: { + type: 'token', + description: 'Other misleading content', + }, + reasonRuleSiteSecurity: { + type: 'token', + description: 'Hacking or system attacks', + }, + reasonRuleProhibitedSales: { + type: 'token', + description: 'Promoting or selling prohibited items or services', + }, + reasonRuleBanEvasion: { + type: 'token', + description: 'Banned user returning', + }, + reasonRuleOther: { + type: 'token', + description: 'Other', + }, + reasonSelfHarmContent: { + type: 'token', + description: 'Content promoting or depicting self-harm', + }, + reasonSelfHarmED: { + type: 'token', + description: 'Eating disorders', + }, + reasonSelfHarmStunts: { + type: 'token', + description: 'Dangerous challenges or activities', }, reasonSelfHarmSubstances: { type: 'token', @@ -21119,6 +21874,974 @@ export const schemaDict = { type: 'token', description: 'Other dangerous content', }, + reportAssignment: { + type: 'object', + description: + 'Information about the moderator currently assigned to a report.', + required: ['did', 'assignedAt'], + properties: { + did: { + type: 'string', + format: 'did', + description: 'DID of the assigned moderator', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: 'Full member record of the assigned moderator', + }, + assignedAt: { + type: 'string', + format: 'datetime', + description: 'When the report was assigned', + }, + }, + }, + reportView: { + type: 'object', + required: [ + 'id', + 'eventId', + 'status', + 'subject', + 'reportType', + 'reportedBy', + 'reporter', + 'createdAt', + ], + properties: { + id: { + type: 'integer', + description: 'Report ID', + }, + eventId: { + type: 'integer', + description: 'ID of the moderation event that created this report', + }, + status: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: 'Current status of the report', + }, + subject: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#subjectView', + description: 'The subject that was reported with full details', + }, + reportType: { + type: 'ref', + ref: 'lex:com.atproto.moderation.defs#reasonType', + description: 'Type of report', + }, + reportedBy: { + type: 'string', + format: 'did', + description: 'DID of the user who made the report', + }, + reporter: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#subjectView', + description: 'Full subject view of the reporter account', + }, + comment: { + type: 'string', + description: 'Comment provided by the reporter', + }, + createdAt: { + type: 'string', + format: 'datetime', + description: 'When the report was created', + }, + updatedAt: { + type: 'string', + format: 'datetime', + description: 'When the report was last updated', + }, + queuedAt: { + type: 'string', + format: 'datetime', + description: 'When the report was assigned to its current queue', + }, + actionEventIds: { + type: 'array', + items: { + type: 'integer', + }, + description: + 'Array of moderation event IDs representing actions taken on this report (sorted DESC, most recent first)', + }, + actions: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#modEventView', + }, + description: 'Optional: expanded action events', + }, + actionNote: { + type: 'string', + description: 'Note sent to reporter when report was actioned', + }, + subjectStatus: { + type: 'ref', + ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', + description: 'Current status of the reported subject', + }, + relatedReportCount: { + type: 'integer', + description: 'Number of other pending reports on the same subject', + }, + assignment: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportAssignment', + description: + 'Information about moderator currently assigned to this report (if any)', + }, + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + description: 'The queue this report is assigned to (if any)', + }, + isMuted: { + type: 'boolean', + description: + 'Whether this report is muted. A report is muted if the reporter was muted or the subject was muted at the time the report was created.', + }, + }, + }, + queueActivity: { + type: 'object', + description: 'Activity recording a report being routed to a queue.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + assignmentActivity: { + type: 'object', + description: + 'Activity recording a moderator being assigned to a report.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + escalationActivity: { + type: 'object', + description: 'Activity recording a report being escalated.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + closeActivity: { + type: 'object', + description: 'Activity recording a report being closed.', + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + reopenActivity: { + type: 'object', + description: + "Activity recording a closed report being reopened. Only valid when the report is in 'closed' status.", + properties: { + previousStatus: { + type: 'string', + knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], + description: + "The report's status before this activity. Populated automatically from the report row; not required in input.", + }, + }, + }, + noteActivity: { + type: 'object', + description: + 'Activity recording a note on a report. Use internalNote for moderator-only notes or publicNote for reporter-visible notes (or both).', + properties: {}, + }, + reportActivityView: { + type: 'object', + description: 'A single activity entry on a report.', + required: [ + 'id', + 'reportId', + 'activity', + 'isAutomated', + 'createdBy', + 'createdAt', + ], + properties: { + id: { + type: 'integer', + description: 'Activity ID', + }, + reportId: { + type: 'integer', + description: 'ID of the report this activity belongs to', + }, + activity: { + type: 'union', + refs: [ + 'lex:tools.ozone.report.defs#queueActivity', + 'lex:tools.ozone.report.defs#assignmentActivity', + 'lex:tools.ozone.report.defs#escalationActivity', + 'lex:tools.ozone.report.defs#closeActivity', + 'lex:tools.ozone.report.defs#reopenActivity', + 'lex:tools.ozone.report.defs#noteActivity', + ], + description: 'The typed activity object describing what occurred.', + }, + internalNote: { + type: 'string', + description: + 'Optional moderator-only note. Not visible to reporters.', + }, + publicNote: { + type: 'string', + description: + 'Optional public note, potentially visible to the reporter.', + }, + meta: { + type: 'unknown', + description: + 'Extensible JSON payload for loose activity-specific metadata (e.g. assignmentId).', + }, + isAutomated: { + type: 'boolean', + description: + 'True if this activity was created by an automated process (e.g. queue router) rather than a direct human action.', + }, + createdBy: { + type: 'string', + format: 'did', + description: + 'DID of the actor who created this activity, or the service DID for automated activities.', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: + 'Full member record of the moderator who created this activity', + }, + createdAt: { + type: 'string', + format: 'datetime', + description: 'When this activity was created', + }, + }, + }, + liveStats: { + description: + 'Live statistics for reports for the current calendar day, filterable by queue, moderator, or report type.', + type: 'object', + properties: { + pendingCount: { + type: 'integer', + description: 'Number of reports currently not closed.', + }, + actionedCount: { + type: 'integer', + description: 'Number of reports closed today.', + }, + escalatedCount: { + type: 'integer', + description: 'Number of reports escalated today.', + }, + inboundCount: { + type: 'integer', + description: 'Reports received today.', + }, + actionRate: { + type: 'integer', + description: + 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer.', + }, + avgHandlingTimeSec: { + type: 'integer', + description: + 'Average time in seconds from report creation (or moderator assignment) to close.', + }, + lastUpdated: { + type: 'string', + format: 'datetime', + description: 'When these statistics were last computed.', + }, + }, + }, + historicalStats: { + description: + 'A single daily snapshot of report statistics for a calendar date.', + type: 'object', + required: ['date'], + properties: { + date: { + type: 'string', + description: 'The calendar date this snapshot covers (YYYY-MM-DD).', + }, + computedAt: { + type: 'string', + format: 'datetime', + description: 'When this snapshot was last computed.', + }, + pendingCount: { + type: 'integer', + description: 'Number of reports not closed at time of computation.', + }, + actionedCount: { + type: 'integer', + description: 'Number of reports closed during this day.', + }, + escalatedCount: { + type: 'integer', + description: 'Number of reports escalated during this day.', + }, + inboundCount: { + type: 'integer', + description: 'Reports received during this day.', + }, + actionRate: { + type: 'integer', + description: + 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer.', + }, + avgHandlingTimeSec: { + type: 'integer', + description: + 'Average time in seconds from report creation (or moderator assignment) to close.', + }, + }, + }, + assignmentView: { + type: 'object', + required: ['id', 'did', 'reportId', 'startAt'], + properties: { + id: { + type: 'integer', + }, + did: { + type: 'string', + format: 'did', + }, + moderator: { + type: 'ref', + ref: 'lex:tools.ozone.team.defs#member', + description: 'The moderator assigned to this report', + }, + queue: { + type: 'ref', + ref: 'lex:tools.ozone.queue.defs#queueView', + }, + reportId: { + type: 'integer', + }, + startAt: { + type: 'string', + format: 'datetime', + }, + endAt: { + type: 'string', + format: 'datetime', + }, + }, + }, + }, + }, + ToolsOzoneReportGetAssignments: { + lexicon: 1, + id: 'tools.ozone.report.getAssignments', + defs: { + main: { + type: 'query', + description: 'Get assignments for reports.', + parameters: { + type: 'params', + properties: { + onlyActive: { + type: 'boolean', + default: true, + description: 'When true, only returns active assignments.', + }, + reportIds: { + type: 'array', + items: { + type: 'integer', + }, + maxLength: 50, + description: + 'If specified, returns assignments for these reports only.', + }, + dids: { + type: 'array', + items: { + type: 'string', + format: 'did', + }, + maxLength: 50, + description: + 'If specified, returns assignments for these moderators only.', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['assignments'], + properties: { + cursor: { + type: 'string', + }, + assignments: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#assignmentView', + }, + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportGetHistoricalStats: { + lexicon: 1, + id: 'tools.ozone.report.getHistoricalStats', + defs: { + main: { + type: 'query', + description: + 'Get historical daily report statistics. Returns a paginated list of daily stat snapshots, newest first. Filter by queue, moderator, or report type.', + parameters: { + type: 'params', + properties: { + queueId: { + type: 'integer', + description: + 'Filter stats by queue. Use -1 for unqueued reports.', + }, + moderatorDid: { + type: 'string', + format: 'did', + description: 'Filter stats by moderator DID.', + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + description: 'Filter stats by report types.', + }, + startDate: { + type: 'string', + format: 'datetime', + description: 'Earliest date to include (inclusive).', + }, + endDate: { + type: 'string', + format: 'datetime', + description: 'Latest date to include (inclusive).', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 30, + description: 'Maximum number of entries to return.', + }, + cursor: { + type: 'string', + description: 'Pagination cursor.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['stats'], + properties: { + stats: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#historicalStats', + }, + }, + cursor: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportGetLatestReport: { + lexicon: 1, + id: 'tools.ozone.report.getLatestReport', + defs: { + main: { + type: 'query', + description: 'Get the most recent report.', + parameters: { + type: 'params', + properties: {}, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['report'], + properties: { + report: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + }, + }, + errors: [ + { + name: 'NotFound', + description: 'No report found.', + }, + ], + }, + }, + }, + ToolsOzoneReportGetLiveStats: { + lexicon: 1, + id: 'tools.ozone.report.getLiveStats', + defs: { + main: { + type: 'query', + description: + 'Get live report statistics from the past 24 hours. Filter by queue, moderator, or report type. Omit all parameters for aggregate stats.', + parameters: { + type: 'params', + properties: { + queueId: { + type: 'integer', + description: + 'Filter stats by queue. Use -1 for unqueued reports.', + }, + moderatorDid: { + type: 'string', + format: 'did', + description: 'Filter stats by moderator DID.', + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + description: 'Filter stats by report types.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['stats'], + properties: { + stats: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#liveStats', + description: 'Statistics for the requested filter.', + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportGetReport: { + lexicon: 1, + id: 'tools.ozone.report.getReport', + defs: { + main: { + type: 'query', + description: 'Get details about a single moderation report by ID.', + parameters: { + type: 'params', + required: ['id'], + properties: { + id: { + type: 'integer', + description: 'The ID of the report to retrieve.', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + errors: [ + { + name: 'NotFound', + description: 'No report found.', + }, + ], + }, + }, + }, + ToolsOzoneReportListActivities: { + lexicon: 1, + id: 'tools.ozone.report.listActivities', + defs: { + main: { + type: 'query', + description: + 'List all activities for a report, sorted most-recent-first.', + parameters: { + type: 'params', + required: ['reportId'], + properties: { + reportId: { + type: 'integer', + description: 'ID of the report whose activities to list', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['activities'], + properties: { + activities: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportActivityView', + }, + }, + cursor: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportQueryReports: { + lexicon: 1, + id: 'tools.ozone.report.queryReports', + defs: { + main: { + type: 'query', + description: + 'View moderation reports. Reports are individual instances of content being reported, as opposed to subject statuses which aggregate reports at the subject level.', + parameters: { + type: 'params', + required: ['status'], + properties: { + queueId: { + type: 'integer', + description: 'Filter by queue ID. Use -1 for unassigned reports.', + }, + reportTypes: { + type: 'array', + items: { + type: 'string', + }, + description: + 'Filter by report types (fully qualified string in the format of com.atproto.moderation.defs#reason).', + }, + status: { + type: 'string', + knownValues: [ + 'open', + 'closed', + 'escalated', + 'queued', + 'assigned', + ], + description: 'Filter by report status.', + }, + subject: { + type: 'string', + format: 'uri', + description: 'Filter by subject DID or AT-URI.', + }, + did: { + type: 'string', + format: 'did', + description: + 'Filter to reports where the subject is this DID or any record owned by this DID. Unlike `subject` (which scopes to a specific account or record), this returns all reports tied to the DID across both account-level and record-level subjects.', + }, + subjectType: { + type: 'string', + description: + 'If specified, reports of the given type (account or record) will be returned.', + knownValues: ['account', 'record'], + }, + collections: { + type: 'array', + maxLength: 20, + description: + "If specified, reports where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", + items: { + type: 'string', + format: 'nsid', + }, + }, + reportedAfter: { + type: 'string', + format: 'datetime', + description: 'Retrieve reports created after a given timestamp', + }, + reportedBefore: { + type: 'string', + format: 'datetime', + description: 'Retrieve reports created before a given timestamp', + }, + isMuted: { + type: 'boolean', + default: false, + description: + 'Filter by muted status. true returns only muted reports, false returns only unmuted reports. Defaults to false.', + }, + assignedTo: { + type: 'string', + format: 'did', + description: + 'Filter by the DID of the moderator permanently assigned to the report.', + }, + sortField: { + type: 'string', + default: 'createdAt', + enum: ['createdAt', 'updatedAt'], + }, + sortDirection: { + type: 'string', + default: 'desc', + enum: ['asc', 'desc'], + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reports'], + properties: { + cursor: { + type: 'string', + }, + reports: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + }, + }, + }, + }, + }, + }, + ToolsOzoneReportReassignQueue: { + lexicon: 1, + id: 'tools.ozone.report.reassignQueue', + defs: { + main: { + type: 'procedure', + description: + 'Manually reassign a report to a different queue (or unassign it). Records a queueActivity entry on the report.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId', 'queueId'], + properties: { + reportId: { + type: 'integer', + description: 'ID of the report to reassign', + }, + queueId: { + type: 'integer', + description: + 'Target queue ID. Use -1 to unassign from any queue.', + }, + comment: { + type: 'string', + description: + 'Optional moderator-only note recorded on the resulting queueActivity as internalNote.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['report'], + properties: { + report: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#reportView', + }, + }, + }, + }, + errors: [ + { + name: 'ReportNotFound', + description: 'No report exists with the given reportId', + }, + { + name: 'ReportClosed', + description: 'The report is closed and cannot be reassigned', + }, + { + name: 'AlreadyInTargetQueue', + description: 'The report is already assigned to the target queue', + }, + { + name: 'QueueNotFound', + description: 'No active queue exists with the given queueId', + }, + { + name: 'QueueDisabled', + description: + 'The target queue is disabled and cannot receive new assignments', + }, + ], + }, + }, + }, + ToolsOzoneReportRefreshStats: { + lexicon: 1, + id: 'tools.ozone.report.refreshStats', + defs: { + main: { + type: 'procedure', + description: + 'Recompute report statistics for a date range. Useful for backfilling after failures or data corrections.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['startDate', 'endDate'], + properties: { + startDate: { + type: 'string', + description: + 'Start date for recomputation, inclusive (YYYY-MM-DD).', + }, + endDate: { + type: 'string', + description: + 'End date for recomputation, inclusive (YYYY-MM-DD).', + }, + queueIds: { + type: 'array', + items: { + type: 'integer', + }, + description: + 'Optional list of queue IDs to recompute. Omit to recompute all groups.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + properties: {}, + }, + }, + }, + }, + }, + ToolsOzoneReportUnassignModerator: { + lexicon: 1, + id: 'tools.ozone.report.unassignModerator', + defs: { + main: { + type: 'procedure', + description: 'Remove report assignment.', + input: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['reportId'], + properties: { + reportId: { + type: 'integer', + description: 'The ID of the report to unassign.', + }, + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'ref', + ref: 'lex:tools.ozone.report.defs#assignmentView', + }, + }, + errors: [ + { + name: 'InvalidAssignment', + description: 'The report ID is invalid.', + }, + ], + }, }, }, ToolsOzoneSafelinkAddRule: { @@ -23304,7 +25027,28 @@ export const ids = { ToolsOzoneModerationQueryStatuses: 'tools.ozone.moderation.queryStatuses', ToolsOzoneModerationScheduleAction: 'tools.ozone.moderation.scheduleAction', ToolsOzoneModerationSearchRepos: 'tools.ozone.moderation.searchRepos', + ToolsOzoneQueueAssignModerator: 'tools.ozone.queue.assignModerator', + ToolsOzoneQueueCreateQueue: 'tools.ozone.queue.createQueue', + ToolsOzoneQueueDefs: 'tools.ozone.queue.defs', + ToolsOzoneQueueDeleteQueue: 'tools.ozone.queue.deleteQueue', + ToolsOzoneQueueGetAssignments: 'tools.ozone.queue.getAssignments', + ToolsOzoneQueueListQueues: 'tools.ozone.queue.listQueues', + ToolsOzoneQueueRouteReports: 'tools.ozone.queue.routeReports', + ToolsOzoneQueueUnassignModerator: 'tools.ozone.queue.unassignModerator', + ToolsOzoneQueueUpdateQueue: 'tools.ozone.queue.updateQueue', + ToolsOzoneReportAssignModerator: 'tools.ozone.report.assignModerator', + ToolsOzoneReportCreateActivity: 'tools.ozone.report.createActivity', ToolsOzoneReportDefs: 'tools.ozone.report.defs', + ToolsOzoneReportGetAssignments: 'tools.ozone.report.getAssignments', + ToolsOzoneReportGetHistoricalStats: 'tools.ozone.report.getHistoricalStats', + ToolsOzoneReportGetLatestReport: 'tools.ozone.report.getLatestReport', + ToolsOzoneReportGetLiveStats: 'tools.ozone.report.getLiveStats', + ToolsOzoneReportGetReport: 'tools.ozone.report.getReport', + ToolsOzoneReportListActivities: 'tools.ozone.report.listActivities', + ToolsOzoneReportQueryReports: 'tools.ozone.report.queryReports', + ToolsOzoneReportReassignQueue: 'tools.ozone.report.reassignQueue', + ToolsOzoneReportRefreshStats: 'tools.ozone.report.refreshStats', + ToolsOzoneReportUnassignModerator: 'tools.ozone.report.unassignModerator', ToolsOzoneSafelinkAddRule: 'tools.ozone.safelink.addRule', ToolsOzoneSafelinkDefs: 'tools.ozone.safelink.defs', ToolsOzoneSafelinkQueryEvents: 'tools.ozone.safelink.queryEvents', diff --git a/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts b/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts index 297a4263e71..1b1aa7152c1 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts @@ -56,6 +56,7 @@ export interface InputSchema { modTool?: ToolsOzoneModerationDefs.ModTool /** An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject. */ externalId?: string + reportAction?: ReportAction } export type OutputSchema = ToolsOzoneModerationDefs.ModEventView @@ -78,3 +79,26 @@ export interface HandlerError { } export type HandlerOutput = HandlerError | HandlerSuccess + +/** Target specific reports when emitting a moderation event */ +export interface ReportAction { + $type?: 'tools.ozone.moderation.emitEvent#reportAction' + /** Target specific report IDs */ + ids?: number[] + /** Target reports matching these report types on the subject (fully qualified NSIDs) */ + types?: string[] + /** Target ALL reports on the subject */ + all?: boolean + /** Note to send to reporter(s) when actioning their report */ + note?: string +} + +const hashReportAction = 'reportAction' + +export function isReportAction(v: V) { + return is$typed(v, id, hashReportAction) +} + +export function validateReportAction(v: V) { + return validate(v, id, hashReportAction) +} diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/assignModerator.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/assignModerator.ts new file mode 100644 index 00000000000..3beaf45f9ed --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/assignModerator.ts @@ -0,0 +1,46 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.assignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the queue to assign the user to. */ + queueId: number + /** DID to be assigned. */ + did: string +} + +export type OutputSchema = ToolsOzoneQueueDefs.AssignmentView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'InvalidAssignment' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/createQueue.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/createQueue.ts new file mode 100644 index 00000000000..f8ade0be498 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/createQueue.ts @@ -0,0 +1,54 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.createQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** Display name for the queue (must be unique) */ + name: string + /** Subject types this queue accepts */ + subjectTypes: ('account' | 'record' | 'message' | (string & {}))[] + /** Collection name for record subjects. Required if subjectTypes includes 'record'. */ + collection?: string + /** Report reason types (fully qualified NSIDs) */ + reportTypes: string[] + /** Optional description of the queue */ + description?: string +} + +export interface OutputSchema { + queue: ToolsOzoneQueueDefs.QueueView +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'ConflictingQueue' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/defs.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/defs.ts new file mode 100644 index 00000000000..14665397752 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/defs.ts @@ -0,0 +1,99 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneTeamDefs from '../team/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.defs' + +export interface QueueView { + $type?: 'tools.ozone.queue.defs#queueView' + /** Queue ID */ + id: number + /** Display name of the queue */ + name: string + /** Subject types this queue accepts. */ + subjectTypes: ('account' | 'record' | 'message' | (string & {}))[] + /** Collection name for record subjects (e.g., 'app.bsky.feed.post') */ + collection?: string + /** Report reason types this queue accepts (fully qualified NSIDs) */ + reportTypes: string[] + /** Optional description of the queue */ + description?: string + /** DID of moderator who created this queue */ + createdBy: string + createdAt: string + updatedAt: string + /** Whether this queue is currently active */ + enabled: boolean + /** When the queue was deleted, if applicable */ + deletedAt?: string + stats: QueueStats +} + +const hashQueueView = 'queueView' + +export function isQueueView(v: V) { + return is$typed(v, id, hashQueueView) +} + +export function validateQueueView(v: V) { + return validate(v, id, hashQueueView) +} + +export interface QueueStats { + $type?: 'tools.ozone.queue.defs#queueStats' + /** Number of reports in 'open' status */ + pendingCount?: number + /** Number of reports in 'closed' status */ + actionedCount?: number + /** Number of reports in 'escalated' status */ + escalatedCount?: number + /** Reports received in this queue in the last 24 hours. */ + inboundCount?: number + /** Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. Absent when inboundCount is 0. */ + actionRate?: number + /** Average time in seconds from report creation to close, for reports closed in this period. */ + avgHandlingTimeSec?: number + /** When these statistics were last computed */ + lastUpdated?: string +} + +const hashQueueStats = 'queueStats' + +export function isQueueStats(v: V) { + return is$typed(v, id, hashQueueStats) +} + +export function validateQueueStats(v: V) { + return validate(v, id, hashQueueStats) +} + +export interface AssignmentView { + $type?: 'tools.ozone.queue.defs#assignmentView' + id: number + did: string + moderator?: ToolsOzoneTeamDefs.Member + queue: QueueView + startAt: string + endAt?: string +} + +const hashAssignmentView = 'assignmentView' + +export function isAssignmentView(v: V) { + return is$typed(v, id, hashAssignmentView) +} + +export function validateAssignmentView(v: V) { + return validate(v, id, hashAssignmentView) +} diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/deleteQueue.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/deleteQueue.ts new file mode 100644 index 00000000000..b8fa9916e65 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/deleteQueue.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.deleteQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the queue to delete */ + queueId: number + /** Optional: migrate all reports to this queue. If not specified, reports will be set to unassigned (-1). */ + migrateToQueueId?: number +} + +export interface OutputSchema { + deleted: boolean + /** Number of reports that were migrated (if migration occurred) */ + reportsMigrated?: number +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/getAssignments.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/getAssignments.ts new file mode 100644 index 00000000000..9562e5f531a --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/getAssignments.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.getAssignments' + +export type QueryParams = { + /** When true, only returns active assignments. */ + onlyActive: boolean + /** If specified, returns assignments for these queues only. */ + queueIds?: number[] + /** If specified, returns assignments for these moderators only. */ + dids?: string[] + limit: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + assignments: ToolsOzoneQueueDefs.AssignmentView[] +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/listQueues.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/listQueues.ts new file mode 100644 index 00000000000..ddbeaf010da --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/listQueues.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.listQueues' + +export type QueryParams = { + /** Filter by enabled status. If not specified, returns all queues. */ + enabled?: boolean + /** Filter queues that handle this subject type ('account' or 'record'). */ + subjectType?: string + /** Filter queues by collection name (e.g. 'app.bsky.feed.post'). */ + collection?: string + /** Filter queues that handle any of these report reason types. */ + reportTypes?: string[] + limit: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + queues: ToolsOzoneQueueDefs.QueueView[] +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/routeReports.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/routeReports.ts new file mode 100644 index 00000000000..f93c258a635 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/routeReports.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.routeReports' + +export type QueryParams = {} + +export interface InputSchema { + /** Start of report ID range (inclusive). */ + startReportId: number + /** End of report ID range (inclusive). Difference between start and end must be less than 5,000. */ + endReportId: number +} + +export interface OutputSchema { + /** The number of reports assigned to a queue. */ + assigned: number + /** The number of reports with no matching queue. */ + unmatched: number +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'OutOfRange' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/unassignModerator.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/unassignModerator.ts new file mode 100644 index 00000000000..7bd95f89a2f --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/unassignModerator.ts @@ -0,0 +1,37 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.unassignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the queue to unassign the user from. */ + queueId: number + /** DID to be unassigned. */ + did: string +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerError { + status: number + message?: string + error?: 'InvalidAssignment' +} + +export type HandlerOutput = HandlerError | void diff --git a/packages/ozone/src/lexicon/types/tools/ozone/queue/updateQueue.ts b/packages/ozone/src/lexicon/types/tools/ozone/queue/updateQueue.ts new file mode 100644 index 00000000000..8c65567009f --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/queue/updateQueue.ts @@ -0,0 +1,51 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneQueueDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.queue.updateQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the queue to update */ + queueId: number + /** New display name for the queue */ + name?: string + /** Enable or disable the queue */ + enabled?: boolean + /** Optional description of the queue */ + description?: string +} + +export interface OutputSchema { + queue: ToolsOzoneQueueDefs.QueueView +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/assignModerator.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/assignModerator.ts new file mode 100644 index 00000000000..b1f3d94114c --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/assignModerator.ts @@ -0,0 +1,50 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.assignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the report to assign. */ + reportId: number + /** Optional queue ID to associate the assignment with. If not provided and the report has been assigned on a queue before, it will stay on that queue. */ + queueId?: number + /** DID to be assigned. Defaults to the caller's DID. Admins may assign to any moderator. */ + did?: string + /** When true, the assignment has no expiry (endAt is null). Throws AlreadyAssigned if another user already has a permanent assignment on this report. */ + isPermanent?: boolean +} + +export type OutputSchema = ToolsOzoneReportDefs.AssignmentView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'AlreadyAssigned' | 'InvalidAssignment' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/createActivity.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/createActivity.ts new file mode 100644 index 00000000000..8d8cd5d68f4 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/createActivity.ts @@ -0,0 +1,60 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.createActivity' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the report to record activity on */ + reportId: number + activity: + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } + /** Optional moderator-only note. Not visible to reporters. */ + internalNote?: string + /** Optional public-facing note, potentially visible to the reporter. */ + publicNote?: string + /** Set true when this activity is triggered by an automated process. Defaults to false. */ + isAutomated: boolean +} + +export interface OutputSchema { + activity: ToolsOzoneReportDefs.ReportActivityView +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'ReportNotFound' | 'InvalidStateTransition' | 'AlreadyInTargetState' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/defs.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/defs.ts index 0cc03726dcd..c3bba7f72b2 100644 --- a/packages/ozone/src/lexicon/types/tools/ozone/report/defs.ts +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/defs.ts @@ -9,6 +9,10 @@ import { is$typed as _is$typed, type OmitKey, } from '../../../../util' +import type * as ToolsOzoneTeamDefs from '../team/defs.js' +import type * as ToolsOzoneModerationDefs from '../moderation/defs.js' +import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' +import type * as ToolsOzoneQueueDefs from '../queue/defs.js' const is$typed = _is$typed, validate = _validate @@ -137,3 +141,326 @@ export const REASONSELFHARMSTUNTS = `${id}#reasonSelfHarmStunts` export const REASONSELFHARMSUBSTANCES = `${id}#reasonSelfHarmSubstances` /** Other dangerous content */ export const REASONSELFHARMOTHER = `${id}#reasonSelfHarmOther` + +/** Information about the moderator currently assigned to a report. */ +export interface ReportAssignment { + $type?: 'tools.ozone.report.defs#reportAssignment' + /** DID of the assigned moderator */ + did: string + moderator?: ToolsOzoneTeamDefs.Member + /** When the report was assigned */ + assignedAt: string +} + +const hashReportAssignment = 'reportAssignment' + +export function isReportAssignment(v: V) { + return is$typed(v, id, hashReportAssignment) +} + +export function validateReportAssignment(v: V) { + return validate(v, id, hashReportAssignment) +} + +export interface ReportView { + $type?: 'tools.ozone.report.defs#reportView' + /** Report ID */ + id: number + /** ID of the moderation event that created this report */ + eventId: number + /** Current status of the report */ + status: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) + subject: ToolsOzoneModerationDefs.SubjectView + reportType: ComAtprotoModerationDefs.ReasonType + /** DID of the user who made the report */ + reportedBy: string + reporter: ToolsOzoneModerationDefs.SubjectView + /** Comment provided by the reporter */ + comment?: string + /** When the report was created */ + createdAt: string + /** When the report was last updated */ + updatedAt?: string + /** When the report was assigned to its current queue */ + queuedAt?: string + /** Array of moderation event IDs representing actions taken on this report (sorted DESC, most recent first) */ + actionEventIds?: number[] + /** Optional: expanded action events */ + actions?: ToolsOzoneModerationDefs.ModEventView[] + /** Note sent to reporter when report was actioned */ + actionNote?: string + subjectStatus?: ToolsOzoneModerationDefs.SubjectStatusView + /** Number of other pending reports on the same subject */ + relatedReportCount?: number + assignment?: ReportAssignment + queue?: ToolsOzoneQueueDefs.QueueView + /** Whether this report is muted. A report is muted if the reporter was muted or the subject was muted at the time the report was created. */ + isMuted?: boolean +} + +const hashReportView = 'reportView' + +export function isReportView(v: V) { + return is$typed(v, id, hashReportView) +} + +export function validateReportView(v: V) { + return validate(v, id, hashReportView) +} + +/** Activity recording a report being routed to a queue. */ +export interface QueueActivity { + $type?: 'tools.ozone.report.defs#queueActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashQueueActivity = 'queueActivity' + +export function isQueueActivity(v: V) { + return is$typed(v, id, hashQueueActivity) +} + +export function validateQueueActivity(v: V) { + return validate(v, id, hashQueueActivity) +} + +/** Activity recording a moderator being assigned to a report. */ +export interface AssignmentActivity { + $type?: 'tools.ozone.report.defs#assignmentActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashAssignmentActivity = 'assignmentActivity' + +export function isAssignmentActivity(v: V) { + return is$typed(v, id, hashAssignmentActivity) +} + +export function validateAssignmentActivity(v: V) { + return validate(v, id, hashAssignmentActivity) +} + +/** Activity recording a report being escalated. */ +export interface EscalationActivity { + $type?: 'tools.ozone.report.defs#escalationActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashEscalationActivity = 'escalationActivity' + +export function isEscalationActivity(v: V) { + return is$typed(v, id, hashEscalationActivity) +} + +export function validateEscalationActivity(v: V) { + return validate(v, id, hashEscalationActivity) +} + +/** Activity recording a report being closed. */ +export interface CloseActivity { + $type?: 'tools.ozone.report.defs#closeActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashCloseActivity = 'closeActivity' + +export function isCloseActivity(v: V) { + return is$typed(v, id, hashCloseActivity) +} + +export function validateCloseActivity(v: V) { + return validate(v, id, hashCloseActivity) +} + +/** Activity recording a closed report being reopened. Only valid when the report is in 'closed' status. */ +export interface ReopenActivity { + $type?: 'tools.ozone.report.defs#reopenActivity' + /** The report's status before this activity. Populated automatically from the report row; not required in input. */ + previousStatus?: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) +} + +const hashReopenActivity = 'reopenActivity' + +export function isReopenActivity(v: V) { + return is$typed(v, id, hashReopenActivity) +} + +export function validateReopenActivity(v: V) { + return validate(v, id, hashReopenActivity) +} + +/** Activity recording a note on a report. Use internalNote for moderator-only notes or publicNote for reporter-visible notes (or both). */ +export interface NoteActivity { + $type?: 'tools.ozone.report.defs#noteActivity' +} + +const hashNoteActivity = 'noteActivity' + +export function isNoteActivity(v: V) { + return is$typed(v, id, hashNoteActivity) +} + +export function validateNoteActivity(v: V) { + return validate(v, id, hashNoteActivity) +} + +/** A single activity entry on a report. */ +export interface ReportActivityView { + $type?: 'tools.ozone.report.defs#reportActivityView' + /** Activity ID */ + id: number + /** ID of the report this activity belongs to */ + reportId: number + activity: + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } + /** Optional moderator-only note. Not visible to reporters. */ + internalNote?: string + /** Optional public note, potentially visible to the reporter. */ + publicNote?: string + /** Extensible JSON payload for loose activity-specific metadata (e.g. assignmentId). */ + meta?: { [_ in string]: unknown } + /** True if this activity was created by an automated process (e.g. queue router) rather than a direct human action. */ + isAutomated: boolean + /** DID of the actor who created this activity, or the service DID for automated activities. */ + createdBy: string + moderator?: ToolsOzoneTeamDefs.Member + /** When this activity was created */ + createdAt: string +} + +const hashReportActivityView = 'reportActivityView' + +export function isReportActivityView(v: V) { + return is$typed(v, id, hashReportActivityView) +} + +export function validateReportActivityView(v: V) { + return validate(v, id, hashReportActivityView) +} + +/** Live statistics for reports for the current calendar day, filterable by queue, moderator, or report type. */ +export interface LiveStats { + $type?: 'tools.ozone.report.defs#liveStats' + /** Number of reports currently not closed. */ + pendingCount?: number + /** Number of reports closed today. */ + actionedCount?: number + /** Number of reports escalated today. */ + escalatedCount?: number + /** Reports received today. */ + inboundCount?: number + /** Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. */ + actionRate?: number + /** Average time in seconds from report creation (or moderator assignment) to close. */ + avgHandlingTimeSec?: number + /** When these statistics were last computed. */ + lastUpdated?: string +} + +const hashLiveStats = 'liveStats' + +export function isLiveStats(v: V) { + return is$typed(v, id, hashLiveStats) +} + +export function validateLiveStats(v: V) { + return validate(v, id, hashLiveStats) +} + +/** A single daily snapshot of report statistics for a calendar date. */ +export interface HistoricalStats { + $type?: 'tools.ozone.report.defs#historicalStats' + /** The calendar date this snapshot covers (YYYY-MM-DD). */ + date: string + /** When this snapshot was last computed. */ + computedAt?: string + /** Number of reports not closed at time of computation. */ + pendingCount?: number + /** Number of reports closed during this day. */ + actionedCount?: number + /** Number of reports escalated during this day. */ + escalatedCount?: number + /** Reports received during this day. */ + inboundCount?: number + /** Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. */ + actionRate?: number + /** Average time in seconds from report creation (or moderator assignment) to close. */ + avgHandlingTimeSec?: number +} + +const hashHistoricalStats = 'historicalStats' + +export function isHistoricalStats(v: V) { + return is$typed(v, id, hashHistoricalStats) +} + +export function validateHistoricalStats(v: V) { + return validate(v, id, hashHistoricalStats) +} + +export interface AssignmentView { + $type?: 'tools.ozone.report.defs#assignmentView' + id: number + did: string + moderator?: ToolsOzoneTeamDefs.Member + queue?: ToolsOzoneQueueDefs.QueueView + reportId: number + startAt: string + endAt?: string +} + +const hashAssignmentView = 'assignmentView' + +export function isAssignmentView(v: V) { + return is$typed(v, id, hashAssignmentView) +} + +export function validateAssignmentView(v: V) { + return validate(v, id, hashAssignmentView) +} diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/getAssignments.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/getAssignments.ts new file mode 100644 index 00000000000..228ace6a28b --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/getAssignments.ts @@ -0,0 +1,48 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getAssignments' + +export type QueryParams = { + /** When true, only returns active assignments. */ + onlyActive: boolean + /** If specified, returns assignments for these reports only. */ + reportIds?: number[] + /** If specified, returns assignments for these moderators only. */ + dids?: string[] + limit: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + assignments: ToolsOzoneReportDefs.AssignmentView[] +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts new file mode 100644 index 00000000000..8d457fc58c7 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts @@ -0,0 +1,54 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getHistoricalStats' + +export type QueryParams = { + /** Filter stats by queue. Use -1 for unqueued reports. */ + queueId?: number + /** Filter stats by moderator DID. */ + moderatorDid?: string + /** Filter stats by report types. */ + reportTypes?: string[] + /** Earliest date to include (inclusive). */ + startDate?: string + /** Latest date to include (inclusive). */ + endDate?: string + /** Maximum number of entries to return. */ + limit: number + /** Pagination cursor. */ + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + stats: ToolsOzoneReportDefs.HistoricalStats[] + cursor?: string +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/getLatestReport.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/getLatestReport.ts new file mode 100644 index 00000000000..1043a660aa7 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/getLatestReport.ts @@ -0,0 +1,39 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getLatestReport' + +export type QueryParams = {} +export type InputSchema = undefined + +export interface OutputSchema { + report: ToolsOzoneReportDefs.ReportView +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'NotFound' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/getLiveStats.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/getLiveStats.ts new file mode 100644 index 00000000000..9e80e355d5e --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/getLiveStats.ts @@ -0,0 +1,45 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getLiveStats' + +export type QueryParams = { + /** Filter stats by queue. Use -1 for unqueued reports. */ + queueId?: number + /** Filter stats by moderator DID. */ + moderatorDid?: string + /** Filter stats by report types. */ + reportTypes?: string[] +} +export type InputSchema = undefined + +export interface OutputSchema { + stats: ToolsOzoneReportDefs.LiveStats +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/getReport.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/getReport.ts new file mode 100644 index 00000000000..8c66e2062f2 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/getReport.ts @@ -0,0 +1,38 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.getReport' + +export type QueryParams = { + /** The ID of the report to retrieve. */ + id: number +} +export type InputSchema = undefined +export type OutputSchema = ToolsOzoneReportDefs.ReportView +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'NotFound' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/listActivities.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/listActivities.ts new file mode 100644 index 00000000000..49238dd0704 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/listActivities.ts @@ -0,0 +1,44 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.listActivities' + +export type QueryParams = { + /** ID of the report whose activities to list */ + reportId: number + limit: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + activities: ToolsOzoneReportDefs.ReportActivityView[] + cursor?: string +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/queryReports.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/queryReports.ts new file mode 100644 index 00000000000..f47f08dff69 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/queryReports.ts @@ -0,0 +1,72 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.queryReports' + +export type QueryParams = { + /** Filter by queue ID. Use -1 for unassigned reports. */ + queueId?: number + /** Filter by report types (fully qualified string in the format of com.atproto.moderation.defs#reason). */ + reportTypes?: string[] + /** Filter by report status. */ + status: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' + | (string & {}) + /** Filter by subject DID or AT-URI. */ + subject?: string + /** Filter to reports where the subject is this DID or any record owned by this DID. Unlike `subject` (which scopes to a specific account or record), this returns all reports tied to the DID across both account-level and record-level subjects. */ + did?: string + /** If specified, reports of the given type (account or record) will be returned. */ + subjectType?: 'account' | 'record' | (string & {}) + /** If specified, reports where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored. */ + collections?: string[] + /** Retrieve reports created after a given timestamp */ + reportedAfter?: string + /** Retrieve reports created before a given timestamp */ + reportedBefore?: string + /** Filter by muted status. true returns only muted reports, false returns only unmuted reports. Defaults to false. */ + isMuted: boolean + /** Filter by the DID of the moderator permanently assigned to the report. */ + assignedTo?: string + sortField: 'createdAt' | 'updatedAt' + sortDirection: 'asc' | 'desc' + limit: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + reports: ToolsOzoneReportDefs.ReportView[] +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/reassignQueue.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/reassignQueue.ts new file mode 100644 index 00000000000..a4b93283cba --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/reassignQueue.ts @@ -0,0 +1,55 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.reassignQueue' + +export type QueryParams = {} + +export interface InputSchema { + /** ID of the report to reassign */ + reportId: number + /** Target queue ID. Use -1 to unassign from any queue. */ + queueId: number + /** Optional moderator-only note recorded on the resulting queueActivity as internalNote. */ + comment?: string +} + +export interface OutputSchema { + report: ToolsOzoneReportDefs.ReportView +} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: + | 'ReportNotFound' + | 'ReportClosed' + | 'AlreadyInTargetQueue' + | 'QueueNotFound' + | 'QueueDisabled' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/refreshStats.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/refreshStats.ts new file mode 100644 index 00000000000..6cd80bf52df --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/refreshStats.ts @@ -0,0 +1,46 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.refreshStats' + +export type QueryParams = {} + +export interface InputSchema { + /** Start date for recomputation, inclusive (YYYY-MM-DD). */ + startDate: string + /** End date for recomputation, inclusive (YYYY-MM-DD). */ + endDate: string + /** Optional list of queue IDs to recompute. Omit to recompute all groups. */ + queueIds?: number[] +} + +export interface OutputSchema {} + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/tools/ozone/report/unassignModerator.ts b/packages/ozone/src/lexicon/types/tools/ozone/report/unassignModerator.ts new file mode 100644 index 00000000000..583606bbfa5 --- /dev/null +++ b/packages/ozone/src/lexicon/types/tools/ozone/report/unassignModerator.ts @@ -0,0 +1,44 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util' +import type * as ToolsOzoneReportDefs from './defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'tools.ozone.report.unassignModerator' + +export type QueryParams = {} + +export interface InputSchema { + /** The ID of the report to unassign. */ + reportId: number +} + +export type OutputSchema = ToolsOzoneReportDefs.AssignmentView + +export interface HandlerInput { + encoding: 'application/json' + body: InputSchema +} + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string + error?: 'InvalidAssignment' +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/mod-service/index.ts b/packages/ozone/src/mod-service/index.ts index 57208130ae7..a94c3001152 100644 --- a/packages/ozone/src/mod-service/index.ts +++ b/packages/ozone/src/mod-service/index.ts @@ -62,6 +62,7 @@ import { import { ModEventType, ModerationEventRow, + ModerationEventRowWithHandle, ModerationSubjectStatusRow, ModerationSubjectStatusRowWithHandle, ReporterStats, @@ -376,6 +377,29 @@ export class ModerationService { return { cursor: keyset.packFromResult(result), events: resultWithHandles } } + async getEventsByIds(ids: number[]): Promise { + if (!ids.length) return [] + + const result = await this.db.db + .selectFrom('moderation_event') + .selectAll() + .where('id', 'in', ids) + .execute() + + if (!result.length) return [] + + const infos = await this.views.getAccoutInfosByDid([ + ...result.map((row) => row.subjectDid), + ...result.map((row) => row.createdBy), + ]) + + return result.map((r) => ({ + ...r, + creatorHandle: infos.get(r.createdBy)?.handle, + subjectHandle: infos.get(r.subjectDid)?.handle, + })) + } + async getReport(id: number): Promise { return await this.db.db .selectFrom('moderation_event') @@ -591,6 +615,13 @@ export class ModerationService { if (isReportingMuted) { meta.isReporterMuted = true } + // Also capture whether the subject was muted at event-creation time, so + // the queue-router daemon can populate report.isMuted later without + // racing against subsequent mute/unmute changes. + const isSubjectMuted = await this.isSubjectMuted(subject.did) + if (isSubjectMuted) { + meta.isSubjectMuted = true + } } const subjectInfo = subject.info() @@ -1035,7 +1066,7 @@ export class ModerationService { modTool, } = info - const result = await this.logEvent({ + return await this.logEvent({ event: { $type: 'tools.ozone.moderation.defs#modEventReport', reportType: reasonType, @@ -1046,8 +1077,6 @@ export class ModerationService { createdAt, modTool, }) - - return result } async getSubjectStatuses({ @@ -1425,6 +1454,19 @@ export class ModerationService { return !!result } + // Check if a subject (the account being reported) has an active mute + async isSubjectMuted(did: string) { + const result = await this.db.db + .selectFrom('moderation_subject_status') + .where('did', '=', did) + .where('recordPath', '=', '') + .where('muteUntil', '>', new Date().toISOString()) + .select(sql`true`.as('status')) + .executeTakeFirst() + + return !!result + } + async formatAndCreateLabels( uri: string, cid: string | null, diff --git a/packages/ozone/src/mod-service/report.ts b/packages/ozone/src/mod-service/report.ts new file mode 100644 index 00000000000..461dfb10470 --- /dev/null +++ b/packages/ozone/src/mod-service/report.ts @@ -0,0 +1,408 @@ +import { sql } from 'kysely' +import { AtUri } from '@atproto/syntax' +import { Database } from '../db' +import { Report } from '../db/schema/report' +import { QueryParams } from '../lexicon/types/tools/ozone/report/queryReports' +import { + AlreadyInTargetState, + InvalidStateTransition, + handleReportUpdate, +} from '../report/handle-report-update' + +export type ReportWithEvent = Omit & { + id: number + subjectDid: string + subjectUri: string | null + subjectCid: string | null + reportedBy: string + comment: string | null + meta: Record | null +} + +export type QueryReportsResult = { + reports: ReportWithEvent[] + cursor: string | undefined +} +function reportQuery(db: Database) { + return db.db + .selectFrom('report as r') + .innerJoin('moderation_event as me', 'me.id', 'r.eventId') + .where('me.action', '=', 'tools.ozone.moderation.defs#modEventReport') +} + +export async function queryReports( + db: Database, + params: QueryParams, +): Promise { + let builder = reportQuery(db) + + if (params.queueId !== undefined) { + builder = builder.where('r.queueId', '=', params.queueId) + } + + builder = builder.where('r.status', '=', params.status) + + if (params.subject) { + const isRecord = params.subject.startsWith('at://') + if (isRecord) { + const uri = new AtUri(params.subject) + builder = builder + .where('r.did', '=', uri.host) + .where('r.recordPath', '=', `${uri.collection}/${uri.rkey}`) + } else { + builder = builder + .where('r.did', '=', params.subject) + .where('r.recordPath', '=', '') + } + } + + if (params.did) { + builder = builder.where('r.did', '=', params.did) + } + + if (params.subjectType) { + const normalizedType = params.subjectType as 'account' | 'record' + if (normalizedType === 'account') { + builder = builder.where('r.recordPath', '=', '') + } else if (normalizedType === 'record') { + builder = builder.where('r.recordPath', '!=', '') + } + } + + if (params.collections?.length) { + // Filter by collection prefix on recordPath (uses text_pattern_ops index) + const collectionConditions = params.collections.map( + (collection) => sql`r."recordPath" LIKE ${`${collection}/%`}`, + ) + builder = builder.where(sql`(${sql.join(collectionConditions, sql` OR `)})`) + } + + if (params.reportTypes?.length) { + builder = builder.where('r.reportType', 'in', params.reportTypes) + } + + if (params.isMuted !== undefined) { + builder = builder.where('r.isMuted', '=', params.isMuted) + } + + if (params.reportedAfter) { + builder = builder.where('r.createdAt', '>', params.reportedAfter) + } + + if (params.reportedBefore) { + builder = builder.where('r.createdAt', '<', params.reportedBefore) + } + + if (params.assignedTo) { + builder = builder.where('r.assignedTo', '=', params.assignedTo) + } + + const sortField = params.sortField ?? 'createdAt' + const sortDirection = params.sortDirection ?? 'desc' + + builder = builder + .orderBy( + sortField === 'updatedAt' ? 'r.updatedAt' : 'r.createdAt', + sortDirection, + ) + .orderBy('r.id', 'desc') + + const limit = params.limit ?? 50 + if (params.cursor) { + const [sortValue, id] = params.cursor.split('::') + const sortCol = sortField === 'updatedAt' ? 'r.updatedAt' : 'r.createdAt' + if (sortDirection === 'desc') { + builder = builder.where(sql`( + ${sql.ref(sortCol)} < ${sortValue} + OR (${sql.ref(sortCol)} = ${sortValue} AND r.id < ${Number(id)}) + )`) + } else { + builder = builder.where(sql`( + ${sql.ref(sortCol)} > ${sortValue} + OR (${sql.ref(sortCol)} = ${sortValue} AND r.id > ${Number(id)}) + )`) + } + } + + const finalQuery = builder + .selectAll('r') + .select([ + 'me.subjectDid', + 'me.subjectUri', + 'me.subjectCid', + 'me.createdBy as reportedBy', + 'me.comment', + 'me.meta', + ]) + .limit(limit + 1) + + const reports = await finalQuery.execute() + + let cursor: string | undefined + const hasMore = reports.length > limit + if (hasMore) { + const last = reports[limit - 1] + const sortValue = + sortField === 'updatedAt' ? last.updatedAt : last.createdAt + cursor = `${sortValue}::${last.id}` + } + + const reportsToReturn = hasMore ? reports.slice(0, limit) : reports + + return { + reports: reportsToReturn, + cursor, + } +} + +export async function getReportById( + db: Database, + id: number, +): Promise { + return reportQuery(db) + .where('r.id', '=', id) + .selectAll('r') + .select([ + 'me.subjectDid', + 'me.subjectUri', + 'me.subjectCid', + 'me.createdBy as reportedBy', + 'me.comment', + 'me.meta', + ]) + .executeTakeFirst() +} + +export async function getLatestReport( + db: Database, +): Promise { + return reportQuery(db) + .selectAll('r') + .select([ + 'me.subjectDid', + 'me.subjectUri', + 'me.subjectCid', + 'me.createdBy as reportedBy', + 'me.comment', + 'me.meta', + ]) + .orderBy('r.id', 'desc') + .limit(1) + .executeTakeFirst() +} + +export type FindReportsForSubjectParams = { + subjectDid: string + subjectUri?: string | null + reportIds?: number[] + reportTypes?: string[] + targetAll?: boolean +} + +export type ReportResult = { + id: number + eventId: number + queueId: number | null + queuedAt: string | null + actionEventIds: number[] | null + actionNote: string | null + isMuted: boolean + status: string + createdAt: string + updatedAt: string +} + +export async function findReportsForSubject( + db: Database, + params: FindReportsForSubjectParams, +): Promise { + let builder = reportQuery(db).where('r.did', '=', params.subjectDid) + + // Filter by subject URI (if provided, match exactly; if null/undefined, match repo-level) + if (params.subjectUri) { + const uri = new AtUri(params.subjectUri) + builder = builder.where( + 'r.recordPath', + '=', + `${uri.collection}/${uri.rkey}`, + ) + } else { + builder = builder.where('r.recordPath', '=', '') + } + + if (params.targetAll) { + // Target all open/escalated reports on the subject + builder = builder.where('r.status', 'not in', ['closed']) + } else if (params.reportIds?.length) { + // Target specific report IDs — still enforce state transition rules + builder = builder + .where('r.id', 'in', params.reportIds) + .where('r.status', 'not in', ['closed']) + } else if (params.reportTypes?.length) { + // Target reports matching specific report types + builder = builder + .where('r.reportType', 'in', params.reportTypes) + .where('r.status', 'not in', ['closed']) + } else { + // No targeting criteria provided + return [] + } + + const reports = await builder.selectAll('r').execute() + + return reports +} + +export type ProcessReportActionParams = { + db: Database + reportAction: { + ids?: number[] + types?: string[] + all?: boolean + note?: string + } + subjectDid: string + subjectUri: string | null + eventId: number + eventType: string + createdBy: string +} + +/** + * Validates and processes a report action by: + * 1. Finding matching reports based on targeting criteria + * 2. Validating that specified report IDs exist and belong to the subject + * 3. Bulk-updating reports with the action event ID, note, and status + * 4. Bulk-inserting a report_activity row for each updated report + * + * @throws InvalidRequestError if validation fails + */ +export async function processReportAction( + params: ProcessReportActionParams, +): Promise { + const { + db, + reportAction, + subjectDid, + subjectUri, + eventId, + eventType, + createdBy, + } = params + + // Find reports matching the criteria + const matchingReports = await findReportsForSubject(db, { + subjectDid, + subjectUri, + reportIds: reportAction.ids, + reportTypes: reportAction.types, + targetAll: reportAction.all, + }) + + // Validate that reports were found for ids and types + if (matchingReports.length === 0) { + if (reportAction.ids?.length) { + throw new Error( + 'No matching reports found for the specified report IDs on this subject', + ) + } else if (reportAction.types?.length) { + throw new Error( + 'No matching reports found for the specified report types on this subject', + ) + } + // For 'all', it's okay if no reports exist + return 0 + } + + // Validate that all specified report IDs were found + if (reportAction.ids?.length) { + const foundIds = new Set(matchingReports.map((r) => r.id)) + const requestedIds = new Set(reportAction.ids) + const missingIds = [...requestedIds].filter((id) => !foundIds.has(id)) + + if (missingIds.length > 0) { + throw new Error( + `Report IDs ${missingIds.join(', ')} do not exist, are already closed, or do not belong to this subject`, + ) + } + } + + // Determine per-report transitions via the pure state machine. + // Skip reports whose current status doesn't allow the transition. + const validUpdates: { + id: number + nextStatus: string + activityType: string + previousStatus: string + }[] = [] + + for (const report of matchingReports) { + try { + const result = handleReportUpdate(report.status, { + type: 'event', + eventType, + }) + if (result.nextStatus && result.activity) { + validUpdates.push({ + id: report.id, + nextStatus: result.nextStatus, + activityType: result.activity.activityType, + previousStatus: result.activity.previousStatus, + }) + } + } catch (err) { + if ( + err instanceof AlreadyInTargetState || + err instanceof InvalidStateTransition + ) { + // Skip reports that can't transition — silent per design + continue + } + throw err + } + } + + if (!validUpdates.length) { + return 0 + } + + const now = new Date().toISOString() + const updateIds = validUpdates.map((u) => u.id) + + // Bulk UPDATE reports that passed validation + // All valid reports share the same target status since they come from the + // same event type, so a single UPDATE is sufficient. + const status = validUpdates[0].nextStatus + const closedAt = status === 'closed' ? now : null + await db.db + .updateTable('report') + .set({ + actionEventIds: sql`COALESCE("actionEventIds", '[]'::jsonb) || ${JSON.stringify(eventId)}::jsonb`, + actionNote: reportAction.note ?? null, + status, + updatedAt: now, + closedAt, + }) + .where('id', 'in', updateIds) + .execute() + + // Bulk INSERT one activity per updated report + await db.db + .insertInto('report_activity') + .values( + validUpdates.map((u) => ({ + reportId: u.id, + activityType: u.activityType, + previousStatus: u.previousStatus, + internalNote: null, + publicNote: reportAction.note ?? null, + meta: null, + isAutomated: false, + createdBy, + createdAt: now, + })), + ) + .execute() + + return validUpdates.length +} diff --git a/packages/ozone/src/queue/service.ts b/packages/ozone/src/queue/service.ts new file mode 100644 index 00000000000..fa2c0d36ad5 --- /dev/null +++ b/packages/ozone/src/queue/service.ts @@ -0,0 +1,599 @@ +import { Selectable, sql } from 'kysely' +import { ToolsOzoneQueueDefs } from '@atproto/api' +import { AtUri } from '@atproto/syntax' +import { InvalidRequestError } from '@atproto/xrpc-server' +import { Database } from '../db' +import { TimeIdKeyset, paginate } from '../db/pagination' +import { ReportQueue } from '../db/schema/report_queue' +import { jsonb } from '../db/types' +import { handleReportUpdate } from '../report/handle-report-update' +import { ReportStatsService } from '../report/stats' +import { viewQueueStats } from '../report/views' + +const MOD_EVENT_REPORT_ACTION = 'tools.ozone.moderation.defs#modEventReport' +const REASON_OTHER = 'com.atproto.moderation.defs#reasonOther' + +type SubjectType = 'account' | 'record' | 'message' + +type ResolvedAssignment = { + queueId: number + queuedAt: string | null + status: 'queued' | 'open' +} + +function resolveAssignment( + subjectType: SubjectType, + collection: string | null, + reportType: string, + queues: Selectable[], + now: string, +): ResolvedAssignment { + const matched = findMatchingQueue(queues, subjectType, collection, reportType) + if (matched) return { queueId: matched.id, queuedAt: now, status: 'queued' } + return { queueId: -1, queuedAt: null, status: 'open' } +} + +export type QueueServiceCreator = (db: Database) => QueueService + +export class QueueService { + constructor(public db: Database) {} + + static creator() { + return (db: Database) => new QueueService(db) + } + + async checkConflict({ + subjectTypes, + collection, + reportTypes, + excludeId, + }: { + subjectTypes: string[] + collection?: string | null + reportTypes: string[] + excludeId?: number + }): Promise { + // It's not ideal to load all rows and perform in memory checks in case we end up with a LOT of queues + // but we are not foreseeing a lot of queue rows so this should be fine for the + let qb = this.db.db + .selectFrom('report_queue') + .selectAll() + .where('deletedAt', 'is', null) + + if (excludeId !== undefined) { + qb = qb.where('id', '!=', excludeId) + } + + const existingQueues = await qb.execute() + + for (const existing of existingQueues) { + const subjectTypesOverlap = subjectTypes.some((st) => + existing.subjectTypes.includes(st), + ) + const collectionMatch = (collection ?? null) === existing.collection + const reportTypesOverlap = reportTypes.some((rt) => + existing.reportTypes.includes(rt), + ) + + if (subjectTypesOverlap && collectionMatch && reportTypesOverlap) { + throw new InvalidRequestError( + `Queue configuration conflicts with existing queue: ${existing.name}`, + 'ConflictingQueue', + ) + } + } + } + + async create({ + name, + subjectTypes, + collection, + reportTypes, + description, + createdBy, + }: { + name: string + subjectTypes: string[] + collection?: string | null + reportTypes: string[] + description?: string | null + createdBy: string + }): Promise> { + const now = new Date().toISOString() + return await this.db.db + .insertInto('report_queue') + .values({ + name, + subjectTypes: jsonb(subjectTypes), + collection: collection ?? null, + reportTypes: jsonb(reportTypes), + description: description ?? null, + createdBy, + enabled: true, + createdAt: now, + updatedAt: now, + }) + .returningAll() + .executeTakeFirstOrThrow() + } + + async getById(id: number): Promise | undefined> { + return await this.db.db + .selectFrom('report_queue') + .selectAll() + .where('id', '=', id) + .where('deletedAt', 'is', null) + .executeTakeFirst() + } + + async getViewsByIds( + ids: number[], + ): Promise> { + if (!ids.length) return new Map() + const rows = await this.db.db + .selectFrom('report_queue') + .selectAll() + .where('id', 'in', ids) + .execute() + return new Map(rows.map((r) => [r.id, this.view(r)])) + } + + async update( + id: number, + updates: { name?: string; enabled?: boolean; description?: string }, + ): Promise> { + const now = new Date().toISOString() + return await this.db.db + .updateTable('report_queue') + .set({ ...updates, updatedAt: now }) + .where('id', '=', id) + .returningAll() + .executeTakeFirstOrThrow() + } + + async delete(id: number): Promise { + const now = new Date().toISOString() + await this.db.db + .updateTable('report_queue') + .set({ deletedAt: now }) + .where('id', '=', id) + .execute() + } + + async migrateReports( + fromQueueId: number, + toQueueId?: number, + ): Promise { + const now = new Date().toISOString() + const results = await this.db.db + .updateTable('report') + .set({ + queueId: toQueueId ?? -1, + queuedAt: toQueueId ? now : null, + updatedAt: now, + }) + .where('queueId', '=', fromQueueId) + .where('status', '!=', 'closed') + .execute() + return results.reduce((sum, r) => sum + Number(r.numUpdatedRows), 0) + } + + async list({ + limit, + cursor, + enabled, + subjectType, + collection, + reportTypes, + }: { + limit: number + cursor?: string + enabled?: boolean + subjectType?: string + collection?: string + reportTypes?: string[] + }): Promise<{ queues: Selectable[]; cursor?: string }> { + const { ref } = this.db.db.dynamic + let qb = this.db.db + .selectFrom('report_queue') + .selectAll() + .where('deletedAt', 'is', null) + + if (enabled !== undefined) { + qb = qb.where('enabled', '=', enabled) + } + + if (subjectType !== undefined) { + qb = qb.where(sql`"subjectTypes" @> ${jsonb([subjectType])}`) + } + + if (collection !== undefined) { + qb = qb.where('collection', '=', collection) + } + + if (reportTypes && reportTypes.length > 0) { + const conditions = reportTypes.map( + (t) => sql`"reportTypes" @> ${jsonb([t])}`, + ) + qb = qb.where(sql`(${sql.join(conditions, sql` OR `)})`) + } + + const keyset = new TimeIdKeyset(ref('createdAt'), ref('id')) + const paginatedBuilder = paginate(qb, { + limit, + cursor, + keyset, + direction: 'asc', + tryIndex: true, + }) + + const queues = await paginatedBuilder.execute() + + return { + queues, + cursor: keyset.packFromResult(queues), + } + } + + view(queue: Selectable): ToolsOzoneQueueDefs.QueueView { + return { + id: queue.id, + name: queue.name, + subjectTypes: queue.subjectTypes, + collection: queue.collection ?? undefined, + reportTypes: queue.reportTypes, + description: queue.description ?? undefined, + createdBy: queue.createdBy, + createdAt: queue.createdAt, + updatedAt: queue.updatedAt, + enabled: queue.enabled, + deletedAt: queue.deletedAt ?? undefined, + stats: { + pendingCount: 0, + actionedCount: 0, + escalatedCount: 0, + inboundCount: 0, + actionRate: 0, + }, + } + } + + async viewsWithStats( + queues: Selectable[], + ): Promise { + const statsService = new ReportStatsService(this.db) + const queueIds = queues.map((q) => q.id) + const statsMap = await statsService.getLiveStatsForQueues(queueIds) + + return queues.map((queue) => { + const view = this.view(queue) + view.stats = viewQueueStats(statsMap.get(queue.id)) + return view + }) + } + + /** + * Re-route a range of existing reports against the current queue config. + * Used by the manual `tools.ozone.queue.routeReports` endpoint to pick up + * reports after queues are created or modified. New reports are inserted + * by the daemon via `insertReportsFromEvents`, not here. + */ + async assignReportBatch( + params: { start: number; end: number; limit: number }, + opts?: { includeUnmatched?: boolean; serviceDid?: string }, + ): Promise<{ + processed: number + assigned: number + unmatched: number + maxId: number + }> { + const { queues } = await this.list({ limit: 1000, enabled: true }) + + if (!queues.length) { + return { processed: 0, assigned: 0, unmatched: 0, maxId: 0 } + } + + let query = this.db.db + .selectFrom('report as r') + .select([ + 'r.id', + 'r.status', + 'r.reportType', + 'r.recordPath', + 'r.subjectMessageId', + ]) + .where('r.status', '!=', 'closed') + .where('r.id', '>=', params.start) + .where('r.id', '<=', params.end) + .orderBy('r.id', 'asc') + .limit(params.limit) + + if (opts?.includeUnmatched) { + query = query.where((qb) => { + return qb.orWhere('r.queueId', 'is', null).orWhere('r.queueId', '=', -1) + }) + } else { + query = query.where('r.queueId', 'is', null) + } + + const reports = await query.execute() + + if (!reports.length) { + return { processed: 0, assigned: 0, unmatched: 0, maxId: 0 } + } + + const now = new Date().toISOString() + + // Resolve each report's destination in memory — no DB calls in this loop + type MatchedEntry = { + id: number + queueId: number + nextStatus: string | null + activity: { activityType: string; previousStatus: string } | null + } + + const matchedByQueue = new Map() + const unmatchedIds: number[] = [] + let maxReportId = 0 + + for (const report of reports) { + const subjectType: SubjectType = report.subjectMessageId + ? 'message' + : report.recordPath + ? 'record' + : 'account' + + // recordPath is 'collection/rkey' for records, '' for accounts + const slashIdx = report.recordPath.indexOf('/') + const collection = + slashIdx > 0 ? report.recordPath.slice(0, slashIdx) : null + + const assignment = resolveAssignment( + subjectType, + collection, + report.reportType, + queues, + now, + ) + + if (assignment.queueId !== -1) { + // Existing-row UPDATE path uses handleReportUpdate so that already + // escalated/closed/etc. reports keep their status — only open → queued + // transitions emit a status change and an activity row. + const result = handleReportUpdate(report.status, { type: 'queue' }) + const group = matchedByQueue.get(assignment.queueId) ?? [] + group.push({ + id: report.id, + queueId: assignment.queueId, + nextStatus: result.nextStatus, + activity: result.activity, + }) + matchedByQueue.set(assignment.queueId, group) + } else { + unmatchedIds.push(report.id) + } + + if (report.id > maxReportId) maxReportId = report.id + } + + // Bulk UPDATE matched reports — split by whether status should change. + // handleReportUpdate returns nextStatus only for open → queued; + // other statuses keep their current status but still get routed. + for (const [queueId, group] of matchedByQueue) { + const withTransition = group + .filter((r) => r.nextStatus !== null) + .map((r) => r.id) + const withoutTransition = group + .filter((r) => r.nextStatus === null) + .map((r) => r.id) + + if (withTransition.length) { + await this.db.db + .updateTable('report') + .set({ queueId, queuedAt: now, status: 'queued', updatedAt: now }) + .where('id', 'in', withTransition) + .execute() + } + if (withoutTransition.length) { + await this.db.db + .updateTable('report') + .set({ queueId, queuedAt: now, updatedAt: now }) + .where('id', 'in', withoutTransition) + .execute() + } + } + + // Bulk UPDATE unmatched reports — status stays unchanged + if (unmatchedIds.length) { + await this.db.db + .updateTable('report') + .set({ queueId: -1, queuedAt: null, updatedAt: now }) + .where('id', 'in', unmatchedIds) + .execute() + } + + // Bulk INSERT activities for matched reports that changed status. + if (opts?.serviceDid) { + const withActivities = [...matchedByQueue.values()] + .flat() + .filter((r) => r.activity !== null) + if (withActivities.length) { + await this.db.db + .insertInto('report_activity') + .values( + withActivities.map((r) => ({ + reportId: r.id, + activityType: r.activity!.activityType, + previousStatus: r.activity!.previousStatus, + internalNote: null, + publicNote: null, + meta: null, + isAutomated: true, + createdBy: opts.serviceDid!, + createdAt: now, + })), + ) + .execute() + } + } + + const assigned = [...matchedByQueue.values()].reduce( + (sum, g) => sum + g.length, + 0, + ) + + return { + processed: reports.length, + assigned, + unmatched: unmatchedIds.length, + maxId: maxReportId, + } + } + + /** + * Read newly-created modEventReport rows from `moderation_event` and + * insert corresponding `report` rows with `queueId` already resolved. + * Used by the queue-router daemon. Idempotent via `ON CONFLICT (eventId) + * DO NOTHING` — safe to re-run on the same range. + * + * Even when no queues are configured, report rows are still inserted with + * `queueId = -1` so the invariant "every modEventReport has a `report` row" + * holds. + */ + async insertReportsFromEvents(params: { + cursor: number | null + limit: number + }): Promise<{ + processed: number + assigned: number + unmatched: number + maxEventId: number + }> { + const { queues } = await this.list({ limit: 1000, enabled: true }) + + let query = this.db.db + .selectFrom('moderation_event') + .select([ + 'id', + 'subjectDid', + 'subjectUri', + 'subjectMessageId', + 'meta', + 'createdAt', + ]) + .where('action', '=', MOD_EVENT_REPORT_ACTION) + .orderBy('id', 'asc') + .limit(params.limit) + + if (params.cursor !== null) { + query = query.where('id', '>', params.cursor) + } + + const events = await query.execute() + + if (!events.length) { + return { processed: 0, assigned: 0, unmatched: 0, maxEventId: 0 } + } + + const now = new Date().toISOString() + let maxEventId = 0 + let assigned = 0 + let unmatched = 0 + + const rows = events.map((event) => { + const subjectType: SubjectType = event.subjectMessageId + ? 'message' + : event.subjectUri + ? 'record' + : 'account' + + let collection: string | null = null + let recordPath = '' + if (event.subjectUri) { + const uri = new AtUri(event.subjectUri) + collection = uri.collection + recordPath = `${uri.collection}/${uri.rkey}` + } + + const reportType = + (event.meta?.reportType as string | undefined) ?? REASON_OTHER + + const assignment = resolveAssignment( + subjectType, + collection, + reportType, + queues, + now, + ) + + if (assignment.queueId === -1) unmatched++ + else assigned++ + if (event.id > maxEventId) maxEventId = event.id + + const isMuted = + !!event.meta?.isReporterMuted || !!event.meta?.isSubjectMuted + + return { + eventId: event.id, + queueId: assignment.queueId, + queuedAt: assignment.queuedAt, + actionEventIds: null, + actionNote: null, + isMuted, + status: assignment.status, + reportType, + did: event.subjectDid, + recordPath, + subjectMessageId: event.subjectMessageId, + createdAt: now, + updatedAt: now, + } + }) + + // ON CONFLICT (eventId) DO NOTHING covers any race where a report row + // already exists for the event (e.g. transitional code paths or retries + // after a crash mid-batch). + await this.db.db + .insertInto('report') + .values(rows) + .onConflict((oc) => oc.column('eventId').doNothing()) + .execute() + + // Activity rows are intentionally not emitted: a freshly-inserted report + // has no prior state to "transition" from. Activity rows record state + // changes, and being born already-queued is not a state change. This + // matches `handleReportUpdate`'s design where activity is only emitted + // on real transitions. + + return { + processed: events.length, + assigned, + unmatched, + maxEventId, + } + } +} + +export function findMatchingQueue( + queues: Selectable[], + subjectType: string, + collection: string | null, + reportType: string | undefined, +): Selectable | null { + if (!reportType) return null + + for (const queue of queues) { + const subjectTypeMatch = queue.subjectTypes.includes(subjectType) + const collectionMatch = + subjectType === 'record' && queue.collection !== null + ? (collection ?? null) === queue.collection + : true + const reportTypeMatch = queue.reportTypes.includes(reportType) + + if (subjectTypeMatch && collectionMatch && reportTypeMatch) { + return queue + } + } + + return null +} diff --git a/packages/ozone/src/report/activity.ts b/packages/ozone/src/report/activity.ts new file mode 100644 index 00000000000..f35a4378e3e --- /dev/null +++ b/packages/ozone/src/report/activity.ts @@ -0,0 +1,234 @@ +import { InvalidRequestError } from '@atproto/xrpc-server' +import { Database } from '../db' +import { Member } from '../lexicon/types/tools/ozone/team/defs' +import { + AlreadyInTargetState, + InvalidStateTransition, + handleReportUpdate, +} from './handle-report-update' + +export type ActivityType = + | 'queueActivity' + | 'assignmentActivity' + | 'escalationActivity' + | 'closeActivity' + | 'reopenActivity' + | 'noteActivity' + +export type CreateActivityParams = { + reportId: number + activityType: ActivityType + internalNote?: string + publicNote?: string + meta?: Record + /** Set true for activities created by automated processes (e.g. queue router). */ + isAutomated?: boolean + createdBy: string +} + +export async function createReportActivity( + db: Database, + params: CreateActivityParams, +) { + const { + reportId, + activityType, + internalNote, + publicNote, + meta, + isAutomated = false, + createdBy, + } = params + + return db.transaction(async (dbTxn) => { + // Lock the report row for the duration of the transaction to prevent + // concurrent writes from racing on status validation + update. + const report = await dbTxn.db + .selectFrom('report') + .select(['id', 'status']) + .where('id', '=', reportId) + .forUpdate() + .executeTakeFirst() + + if (!report) { + throw new InvalidRequestError( + `Report ${reportId} not found`, + 'ReportNotFound', + ) + } + + let result + try { + result = handleReportUpdate(report.status, { + type: 'activity', + activityType, + }) + } catch (err) { + if (err instanceof AlreadyInTargetState) { + throw new InvalidRequestError(err.message, 'AlreadyInTargetState') + } + if (err instanceof InvalidStateTransition) { + throw new InvalidRequestError(err.message, 'InvalidStateTransition') + } + throw err + } + + const now = new Date().toISOString() + + if (result.nextStatus !== null) { + const updateSet: Record = { + status: result.nextStatus, + updatedAt: now, + } + if (result.nextStatus === 'closed') { + updateSet.closedAt = now + } else if (result.nextStatus === 'open') { + updateSet.closedAt = null + } + await dbTxn.db + .updateTable('report') + .set(updateSet) + .where('id', '=', reportId) + .execute() + } + + const [activity] = await dbTxn.db + .insertInto('report_activity') + .values({ + reportId, + activityType, + previousStatus: result.activity?.previousStatus ?? null, + internalNote: internalNote ?? null, + publicNote: publicNote ?? null, + meta: meta ?? null, + isAutomated, + createdBy, + createdAt: now, + }) + .returningAll() + .execute() + + return activity + }) +} + +export type BulkActivityInsert = { + reportId: number + activityType: string + previousStatus: string | null + internalNote?: string + publicNote?: string + meta?: unknown + isAutomated: boolean + createdBy: string + createdAt: string +} + +/** + * Insert multiple activity rows in a single query. No validation — caller is + * responsible for correctness and for being inside an appropriate transaction. + */ +export async function bulkInsertReportActivities( + db: Database, + activities: BulkActivityInsert[], +) { + if (!activities.length) return + await db.db + .insertInto('report_activity') + .values( + activities.map((a) => ({ + reportId: a.reportId, + activityType: a.activityType, + previousStatus: a.previousStatus, + internalNote: a.internalNote ?? null, + publicNote: a.publicNote ?? null, + meta: a.meta ?? null, + isAutomated: a.isAutomated, + createdBy: a.createdBy, + createdAt: a.createdAt, + })), + ) + .execute() +} + +export type ListActivitiesParams = { + reportId: number + limit?: number + cursor?: string +} + +export async function listReportActivities( + db: Database, + params: ListActivitiesParams, +) { + const { reportId, limit = 50, cursor } = params + + let builder = db.db + .selectFrom('report_activity') + .selectAll() + .where('reportId', '=', reportId) + .orderBy('createdAt', 'desc') + .orderBy('id', 'desc') + .limit(limit + 1) + + if (cursor) { + const cursorId = parseInt(cursor, 10) + if (!isNaN(cursorId)) { + builder = builder.where('id', '<', cursorId) + } + } + + const rows = await builder.execute() + const hasMore = rows.length > limit + const activities = hasMore ? rows.slice(0, limit) : rows + + const nextCursor = + hasMore && activities.length > 0 + ? String(activities[activities.length - 1].id) + : undefined + + return { activities, cursor: nextCursor } +} + +function buildActivityObject( + activityType: string, + previousStatus: string | null, +): { $type: string; [k: string]: unknown } { + const $type = `tools.ozone.report.defs#${activityType}` + if (previousStatus !== null) { + return { $type, previousStatus } + } + return { $type } +} + +export function formatActivityView( + activity: { + id: number + reportId: number + activityType: string + previousStatus: string | null + internalNote: string | null + publicNote: string | null + meta: unknown + isAutomated: boolean + createdBy: string + createdAt: string + }, + memberViews?: Map, +) { + return { + id: activity.id, + reportId: activity.reportId, + activity: buildActivityObject( + activity.activityType, + activity.previousStatus, + ), + internalNote: activity.internalNote ?? undefined, + publicNote: activity.publicNote ?? undefined, + meta: (activity.meta as Record) ?? undefined, + isAutomated: activity.isAutomated, + createdBy: activity.createdBy, + moderator: memberViews?.get(activity.createdBy), + createdAt: activity.createdAt, + } +} diff --git a/packages/ozone/src/report/handle-report-update.ts b/packages/ozone/src/report/handle-report-update.ts new file mode 100644 index 00000000000..658686372b6 --- /dev/null +++ b/packages/ozone/src/report/handle-report-update.ts @@ -0,0 +1,209 @@ +/** + * Pure, synchronous state-transition logic for reports. + * + * Every code path that changes a report's status or creates a report activity + * should call `handleReportUpdate` to determine the next status and the + * activity record to insert. This keeps the state machine in one place and + * decouples it from DB operations so it works for both single-row transactions + * and bulk updates. + */ + +// --------------------------------------------------------------------------- +// Error types — callers decide how to surface these (throw, skip, etc.) +// --------------------------------------------------------------------------- + +export class AlreadyInTargetState extends Error { + constructor( + public currentStatus: string, + public targetStatus: string, + ) { + super(`Report is already in '${targetStatus}' status`) + this.name = 'AlreadyInTargetState' + } +} + +export class InvalidStateTransition extends Error { + constructor( + public fromStatus: string, + public toStatus: string, + ) { + super(`Cannot transition report from '${fromStatus}' to '${toStatus}'`) + this.name = 'InvalidStateTransition' + } +} + +// --------------------------------------------------------------------------- +// State machine tables +// --------------------------------------------------------------------------- + +/** Valid state transitions: key = fromState, value = allowed toStates */ +export const VALID_TRANSITIONS: Record = { + open: ['closed', 'escalated', 'queued', 'assigned'], + closed: ['open'], + escalated: ['open', 'closed'], + queued: ['assigned', 'open'], + assigned: ['open', 'closed', 'escalated', 'queued'], +} + +/** Activity types that map to a specific target status */ +const ACTIVITY_TO_STATE: Record = { + queueActivity: 'queued', + assignmentActivity: 'assigned', + escalationActivity: 'escalated', + closeActivity: 'closed', + reopenActivity: 'open', +} + +/** Activity types that are only valid from specific source states */ +const ACTIVITY_VALID_FROM_STATES: Record = { + reopenActivity: ['closed'], +} + +/** Moderation event types → target status (+ activity type) */ +const EVENT_TYPE_MAP: Record = + { + 'tools.ozone.moderation.defs#modEventAcknowledge': { + status: 'closed', + activityType: 'closeActivity', + }, + 'tools.ozone.moderation.defs#modEventTakedown': { + status: 'closed', + activityType: 'closeActivity', + }, + 'tools.ozone.moderation.defs#modEventLabel': { + status: 'closed', + activityType: 'closeActivity', + }, + 'tools.ozone.moderation.defs#modEventComment': { + status: 'closed', + activityType: 'closeActivity', + }, + 'tools.ozone.moderation.defs#modEventEscalate': { + status: 'escalated', + activityType: 'escalationActivity', + }, + } + +// --------------------------------------------------------------------------- +// Action types — the three ways a report's status can change +// --------------------------------------------------------------------------- + +export type ReportUpdateAction = + | { type: 'activity'; activityType: string } + | { type: 'event'; eventType: string } + | { type: 'queue' } + +// --------------------------------------------------------------------------- +// Result type +// --------------------------------------------------------------------------- + +export type ActivityRecord = { + activityType: string + previousStatus: string +} + +export type ReportUpdateResult = { + nextStatus: string | null + activity: ActivityRecord | null +} + +// --------------------------------------------------------------------------- +// Core function +// --------------------------------------------------------------------------- + +/** + * Determines the next status and activity record for a report update. + * + * @throws AlreadyInTargetState if the report is already in the target status + * @throws InvalidStateTransition if the transition is not allowed + * @returns nextStatus (null = no change) and activity (null = nothing to record) + */ +export function handleReportUpdate( + currentStatus: string, + action: ReportUpdateAction, +): ReportUpdateResult { + switch (action.type) { + case 'activity': + return handleActivityAction(currentStatus, action.activityType) + case 'event': + return handleEventAction(currentStatus, action.eventType) + case 'queue': + return handleQueueAction(currentStatus) + } +} + +// --------------------------------------------------------------------------- +// Action handlers +// --------------------------------------------------------------------------- + +function handleActivityAction( + currentStatus: string, + activityType: string, +): ReportUpdateResult { + const toState = ACTIVITY_TO_STATE[activityType] ?? null + + // Note-type activities — no state change, but still produce an activity record + if (toState === null) { + return { nextStatus: null, activity: null } + } + + // Check activity-specific source-state constraints + const validFromStates = ACTIVITY_VALID_FROM_STATES[activityType] + if (validFromStates && !validFromStates.includes(currentStatus)) { + throw new InvalidStateTransition(currentStatus, toState) + } + + validateTransition(currentStatus, toState) + + return { + nextStatus: toState, + activity: { activityType, previousStatus: currentStatus }, + } +} + +function handleEventAction( + currentStatus: string, + eventType: string, +): ReportUpdateResult { + const mapping = EVENT_TYPE_MAP[eventType] + if (!mapping) { + // Event type doesn't affect report status + return { nextStatus: null, activity: null } + } + + validateTransition(currentStatus, mapping.status) + + return { + nextStatus: mapping.status, + activity: { + activityType: mapping.activityType, + previousStatus: currentStatus, + }, + } +} + +function handleQueueAction(currentStatus: string): ReportUpdateResult { + // Queue routing only transitions open → queued + if (currentStatus !== 'open') { + return { nextStatus: null, activity: null } + } + + return { + nextStatus: 'queued', + activity: { activityType: 'queueActivity', previousStatus: currentStatus }, + } +} + +// --------------------------------------------------------------------------- +// Shared validation +// --------------------------------------------------------------------------- + +function validateTransition(fromStatus: string, toStatus: string): void { + if (fromStatus === toStatus) { + throw new AlreadyInTargetState(fromStatus, toStatus) + } + const allowed = VALID_TRANSITIONS[fromStatus] ?? [] + if (!allowed.includes(toStatus)) { + throw new InvalidStateTransition(fromStatus, toStatus) + } +} diff --git a/packages/ozone/src/report/reassign.ts b/packages/ozone/src/report/reassign.ts new file mode 100644 index 00000000000..0e94d1cde68 --- /dev/null +++ b/packages/ozone/src/report/reassign.ts @@ -0,0 +1,109 @@ +import { InvalidRequestError } from '@atproto/xrpc-server' +import { Database } from '../db' +import { QueueService } from '../queue/service' + +export type ReassignReportQueueParams = { + reportId: number + toQueueId: number + comment?: string + createdBy: string +} + +export async function reassignReportQueue( + db: Database, + queueService: QueueService, + params: ReassignReportQueueParams, +): Promise { + const { reportId, toQueueId, comment, createdBy } = params + + if (toQueueId !== -1) { + const queue = await queueService.getById(toQueueId) + if (!queue) { + throw new InvalidRequestError( + `Queue ${toQueueId} not found`, + 'QueueNotFound', + ) + } + if (!queue.enabled) { + throw new InvalidRequestError( + `Queue ${toQueueId} is disabled`, + 'QueueDisabled', + ) + } + } + + await db.transaction(async (dbTxn) => { + const report = await dbTxn.db + .selectFrom('report') + .select(['id', 'status', 'queueId']) + .where('id', '=', reportId) + .forUpdate() + .executeTakeFirst() + + if (!report) { + throw new InvalidRequestError( + `Report ${reportId} not found`, + 'ReportNotFound', + ) + } + + if (report.status === 'closed') { + throw new InvalidRequestError( + `Report ${reportId} is closed and cannot be reassigned`, + 'ReportClosed', + ) + } + + // NULL and -1 both mean "unassigned" for equivalence purposes. + const currentQueueId = report.queueId ?? -1 + if (currentQueueId === toQueueId) { + throw new InvalidRequestError( + `Report ${reportId} is already in queue ${toQueueId}`, + 'AlreadyInTargetQueue', + ) + } + + const previousStatus = report.status + let nextStatus: string = previousStatus + if (toQueueId !== -1 && previousStatus === 'open') { + nextStatus = 'queued' + } else if (toQueueId === -1 && previousStatus === 'queued') { + nextStatus = 'open' + } + + const now = new Date().toISOString() + + const reportUpdate: Record = { + queueId: toQueueId, + queuedAt: toQueueId === -1 ? null : now, + updatedAt: now, + } + if (nextStatus !== previousStatus) { + reportUpdate.status = nextStatus + } + + await dbTxn.db + .updateTable('report') + .set(reportUpdate) + .where('id', '=', reportId) + .execute() + + await dbTxn.db + .insertInto('report_activity') + .values({ + reportId, + activityType: 'queueActivity', + previousStatus, + internalNote: comment ?? null, + publicNote: null, + meta: { + fromQueueId: report.queueId ?? null, + toQueueId, + }, + isAutomated: false, + createdBy, + createdAt: now, + }) + .execute() + }) +} diff --git a/packages/ozone/src/report/stats.ts b/packages/ozone/src/report/stats.ts new file mode 100644 index 00000000000..a0c94bbbc96 --- /dev/null +++ b/packages/ozone/src/report/stats.ts @@ -0,0 +1,850 @@ +import { Selectable, sql } from 'kysely' +import { MINUTE } from '@atproto/common' +import { Database } from '../db' +import { ComputedAtIdKeyset, paginate } from '../db/pagination' +import { ReportStat } from '../db/schema/report_stat' +import { jsonb } from '../db/types' +import { dbLogger } from '../logger' + +/** + * Grouped report types. Stats are computed per group rather than per individual report type. + */ +export const REPORT_TYPE_GROUPS: Record = { + Legacy: [ + 'com.atproto.moderation.defs#reasonSpam', + 'com.atproto.moderation.defs#reasonViolation', + 'com.atproto.moderation.defs#reasonMisleading', + 'com.atproto.moderation.defs#reasonSexual', + 'com.atproto.moderation.defs#reasonRude', + 'com.atproto.moderation.defs#reasonOther', + 'com.atproto.moderation.defs#reasonAppeal', + ], + Appeal: ['tools.ozone.report.defs#reasonAppeal'], + Violence: [ + 'tools.ozone.report.defs#reasonViolenceAnimalWelfare', + 'tools.ozone.report.defs#reasonViolenceThreats', + 'tools.ozone.report.defs#reasonViolenceGraphicContent', + 'tools.ozone.report.defs#reasonViolenceSelfHarm', + 'tools.ozone.report.defs#reasonViolenceGlorification', + 'tools.ozone.report.defs#reasonViolenceExtremistContent', + 'tools.ozone.report.defs#reasonViolenceTrafficking', + 'tools.ozone.report.defs#reasonViolenceOther', + ], + Sexual: [ + 'tools.ozone.report.defs#reasonSexualAbuseContent', + 'tools.ozone.report.defs#reasonSexualNCII', + 'tools.ozone.report.defs#reasonSexualSextortion', + 'tools.ozone.report.defs#reasonSexualDeepfake', + 'tools.ozone.report.defs#reasonSexualAnimal', + 'tools.ozone.report.defs#reasonSexualUnlabeled', + 'tools.ozone.report.defs#reasonSexualOther', + ], + 'Child Safety': [ + 'tools.ozone.report.defs#reasonChildSafetyCSAM', + 'tools.ozone.report.defs#reasonChildSafetyGroom', + 'tools.ozone.report.defs#reasonChildSafetyMinorPrivacy', + 'tools.ozone.report.defs#reasonChildSafetyEndangerment', + 'tools.ozone.report.defs#reasonChildSafetyHarassment', + 'tools.ozone.report.defs#reasonChildSafetyPromotion', + 'tools.ozone.report.defs#reasonChildSafetyOther', + ], + Harassment: [ + 'tools.ozone.report.defs#reasonHarassmentTroll', + 'tools.ozone.report.defs#reasonHarassmentTargeted', + 'tools.ozone.report.defs#reasonHarassmentHateSpeech', + 'tools.ozone.report.defs#reasonHarassmentDoxxing', + 'tools.ozone.report.defs#reasonHarassmentOther', + ], + Misleading: [ + 'tools.ozone.report.defs#reasonMisleadingBot', + 'tools.ozone.report.defs#reasonMisleadingImpersonation', + 'tools.ozone.report.defs#reasonMisleadingSpam', + 'tools.ozone.report.defs#reasonMisleadingScam', + 'tools.ozone.report.defs#reasonMisleadingSyntheticContent', + 'tools.ozone.report.defs#reasonMisleadingMisinformation', + 'tools.ozone.report.defs#reasonMisleadingOther', + ], + 'Rule Violations': [ + 'tools.ozone.report.defs#reasonRuleSiteSecurity', + 'tools.ozone.report.defs#reasonRuleStolenContent', + 'tools.ozone.report.defs#reasonRuleProhibitedSales', + 'tools.ozone.report.defs#reasonRuleBanEvasion', + 'tools.ozone.report.defs#reasonRuleOther', + ], + Civic: [ + 'tools.ozone.report.defs#reasonCivicElectoralProcess', + 'tools.ozone.report.defs#reasonCivicDisclosure', + 'tools.ozone.report.defs#reasonCivicInterference', + 'tools.ozone.report.defs#reasonCivicMisinformation', + 'tools.ozone.report.defs#reasonCivicImpersonation', + ], +} + +const REPORT_STAT_LIVE_TTL = 15 * MINUTE + +export type ReportStatsServiceCreator = (db: Database) => ReportStatsService + +export type ReportStatGroup = { + queueId: number | null + moderatorDid: string | null + reportTypes: string[] | null +} +export type AggregateStatistics = { + inboundCount: number + pendingCount: number + actionedCount: number + escalatedCount: number + actionRate: number + avgHandlingTimeSec?: number +} +export type QueueStatistics = { + inboundCount: number + pendingCount: number + actionedCount: number + escalatedCount: number + actionRate: number + avgHandlingTimeSec?: number +} +export type ModeratorStatistics = { + inboundCount: number + actionedCount: number + avgHandlingTimeSec?: number +} +export type ReportTypeStatistics = { + inboundCount: number + pendingCount: number + actionedCount: number + escalatedCount: number + actionRate: number + avgHandlingTimeSec?: number +} +export type ReportStatistics = + | QueueStatistics + | ModeratorStatistics + | AggregateStatistics + | ReportTypeStatistics + +// Batched query result types +type QueueCountRow = { + queueId: number | null + count: string +} +type QueueWindowRow = { + queueId: number | null + inboundCount: string + actionedCount: string + escalatedCount: string + handlingTimeSum: string | null + handlingTimeCount: string +} +type TypeCountRow = { + reportType: string + count: string +} +type TypeWindowRow = { + reportType: string + inboundCount: string + actionedCount: string + escalatedCount: string + handlingTimeSum: string | null + handlingTimeCount: string +} +type ModeratorWindowRow = { + did: string + inboundCount: string + actionedCount: string + handlingTimeSum: string | null + handlingTimeCount: string +} +type BatchedStats = { + queuePending: QueueCountRow[] + queueWindow: QueueWindowRow[] + typePending: TypeCountRow[] + typeWindow: TypeWindowRow[] + moderator: ModeratorWindowRow[] +} + +type UpsertRow = { + date: string + queueId: number | null + moderatorDid: string | null + reportTypes: string[] | null + inboundCount: number | null + pendingCount: number | null + actionedCount: number | null + escalatedCount: number | null + actionRate: number | null + avgHandlingTimeSec: number | null + computedAt: string +} + +export class ReportStatsService { + constructor(public db: Database) {} + + static creator(): ReportStatsServiceCreator { + return (db: Database) => new ReportStatsService(db) + } + + /** + * Compute stats for today and finalize yesterday if needed. + * Called periodically by the StatsComputer daemon. + */ + async materializeAll(opts?: { force?: boolean }): Promise { + try { + const start = Date.now() + const today = toDateString(new Date()) + const yesterday = toDateString(new Date(Date.now() - 24 * 60 * 60 * 1000)) + + // Always compute today's stats + await this.materializeDate(today, opts) + + // Finalize yesterday if its snapshot is missing or stale + if (!opts?.force) { + const yesterdayRow = await this.db.db + .selectFrom('report_stat') + .select('computedAt') + .where('date', '=', yesterday) + .orderBy('computedAt', 'desc') + .executeTakeFirst() + const endOfYesterday = new Date(`${yesterday}T23:59:59.999Z`).getTime() + if ( + !yesterdayRow || + new Date(yesterdayRow.computedAt).getTime() < endOfYesterday + ) { + await this.materializeDate(yesterday, { force: true }) + } + } else { + await this.materializeDate(yesterday, { force: true }) + } + + const duration = Date.now() - start + dbLogger.info({ duration }, 'report stats materialization completed') + } catch (err) { + dbLogger.error({ err }, 'report stats materialization errored') + } + } + + /** + * Compute stats for a specific date range. Used by the refreshStats endpoint. + */ + async refreshDateRange(opts: { + startDate: string + endDate: string + queueIds?: number[] + }): Promise { + const start = new Date(opts.startDate) + const end = new Date(opts.endDate) + + for (let d = new Date(start); d <= end; d.setUTCDate(d.getUTCDate() + 1)) { + const dateStr = toDateString(d) + if (opts.queueIds?.length) { + // Recompute only specific queue groups for this date + const batched = await this.computeBatchedStats(dateStr) + const rows: UpsertRow[] = [] + for (const queueId of opts.queueIds) { + const group: ReportStatGroup = { + queueId, + moderatorDid: null, + reportTypes: null, + } + const stats = this.resolveGroupStats(group, batched) + rows.push(this.buildUpsertRow(dateStr, group, stats)) + } + await this.bulkUpsert(rows) + } else { + await this.materializeDate(dateStr, { force: true }) + } + } + } + + /** Compute and write all groups for a single date. */ + private async materializeDate( + date: string, + opts?: { force?: boolean }, + ): Promise { + const groups = await this.enumerateGroups() + const batched = await this.computeBatchedStats(date) + const today = toDateString(new Date()) + const isToday = date === today + + // Batch the cache check so we don't issue one SELECT per group. + const existingByKey = !opts?.force + ? await this.fetchExistingStatsByKey(date) + : null + + const rows: UpsertRow[] = [] + for (const group of groups) { + try { + if (existingByKey) { + const cached = existingByKey.get(groupKey(group)) + if (cached) { + // Historical dates: never recompute. Today: recompute if stale. + if (!isToday) continue + const age = Date.now() - new Date(cached.computedAt).getTime() + if (age < REPORT_STAT_LIVE_TTL) continue + } + } + const stats = this.resolveGroupStats(group, batched) + rows.push(this.buildUpsertRow(date, group, stats)) + } catch (err) { + dbLogger.error( + { err, group, date }, + 'error preparing report stats group', + ) + } + } + + await this.bulkUpsert(rows) + } + + /** Fetch all stat rows for a date, keyed by groupKey for O(1) lookup. */ + private async fetchExistingStatsByKey( + date: string, + ): Promise>> { + const existing = await this.db.db + .selectFrom('report_stat') + .selectAll() + .where('date', '=', date) + .execute() + const map = new Map>() + for (const row of existing) { + map.set( + groupKey({ + queueId: row.queueId, + moderatorDid: row.moderatorDid, + reportTypes: row.reportTypes, + }), + row, + ) + } + return map + } + + /** List out the groups to compute stats for. */ + private async enumerateGroups(): Promise { + const groups: ReportStatGroup[] = [] + + const queues = await this.db.db + .selectFrom('report_queue') + .selectAll() + .where('enabled', '=', true) + .where('deletedAt', 'is', null) + .execute() + const members = await this.db.db + .selectFrom('member') + .select('did') + .where('disabled', '=', false) + .where('role', 'in', [ + 'tools.ozone.team.defs#roleAdmin', + 'tools.ozone.team.defs#roleModerator', + 'tools.ozone.team.defs#roleTriage', + ]) + .execute() + + // aggregate + groups.push({ queueId: null, moderatorDid: null, reportTypes: null }) + // per queue + for (const queue of queues) { + groups.push({ queueId: queue.id, moderatorDid: null, reportTypes: null }) + } + // unqueued + groups.push({ queueId: -1, moderatorDid: null, reportTypes: null }) + // per moderator + for (const member of members) { + groups.push({ + queueId: null, + moderatorDid: member.did, + reportTypes: null, + }) + } + // per report type group + for (const groupTypes of Object.values(REPORT_TYPE_GROUPS)) { + groups.push({ + queueId: null, + moderatorDid: null, + reportTypes: groupTypes, + }) + } + + return groups + } + + /** + * Run batched GROUP BY queries for a calendar date. + * Returns 5 result sets covering all group types. + */ + private async computeBatchedStats(date: string): Promise { + const dayStart = `${date}T00:00:00.000Z` + const dayEnd = `${nextDate(date)}T00:00:00.000Z` + + const [queuePending, aggregatePending] = await Promise.all([ + // Pending count is a snapshot of all non-closed reports at time of computation + this.db.db + .selectFrom('report') + .select(['queueId', sql`count(*)`.as('count')]) + .where('status', '!=', 'closed') + .where('queueId', 'is not', null) + .groupBy('queueId') + .execute(), + // Aggregate pending (includes all reports, even un-routed) + this.db.db + .selectFrom('report') + .select(sql`count(*)`.as('count')) + .where('status', '!=', 'closed') + .executeTakeFirst(), + ]) + + const queueWindow = await this.db.db + .selectFrom('report') + .select([ + 'queueId', + sql`count(*)`.as('inboundCount'), + sql`count(*) filter (where "status" = 'closed' and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'actionedCount', + ), + sql`count(*) filter (where "status" = 'escalated')`.as( + 'escalatedCount', + ), + sql`sum(extract(epoch from ("closedAt"::timestamp - "createdAt"::timestamp))) filter (where "status" = 'closed' and "closedAt" is not null and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'handlingTimeSum', + ), + sql`count(*) filter (where "status" = 'closed' and "closedAt" is not null and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'handlingTimeCount', + ), + ]) + .where('createdAt', '>=', dayStart) + .where('createdAt', '<', dayEnd) + .where('queueId', 'is not', null) + .groupBy('queueId') + .execute() + + // Aggregate windowed (includes all reports) + const aggregateWindow = await this.db.db + .selectFrom('report') + .select([ + sql`count(*)`.as('inboundCount'), + sql`count(*) filter (where "status" = 'closed' and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'actionedCount', + ), + sql`count(*) filter (where "status" = 'escalated')`.as( + 'escalatedCount', + ), + sql`sum(extract(epoch from ("closedAt"::timestamp - "createdAt"::timestamp))) filter (where "status" = 'closed' and "closedAt" is not null and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'handlingTimeSum', + ), + sql`count(*) filter (where "status" = 'closed' and "closedAt" is not null and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'handlingTimeCount', + ), + ]) + .where('createdAt', '>=', dayStart) + .where('createdAt', '<', dayEnd) + .executeTakeFirst() + + const typePending = await this.db.db + .selectFrom('report') + .select(['reportType', sql`count(*)`.as('count')]) + .where('status', '!=', 'closed') + .groupBy('reportType') + .execute() + + const typeWindow = await this.db.db + .selectFrom('report') + .select([ + 'reportType', + sql`count(*)`.as('inboundCount'), + sql`count(*) filter (where "status" = 'closed' and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'actionedCount', + ), + sql`count(*) filter (where "status" = 'escalated')`.as( + 'escalatedCount', + ), + sql`sum(extract(epoch from ("closedAt"::timestamp - "createdAt"::timestamp))) filter (where "status" = 'closed' and "closedAt" is not null and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'handlingTimeSum', + ), + sql`count(*) filter (where "status" = 'closed' and "closedAt" is not null and "closedAt" >= ${dayStart} and "closedAt" < ${dayEnd})`.as( + 'handlingTimeCount', + ), + ]) + .where('createdAt', '>=', dayStart) + .where('createdAt', '<', dayEnd) + .groupBy('reportType') + .execute() + + const moderator = await this.db.db + .selectFrom('report as r') + .innerJoin('moderator_assignment as ma', (join) => + join.onRef('ma.reportId', '=', 'r.id').on('ma.endAt', 'is', null), + ) + .select([ + 'ma.did', + sql`count(*)`.as('inboundCount'), + sql`count(*) filter (where r."status" = 'closed')`.as( + 'actionedCount', + ), + sql`sum(extract(epoch from (r."closedAt"::timestamp - ma."startAt"::timestamp))) filter (where r."status" = 'closed' and r."closedAt" is not null)`.as( + 'handlingTimeSum', + ), + sql`count(*) filter (where r."status" = 'closed' and r."closedAt" is not null)`.as( + 'handlingTimeCount', + ), + ]) + .where('r.createdAt', '>=', dayStart) + .where('r.createdAt', '<', dayEnd) + .groupBy('ma.did') + .execute() + + // Inject aggregate as a synthetic row with queueId=null so resolveQueueStats can find it + const allQueuePending: QueueCountRow[] = [ + ...queuePending, + { queueId: null, count: aggregatePending?.count ?? '0' }, + ] + const allQueueWindow: QueueWindowRow[] = aggregateWindow + ? [ + ...queueWindow, + { + queueId: null, + inboundCount: aggregateWindow.inboundCount, + actionedCount: aggregateWindow.actionedCount, + escalatedCount: aggregateWindow.escalatedCount, + handlingTimeSum: aggregateWindow.handlingTimeSum, + handlingTimeCount: aggregateWindow.handlingTimeCount, + }, + ] + : queueWindow + + return { + queuePending: allQueuePending, + queueWindow: allQueueWindow, + typePending, + typeWindow, + moderator, + } + } + + /** Resolve a single group's stats from batched query results (pure in-memory). */ + private resolveGroupStats( + group: ReportStatGroup, + batched: BatchedStats, + ): ReportStatistics { + if (group.moderatorDid) { + return this.resolveModeratorStats(group.moderatorDid, batched.moderator) + } + if (group.reportTypes !== null) { + return this.resolveReportTypeStats(group.reportTypes, batched) + } + return this.resolveQueueStats(group.queueId, batched) + } + + private resolveQueueStats( + queueId: number | null, + batched: BatchedStats, + ): AggregateStatistics | QueueStatistics { + // queueId=null is the synthetic aggregate row + const pending = batched.queuePending.find((r) => r.queueId === queueId) + const window = batched.queueWindow.find((r) => r.queueId === queueId) + + const pendingCount = num(pending?.count) + const inboundCount = num(window?.inboundCount) + const actionedCount = num(window?.actionedCount) + const escalatedCount = num(window?.escalatedCount) + const handlingTimeSum = Number(window?.handlingTimeSum ?? 0) + const handlingTimeCount = num(window?.handlingTimeCount) + const actionRate = + inboundCount > 0 ? Math.round((actionedCount / inboundCount) * 100) : 0 + const avgHandlingTimeSec = + handlingTimeCount > 0 + ? Math.round(handlingTimeSum / handlingTimeCount) + : undefined + + return { + inboundCount, + pendingCount, + actionedCount, + escalatedCount, + actionRate, + avgHandlingTimeSec, + } + } + + private resolveReportTypeStats( + reportTypes: string[], + batched: BatchedStats, + ): ReportTypeStatistics { + const types = new Set(reportTypes) + + const matchingPending = batched.typePending.filter((r) => + types.has(r.reportType), + ) + const matchingWindow = batched.typeWindow.filter((r) => + types.has(r.reportType), + ) + + const pendingCount = sumNum(matchingPending, 'count') + const inboundCount = sumNum(matchingWindow, 'inboundCount') + const actionedCount = sumNum(matchingWindow, 'actionedCount') + const escalatedCount = sumNum(matchingWindow, 'escalatedCount') + const handlingTimeSum = matchingWindow.reduce( + (sum, r) => sum + Number(r.handlingTimeSum ?? 0), + 0, + ) + const handlingTimeCount = sumNum(matchingWindow, 'handlingTimeCount') + + const actionRate = + inboundCount > 0 ? Math.round((actionedCount / inboundCount) * 100) : 0 + const avgHandlingTimeSec = + handlingTimeCount > 0 + ? Math.round(handlingTimeSum / handlingTimeCount) + : undefined + + return { + inboundCount, + pendingCount, + actionedCount, + escalatedCount, + actionRate, + avgHandlingTimeSec, + } + } + + private resolveModeratorStats( + moderatorDid: string, + rows: ModeratorWindowRow[], + ): ModeratorStatistics { + const row = rows.find((r) => r.did === moderatorDid) + + const inboundCount = num(row?.inboundCount) + const actionedCount = num(row?.actionedCount) + const handlingTimeCount = num(row?.handlingTimeCount) + const avgHandlingTimeSec = + handlingTimeCount > 0 && row?.handlingTimeSum + ? Math.round(Number(row.handlingTimeSum) / handlingTimeCount) + : undefined + + return { inboundCount, actionedCount, avgHandlingTimeSec } + } + + /** Build an upsert row from (date, group, stats). */ + private buildUpsertRow( + date: string, + group: ReportStatGroup, + stats: ReportStatistics, + ): UpsertRow { + const pendingCount = + 'pendingCount' in stats ? stats.pendingCount ?? null : null + const escalatedCount = + 'escalatedCount' in stats ? stats.escalatedCount ?? null : null + const actionRate = 'actionRate' in stats ? stats.actionRate ?? null : null + + return { + date, + queueId: group.queueId, + moderatorDid: group.moderatorDid, + reportTypes: group.reportTypes, + inboundCount: stats.inboundCount ?? null, + pendingCount, + actionedCount: stats.actionedCount ?? null, + escalatedCount, + actionRate, + avgHandlingTimeSec: stats.avgHandlingTimeSec ?? null, + computedAt: new Date().toISOString(), + } + } + + /** + * Wraps a DELETE+INSERT for each row in a single transaction so we pay one + * commit per cycle instead of one per group. NULL-aware WHERE clauses match + * the existing PG <15 NULL semantics without needing a unique index. + */ + private async bulkUpsert(rows: UpsertRow[]): Promise { + if (!rows.length) return + + await this.db.transaction(async (dbTxn) => { + for (const r of rows) { + let del = dbTxn.db.deleteFrom('report_stat').where('date', '=', r.date) + del = + r.queueId !== null + ? del.where('queueId', '=', r.queueId) + : del.where('queueId', 'is', null) + del = + r.moderatorDid !== null + ? del.where('moderatorDid', '=', r.moderatorDid) + : del.where('moderatorDid', 'is', null) + del = + r.reportTypes !== null + ? del.where( + sql`"reportTypes"::jsonb = ${jsonb(r.reportTypes)}::jsonb`, + ) + : del.where('reportTypes', 'is', null) + await del.execute() + + await dbTxn.db + .insertInto('report_stat') + .values({ + date: r.date, + queueId: r.queueId, + moderatorDid: r.moderatorDid, + reportTypes: r.reportTypes !== null ? jsonb(r.reportTypes) : null, + inboundCount: r.inboundCount, + pendingCount: r.pendingCount, + actionedCount: r.actionedCount, + escalatedCount: r.escalatedCount, + actionRate: r.actionRate, + avgHandlingTimeSec: r.avgHandlingTimeSec, + computedAt: r.computedAt, + }) + .execute() + } + }) + } + + // ─── Read methods ─── + + /** Get a single stat row for a date + group. */ + private async getStatForDate( + date: string, + group: ReportStatGroup, + ): Promise | undefined> { + let qb = this.db.db + .selectFrom('report_stat') + .selectAll() + .where('date', '=', date) + if (group.queueId !== null) { + qb = qb.where('queueId', '=', group.queueId) + } else { + qb = qb.where('queueId', 'is', null) + } + if (group.moderatorDid) { + qb = qb.where('moderatorDid', '=', group.moderatorDid) + } else { + qb = qb.where('moderatorDid', 'is', null) + } + if (group.reportTypes !== null) { + qb = qb.where( + sql`"reportTypes"::jsonb = ${jsonb(group.reportTypes)}::jsonb`, + ) + } else { + qb = qb.where('reportTypes', 'is', null) + } + return qb.executeTakeFirst() + } + + /** Get today's live stats for a group. */ + async getLiveStats( + group: ReportStatGroup, + ): Promise | undefined> { + const today = toDateString(new Date()) + return this.getStatForDate(today, group) + } + + /** Get live stats for multiple queues in a single query. */ + async getLiveStatsForQueues( + queueIds: number[], + ): Promise>> { + if (!queueIds.length) return new Map() + + const today = toDateString(new Date()) + const rows = await this.db.db + .selectFrom('report_stat') + .selectAll() + .where('date', '=', today) + .where('queueId', 'in', queueIds) + .where('moderatorDid', 'is', null) + .where('reportTypes', 'is', null) + .execute() + + const result = new Map>() + for (const row of rows) { + if (row.queueId !== null) { + result.set(row.queueId, row) + } + } + return result + } + + /** Get historical stats for a date range, paginated. */ + async getHistoricalStats(opts: { + group: ReportStatGroup + startDate?: string + endDate?: string + limit: number + cursor?: string + }): Promise<{ stats: Selectable[]; cursor?: string }> { + const { group, startDate, endDate, limit } = opts + const { queueId, moderatorDid, reportTypes } = group + const { ref } = this.db.db.dynamic + + let qb = this.db.db.selectFrom('report_stat').selectAll() + + if (queueId !== null) { + qb = qb.where('queueId', '=', queueId) + } else { + qb = qb.where('queueId', 'is', null) + } + if (moderatorDid) { + qb = qb.where('moderatorDid', '=', moderatorDid) + } else { + qb = qb.where('moderatorDid', 'is', null) + } + if (reportTypes !== null) { + qb = qb.where(sql`"reportTypes"::jsonb = ${jsonb(reportTypes)}::jsonb`) + } else { + qb = qb.where('reportTypes', 'is', null) + } + if (startDate) { + qb = qb.where('date', '>=', toDateString(new Date(startDate))) + } + if (endDate) { + qb = qb.where('date', '<=', toDateString(new Date(endDate))) + } + + const keyset = new ComputedAtIdKeyset(ref('computedAt'), ref('id')) + const paginatedBuilder = paginate(qb, { + limit, + cursor: opts.cursor, + keyset, + direction: 'desc', + tryIndex: true, + }) + + const stats = await paginatedBuilder.execute() + + return { stats, cursor: keyset.packFromResult(stats) } + } +} + +// ─── Helpers ─── + +/** Parse a pg bigint string to number, defaulting to 0. */ +function num(val: string | undefined | null): number { + return val ? Number(val) : 0 +} + +/** Sum a numeric string field across rows. */ +function sumNum(rows: T[], field: keyof T): number { + return rows.reduce((sum, r) => sum + Number(r[field] ?? 0), 0) +} + +/** + * Stable cache-key for a stat group. Used to look up an existing row in the + * batched cache map without issuing per-group SELECTs. Report types are + * stringified in stored order, which matches REPORT_TYPE_GROUPS. + */ +function groupKey(g: ReportStatGroup): string { + return [ + g.queueId ?? 'null', + g.moderatorDid ?? 'null', + g.reportTypes ? JSON.stringify(g.reportTypes) : 'null', + ].join('|') +} + +/** Convert a Date to an ISO date string (YYYY-MM-DD). */ +function toDateString(d: Date): string { + return d.toISOString().slice(0, 10) +} + +/** Get the next calendar date string. */ +function nextDate(dateStr: string): string { + const d = new Date(`${dateStr}T00:00:00.000Z`) + d.setUTCDate(d.getUTCDate() + 1) + return toDateString(d) +} diff --git a/packages/ozone/src/report/views.ts b/packages/ozone/src/report/views.ts new file mode 100644 index 00000000000..30a0e077e89 --- /dev/null +++ b/packages/ozone/src/report/views.ts @@ -0,0 +1,241 @@ +import { Selectable } from 'kysely' +import { + AppBskyActorDefs, + ToolsOzoneModerationDefs, + ToolsOzoneQueueDefs, + ToolsOzoneReportDefs, +} from '@atproto/api' +import { addAccountInfoToRepoViewDetail } from '../api/util' +import { ReportStat } from '../db/schema/report_stat' +import { AccountView } from '../lexicon/types/com/atproto/admin/defs' +import { + RecordViewDetail, + RepoView, +} from '../lexicon/types/tools/ozone/moderation/defs' +import { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs' +import { ReportWithEvent } from '../mod-service/report' +import { ParsedLabelers } from '../util' + +type ReportViews = { + repoDetails( + dids: string[], + labelers?: ParsedLabelers, + ): Promise> + recordDetails( + subjects: { uri: string }[], + labelers?: ParsedLabelers, + ): Promise> + getProfiles( + dids: string[], + ): Promise> +} + +export type HydratedReport = { + partialRepos: Map + accountInfo: Map + recordInfo: Map + profiles: Map + queues: Map + memberViews: Map +} + +export async function hydrateReportInfo( + reports: ReportWithEvent[], + views: ReportViews, + getAccountInfos: (dids: string[]) => Promise>, + getQueues: ( + queueIds: number[], + ) => Promise>, + getTeamMembers: (dids: string[]) => Promise>, + labelers: ParsedLabelers, +): Promise { + const dids = new Set() + const uris = new Set() + const queueIds = new Set() + const assignmentDids: string[] = [] + + for (const report of reports) { + dids.add(report.subjectDid) + dids.add(report.reportedBy) + if (report.subjectUri) uris.add(report.subjectUri) + if (report.queueId && report.queueId > 0) queueIds.add(report.queueId) + if (report.assignedTo) { + dids.add(report.assignedTo) + assignmentDids.push(report.assignedTo) + } + } + + const didsArray = Array.from(dids) + const [partialRepos, accountInfo, recordInfo, profiles, queues, memberViews] = + await Promise.all([ + views.repoDetails(didsArray, labelers), + getAccountInfos(didsArray), + views.recordDetails( + Array.from(uris).map((uri) => ({ uri })), + labelers, + ), + views.getProfiles(didsArray), + getQueues(Array.from(queueIds)), + getTeamMembers(assignmentDids), + ]) + + return { + partialRepos, + accountInfo, + recordInfo, + profiles, + queues, + memberViews, + } +} + +export function buildReportView( + report: ReportWithEvent, + hydrated: HydratedReport, + isModerator: boolean, + actions?: ToolsOzoneModerationDefs.ModEventView[], +) { + const { + partialRepos, + accountInfo, + recordInfo, + profiles, + queues, + memberViews, + } = hydrated + const isRecord = !!report.subjectUri + const did = report.subjectDid + const partialRepo = partialRepos.get(did) + const repo = partialRepo + ? addAccountInfoToRepoViewDetail( + partialRepo, + accountInfo.get(did) || null, + isModerator, + ) + : undefined + const profile = profiles.get(did) + const record = isRecord ? recordInfo.get(report.subjectUri!) : undefined + const status = isRecord + ? record?.moderation.subjectStatus + : repo?.moderation.subjectStatus + + const reportType = report.meta?.reportType as string + + const subject = isRecord ? report.subjectUri! : report.subjectDid + const subjectView = { + type: isRecord ? 'record' : 'account', + subject, + repo, + record, + profile: profile + ? { + $type: 'app.bsky.actor.defs#profileViewDetailed' as const, + ...profile, + } + : undefined, + status, + } + + const reporterDid = report.reportedBy + const reporterPartialRepo = partialRepos.get(reporterDid) + const reporterRepo = reporterPartialRepo + ? addAccountInfoToRepoViewDetail( + reporterPartialRepo, + accountInfo.get(reporterDid) || null, + isModerator, + ) + : undefined + const reporterProfile = profiles.get(reporterDid) + const reporterStatus = reporterRepo?.moderation.subjectStatus + + const reporterView = { + type: 'account', + subject: reporterDid, + repo: reporterRepo, + profile: reporterProfile + ? { + $type: 'app.bsky.actor.defs#profileViewDetailed' as const, + ...reporterProfile, + } + : undefined, + status: reporterStatus, + } + + const assignmentView = + report.assignedTo && report.assignedAt + ? { + did: report.assignedTo, + moderator: memberViews.get(report.assignedTo), + assignedAt: report.assignedAt, + } + : undefined + + return { + id: report.id, + eventId: report.eventId, + status: report.status, + subject: subjectView, + reportType, + reportedBy: report.reportedBy, + reporter: reporterView, + comment: report.comment ?? undefined, + createdAt: report.createdAt, + updatedAt: report.updatedAt, + queuedAt: report.queuedAt ?? undefined, + actionEventIds: + report.actionEventIds && Array.isArray(report.actionEventIds) + ? (report.actionEventIds as number[]) + : undefined, + actions: actions && actions.length ? actions : undefined, + actionNote: report.actionNote ?? undefined, + assignment: assignmentView, + queue: + report.queueId && report.queueId > 0 + ? queues.get(report.queueId) + : undefined, + isMuted: report.isMuted, + } +} + +export function viewQueueStats( + row?: Selectable, +): ToolsOzoneQueueDefs.QueueStats { + return { + pendingCount: row?.pendingCount ?? undefined, + actionedCount: row?.actionedCount ?? undefined, + escalatedCount: row?.escalatedCount ?? undefined, + inboundCount: row?.inboundCount ?? undefined, + actionRate: row?.actionRate ?? undefined, + avgHandlingTimeSec: row?.avgHandlingTimeSec ?? undefined, + lastUpdated: row?.computedAt, + } +} + +export function viewLiveStats( + row?: Selectable, +): ToolsOzoneReportDefs.LiveStats { + return { + pendingCount: row?.pendingCount ?? undefined, + actionedCount: row?.actionedCount ?? undefined, + escalatedCount: row?.escalatedCount ?? undefined, + inboundCount: row?.inboundCount ?? undefined, + actionRate: row?.actionRate ?? undefined, + avgHandlingTimeSec: row?.avgHandlingTimeSec ?? undefined, + lastUpdated: row?.computedAt, + } +} + +export function viewHistoricalStats( + row: Selectable, +): ToolsOzoneReportDefs.HistoricalStats { + return { + date: row.date, + computedAt: row.computedAt, + pendingCount: row.pendingCount ?? undefined, + actionedCount: row.actionedCount ?? undefined, + escalatedCount: row.escalatedCount ?? undefined, + inboundCount: row.inboundCount ?? undefined, + actionRate: row.actionRate ?? undefined, + avgHandlingTimeSec: row.avgHandlingTimeSec ?? undefined, + } +} diff --git a/packages/ozone/src/team/index.ts b/packages/ozone/src/team/index.ts index dcff042d144..f055dbae65e 100644 --- a/packages/ozone/src/team/index.ts +++ b/packages/ozone/src/team/index.ts @@ -267,6 +267,17 @@ export class TeamService { } while (lastDid) } + async viewByDids(dids: string[]): Promise> { + if (!dids.length) return new Map() + const members = await this.db.db + .selectFrom('member') + .selectAll() + .where('did', 'in', dids) + .execute() + const memberViews = await this.view(members) + return new Map(memberViews.map((m) => [m.did, m])) + } + async view(members: Selectable[]): Promise { const profiles = await this.getProfiles(members.map(({ did }) => did)) return members.map((member) => { diff --git a/packages/ozone/tests/get-report.test.ts b/packages/ozone/tests/get-report.test.ts new file mode 100644 index 00000000000..d115ea39072 --- /dev/null +++ b/packages/ozone/tests/get-report.test.ts @@ -0,0 +1,136 @@ +import AtpAgent from '@atproto/api' +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' +import { REASONSPAM } from '../src/lexicon/types/com/atproto/moderation/defs' + +describe('ozone-get-report', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + let modClient: ModeratorClient + + const modHeaders = async (nsid: string) => + network.ozone.modHeaders(nsid, 'admin') + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_get_report', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + it('returns a single report by id', async () => { + // Create a report on Alice's account + await sc.createReport({ + reasonType: REASONSPAM, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + reportedBy: sc.dids.bob, + }) + await network.processAll() + + // Fetch the report list to get the report ID + const { data: list } = await agent.tools.ozone.report.queryReports( + { status: 'open', subject: sc.dids.alice }, + { headers: await modHeaders(ids.ToolsOzoneReportQueryReports) }, + ) + expect(list.reports.length).toBeGreaterThan(0) + const reportId = list.reports[0].id + + // Fetch the single report by ID + const { data: report } = await agent.tools.ozone.report.getReport( + { id: reportId }, + { headers: await modHeaders(ids.ToolsOzoneReportGetReport) }, + ) + + expect(report.id).toBe(reportId) + expect(report.subject.type).toBe('account') + expect(report.subject.subject).toBe(sc.dids.alice) + expect(report.reportType).toBe('com.atproto.moderation.defs#reasonSpam') + expect(report.status).toBe('open') + }) + + it('hydrates actions for reports that have been actioned', async () => { + const bobsAccount = { + $type: 'com.atproto.admin.defs#repoRef' as const, + did: sc.dids.bob, + } + + await sc.createReport({ + reasonType: REASONSPAM, + subject: bobsAccount, + reportedBy: sc.dids.alice, + }) + await network.processAll() + + const { data: list } = await agent.tools.ozone.report.queryReports( + { status: 'open', subject: sc.dids.bob }, + { headers: await modHeaders(ids.ToolsOzoneReportQueryReports) }, + ) + const reportId = list.reports[0].id + + const event = await modClient.emitEvent({ + event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' }, + subject: bobsAccount, + reportAction: { + ids: [reportId], + note: 'Reviewed', + }, + }) + + const { data: report } = await agent.tools.ozone.report.getReport( + { id: reportId }, + { headers: await modHeaders(ids.ToolsOzoneReportGetReport) }, + ) + + expect(report.status).toBe('closed') + expect(report.actionEventIds).toEqual([event.id]) + expect(report.actions).toBeDefined() + expect(report.actions).toHaveLength(1) + expect(report.actions![0].id).toBe(event.id) + expect(report.actions![0].event.$type).toBe( + 'tools.ozone.moderation.defs#modEventAcknowledge', + ) + }) + + it('omits actions when the report has not been actioned', async () => { + await sc.createReport({ + reasonType: REASONSPAM, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportedBy: sc.dids.alice, + }) + await network.processAll() + + const { data: list } = await agent.tools.ozone.report.queryReports( + { status: 'open', subject: sc.dids.carol }, + { headers: await modHeaders(ids.ToolsOzoneReportQueryReports) }, + ) + const reportId = list.reports[0].id + + const { data: report } = await agent.tools.ozone.report.getReport( + { id: reportId }, + { headers: await modHeaders(ids.ToolsOzoneReportGetReport) }, + ) + + expect(report.actionEventIds).toBeFalsy() + expect(report.actions).toBeUndefined() + }) +}) diff --git a/packages/ozone/tests/query-reports.test.ts b/packages/ozone/tests/query-reports.test.ts new file mode 100644 index 00000000000..54f4930697a --- /dev/null +++ b/packages/ozone/tests/query-reports.test.ts @@ -0,0 +1,608 @@ +import { + ComAtprotoModerationDefs, + ToolsOzoneReportAssignModerator, + ToolsOzoneReportUnassignModerator, +} from '@atproto/api' +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { AtUri } from '@atproto/syntax' +import { ids } from '../src/lexicon/lexicons' +import { + REASONMISLEADING, + REASONSPAM, +} from '../src/lexicon/types/com/atproto/moderation/defs' + +describe('query-reports', () => { + let network: TestNetwork + let sc: SeedClient + let modClient: ModeratorClient + + const seedReports = async () => { + const bobsAccount = { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + } + const alicesAccount = { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + } + const bobsPost = { + $type: 'com.atproto.repo.strongRef', + uri: sc.posts[sc.dids.bob][0].ref.uriStr, + cid: sc.posts[sc.dids.bob][0].ref.cidStr, + } + const alicesPost = { + $type: 'com.atproto.repo.strongRef', + uri: sc.posts[sc.dids.alice][1].ref.uriStr, + cid: sc.posts[sc.dids.alice][1].ref.cidStr, + } + + // Create various reports + for (let i = 0; i < 3; i++) { + await sc.createReport({ + reasonType: i % 2 ? REASONSPAM : REASONMISLEADING, + reason: `Report ${i} on bob's account`, + subject: bobsAccount, + reportedBy: sc.dids.alice, + }) + } + + for (let i = 0; i < 2; i++) { + await sc.createReport({ + reasonType: REASONSPAM, + reason: `Report ${i} on alice's account`, + subject: alicesAccount, + reportedBy: sc.dids.bob, + }) + } + + await sc.createReport({ + reasonType: REASONSPAM, + reason: "Report on bob's post", + subject: bobsPost, + reportedBy: sc.dids.alice, + }) + + await sc.createReport({ + reasonType: REASONMISLEADING, + reason: "Report on alice's post", + subject: alicesPost, + reportedBy: sc.dids.bob, + }) + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_query_reports', + }) + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + await seedReports() + }) + + beforeEach(async () => { + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + describe('queryReports', () => { + it('returns all open reports when only status is provided', async () => { + const response = await modClient.queryReports({ status: 'open' }) + + // We created 7 reports total (3 on bob's account, 2 on alice's account, 1 on bob's post, 1 on alice's post) + expect(response.reports.length).toBe(7) + + // All reports should have required fields + response.reports.forEach((report) => { + expect(report.id).toBeDefined() + expect(report.eventId).toBeDefined() + expect(report.status).toBe('open') // All newly created reports should be open + expect(report.subject).toBeDefined() + expect(report.reportType).toBeDefined() + expect(report.reportedBy).toBeDefined() + expect(report.createdAt).toBeDefined() + }) + }) + + it('filters reports by subjectType (account)', async () => { + const response = await modClient.queryReports({ + status: 'open', + subjectType: 'account', + }) + + // Should return 5 account reports (3 on bob, 2 on alice) + expect(response.reports.length).toBe(5) + + // All subjects should be accounts (DIDs, not URIs) + response.reports.forEach((report) => { + expect(report.subject.type).toBe('account') + expect(report.subject.subject).toMatch(/^did:/) + }) + }) + + it('filters reports by subjectType (record)', async () => { + const response = await modClient.queryReports({ + status: 'open', + subjectType: 'record', + }) + + // Should return 2 record reports (1 on bob's post, 1 on alice's post) + expect(response.reports.length).toBe(2) + + // All subjects should be records (have URI) + response.reports.forEach((report) => { + expect(report.subject.type).toBe('record') + expect(report.subject.subject).toMatch(/^at:\/\//) + }) + }) + + it('filters reports by specific subject DID', async () => { + const response = await modClient.queryReports({ + status: 'open', + subject: sc.dids.bob, + }) + + // Should return 3 reports on bob's account + expect(response.reports.length).toBe(3) + + response.reports.forEach((report) => { + expect(report.subject.subject).toBe(sc.dids.bob) + }) + }) + + it('filters reports by did across account and record subjects', async () => { + // Bob has 3 account reports and 1 report on his post — 4 total tied to his DID + const response = await modClient.queryReports({ + status: 'open', + did: sc.dids.bob, + }) + + expect(response.reports.length).toBe(4) + + // Each returned report's subject should resolve to bob: + // - account subjects have subject === bob's DID + // - record subjects are at-uris hosted by bob's DID + response.reports.forEach((report) => { + if (report.subject.type === 'account') { + expect(report.subject.subject).toBe(sc.dids.bob) + } else { + const uri = new AtUri(report.subject.subject) + expect(uri.host).toBe(sc.dids.bob) + } + }) + + // Mix of subject types — 3 account, 1 record + const accountCount = response.reports.filter( + (r) => r.subject.type === 'account', + ).length + const recordCount = response.reports.filter( + (r) => r.subject.type === 'record', + ).length + expect(accountCount).toBe(3) + expect(recordCount).toBe(1) + }) + + it('filters reports by specific subject URI', async () => { + const bobsPostUri = sc.posts[sc.dids.bob][0].ref.uriStr + + const response = await modClient.queryReports({ + status: 'open', + subject: bobsPostUri, + }) + + // Should return 1 report on bob's post + expect(response.reports.length).toBe(1) + expect(response.reports[0].subject.subject).toBe(bobsPostUri) + }) + + it('filters reports by report type', async () => { + const spamResponse = await modClient.queryReports({ + status: 'open', + reportTypes: [REASONSPAM], + }) + + // Should return 4 spam reports + expect(spamResponse.reports.length).toBe(4) + spamResponse.reports.forEach((report) => { + expect(report.reportType).toBe(REASONSPAM) + }) + + const misleadingResponse = await modClient.queryReports({ + status: 'open', + reportTypes: [REASONMISLEADING], + }) + + // Should return 3 misleading reports + expect(misleadingResponse.reports.length).toBe(3) + misleadingResponse.reports.forEach((report) => { + expect(report.reportType).toBe(REASONMISLEADING) + }) + }) + + it('filters reports by collection', async () => { + const response = await modClient.queryReports({ + status: 'open', + collections: ['app.bsky.feed.post'], + }) + + // Should return 2 post reports + expect(response.reports.length).toBe(2) + + response.reports.forEach((report) => { + const uri = new AtUri(report.subject.subject) + expect(uri.collection).toBe('app.bsky.feed.post') + }) + }) + + it('filters reports by status', async () => { + const openResponse = await modClient.queryReports({ + status: 'open', + }) + + // All 7 reports should be open + expect(openResponse.reports.length).toBe(7) + openResponse.reports.forEach((report) => { + expect(report.status).toBe('open') + }) + + const closedResponse = await modClient.queryReports({ + status: 'closed', + }) + + // No reports should be closed yet + expect(closedResponse.reports.length).toBe(0) + }) + + it('supports pagination with limit and cursor', async () => { + const firstPage = await modClient.queryReports({ + status: 'open', + limit: 3, + }) + + expect(firstPage.reports.length).toBe(3) + expect(firstPage.cursor).toBeDefined() + + const secondPage = await modClient.queryReports({ + status: 'open', + limit: 3, + cursor: firstPage.cursor, + }) + + expect(secondPage.reports.length).toBe(3) + expect(secondPage.cursor).toBeDefined() + + // Reports should be different + const firstPageIds = new Set(firstPage.reports.map((r) => r.id)) + const secondPageIds = new Set(secondPage.reports.map((r) => r.id)) + const intersection = [...firstPageIds].filter((id) => + secondPageIds.has(id), + ) + expect(intersection.length).toBe(0) + }) + + it('sorts reports by createdAt descending by default', async () => { + const response = await modClient.queryReports({ status: 'open' }) + + // Check that reports are sorted by createdAt descending + for (let i = 0; i < response.reports.length - 1; i++) { + const current = new Date(response.reports[i].createdAt) + const next = new Date(response.reports[i + 1].createdAt) + expect(current.getTime()).toBeGreaterThanOrEqual(next.getTime()) + } + }) + + it('supports sorting by createdAt ascending', async () => { + const response = await modClient.queryReports({ + status: 'open', + sortField: 'createdAt', + sortDirection: 'asc', + }) + + // Check that reports are sorted by createdAt ascending + for (let i = 0; i < response.reports.length - 1; i++) { + const current = new Date(response.reports[i].createdAt) + const next = new Date(response.reports[i + 1].createdAt) + expect(current.getTime()).toBeLessThanOrEqual(next.getTime()) + } + }) + + it('includes subject details in report view', async () => { + const response = await modClient.queryReports({ + status: 'open', + limit: 1, + }) + + const report = response.reports[0] + + // Subject should have full details + expect(report.subject).toBeDefined() + expect(report.subject.type).toBeDefined() + expect(report.subject.subject).toBeDefined() + + // Should have either repo or record details + if (report.subject.type === 'account') { + expect(report.subject.repo).toBeDefined() + } else { + expect(report.subject.record).toBeDefined() + } + }) + + it('combines multiple filters correctly', async () => { + const response = await modClient.queryReports({ + status: 'open', + subjectType: 'account', + reportTypes: [REASONSPAM], + }) + + // Should return spam reports on accounts only + response.reports.forEach((report) => { + expect(report.subject.type).toBe('account') + expect(report.reportType).toBe(REASONSPAM) + }) + }) + }) + + describe('isMuted filtering', () => { + let mutedReporterReportId: number + let mutedSubjectReportId: number + + beforeAll(async () => { + // Mute carol as a reporter, then have carol file a report + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventMuteReporter', + durationInHours: 24, + }, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + }) + + await sc.createReport({ + reportedBy: sc.dids.carol, + reasonType: ComAtprotoModerationDefs.REASONMISLEADING, + reason: 'muted reporter report', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + }, + }) + + // Report rows are inserted asynchronously by the queue-router daemon — + // drain it before querying. + await network.processAll() + + // Find the report we just created (most recent) + const allReports = await modClient.queryReports({ + status: 'open', + isMuted: true, + }) + mutedReporterReportId = allReports.reports[0].id + + // Unmute carol so it doesn't affect other tests + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventUnmuteReporter', + }, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + }) + + // Mute alice as a subject, then have bob report alice + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventMute', + durationInHours: 24, + }, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + }) + + await sc.createReport({ + reportedBy: sc.dids.bob, + reasonType: ComAtprotoModerationDefs.REASONSPAM, + reason: 'muted subject report', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + }) + + // Report rows are inserted asynchronously by the queue-router daemon — + // drain it before querying. + await network.processAll() + + // Find the muted subject report + const mutedReports = await modClient.queryReports({ + status: 'open', + isMuted: true, + }) + mutedSubjectReportId = mutedReports.reports[0].id + }) + + it('marks reports as muted when reporter is muted', async () => { + const allMuted = await modClient.queryReports({ + status: 'open', + isMuted: true, + }) + const mutedReport = allMuted.reports.find( + (r) => r.id === mutedReporterReportId, + ) + expect(mutedReport).toBeDefined() + expect(mutedReport!.isMuted).toBe(true) + }) + + it('marks reports as muted when subject is muted', async () => { + const allMuted = await modClient.queryReports({ + status: 'open', + isMuted: true, + }) + const mutedReport = allMuted.reports.find( + (r) => r.id === mutedSubjectReportId, + ) + expect(mutedReport).toBeDefined() + expect(mutedReport!.isMuted).toBe(true) + }) + + it('excludes muted reports by default (isMuted=false)', async () => { + const response = await modClient.queryReports({ + status: 'open', + isMuted: false, + }) + response.reports.forEach((report) => { + expect(report.isMuted).toBe(false) + }) + // Should not contain our muted reports + const ids = response.reports.map((r) => r.id) + expect(ids).not.toContain(mutedReporterReportId) + expect(ids).not.toContain(mutedSubjectReportId) + }) + + it('returns only muted reports when isMuted=true', async () => { + const response = await modClient.queryReports({ + status: 'open', + isMuted: true, + }) + expect(response.reports.length).toBeGreaterThanOrEqual(2) + response.reports.forEach((report) => { + expect(report.isMuted).toBe(true) + }) + }) + + it('defaults to excluding muted reports when isMuted is not specified', async () => { + // The lexicon default for isMuted is false, so calling without it + // should behave the same as isMuted=false + const defaultReports = await modClient.queryReports({ status: 'open' }) + const explicitFalse = await modClient.queryReports({ + status: 'open', + isMuted: false, + }) + expect(defaultReports.reports.length).toBe(explicitFalse.reports.length) + defaultReports.reports.forEach((report) => { + expect(report.isMuted).toBe(false) + }) + }) + }) + + describe('assignedTo filtering', () => { + let assignedReportIds: number[] + + const assignReport = async ( + input: ToolsOzoneReportAssignModerator.InputSchema, + callerRole: 'admin' | 'moderator' | 'triage' = 'admin', + ) => { + const agent = network.ozone.getAgent() + const { data } = await agent.tools.ozone.report.assignModerator(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportAssignModerator, + callerRole, + ), + }) + return data + } + + const unassignReport = async ( + input: ToolsOzoneReportUnassignModerator.InputSchema, + callerRole: 'admin' | 'moderator' | 'triage' = 'admin', + ) => { + const agent = network.ozone.getAgent() + const { data } = await agent.tools.ozone.report.unassignModerator(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportUnassignModerator, + callerRole, + ), + }) + return data + } + + beforeAll(async () => { + // Get all current non-muted reports and permanently assign the first 2 + // The admin caller's own DID is used as the assignee (not the ozone service DID) + const allReports = await modClient.queryReports({ + status: 'open', + isMuted: false, + }) + assignedReportIds = allReports.reports.slice(0, 2).map((r) => r.id) + + for (const reportId of assignedReportIds) { + await assignReport({ reportId, isPermanent: true }) + } + }) + + it('filters reports by assignedTo DID', async () => { + const adminDid = network.ozone.adminAccnt.did + const response = await modClient.queryReports({ + status: 'assigned', + assignedTo: adminDid, + }) + + expect(response.reports.length).toBe(2) + const returnedIds = response.reports.map((r) => r.id) + expect(returnedIds).toEqual(expect.arrayContaining(assignedReportIds)) + + // Each returned report should have an assignment with the admin DID + response.reports.forEach((report) => { + expect(report.assignment).toBeDefined() + expect(report.assignment!.did).toBe(adminDid) + }) + }) + + it('returns empty when filtering by a DID with no assignments', async () => { + const response = await modClient.queryReports({ + status: 'assigned', + assignedTo: 'did:plc:nonexistent', + }) + + expect(response.reports.length).toBe(0) + }) + + it('combines assignedTo with status filter', async () => { + const adminDid = network.ozone.adminAccnt.did + const response = await modClient.queryReports({ + assignedTo: adminDid, + status: 'assigned', + }) + + // Permanently assigned reports should have status 'assigned' + expect(response.reports.length).toBe(2) + response.reports.forEach((report) => { + expect(report.status).toBe('assigned') + expect(report.assignment).toBeDefined() + expect(report.assignment!.did).toBe(adminDid) + }) + }) + + it('stops returning report after unassignment', async () => { + const adminDid = network.ozone.adminAccnt.did + const reportIdToUnassign = assignedReportIds[0] + + await unassignReport({ reportId: reportIdToUnassign }) + + const response = await modClient.queryReports({ + status: 'assigned', + assignedTo: adminDid, + }) + + const returnedIds = response.reports.map((r) => r.id) + expect(returnedIds).not.toContain(reportIdToUnassign) + // The other assigned report should still be there + expect(returnedIds).toContain(assignedReportIds[1]) + }) + }) +}) diff --git a/packages/ozone/tests/queue-assignment.test.ts b/packages/ozone/tests/queue-assignment.test.ts new file mode 100644 index 00000000000..838227bdd20 --- /dev/null +++ b/packages/ozone/tests/queue-assignment.test.ts @@ -0,0 +1,428 @@ +import AtpAgent, { + ToolsOzoneQueueAssignModerator, + ToolsOzoneQueueGetAssignments, + ToolsOzoneQueueUnassignModerator, +} from '@atproto/api' +import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' + +describe('queue', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + + let q1: number + let q2: number + let q3: number + + const assign = async ( + input: ToolsOzoneQueueAssignModerator.InputSchema, + callerRole: 'admin' | 'moderator' | 'triage' = 'moderator', + ) => { + const { data } = await agent.tools.ozone.queue.assignModerator(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneQueueAssignModerator, + callerRole, + ), + }) + return data + } + + const getAssignments = async ( + input: ToolsOzoneQueueGetAssignments.QueryParams, + callerRole: 'admin' | 'moderator' | 'triage' = 'moderator', + ) => { + const { data } = await agent.tools.ozone.queue.getAssignments(input, { + headers: await network.ozone.modHeaders( + ids.ToolsOzoneQueueGetAssignments, + callerRole, + ), + }) + return data + } + + const unassign = async ( + input: ToolsOzoneQueueUnassignModerator.InputSchema, + callerRole: 'admin' | 'moderator' | 'triage' = 'moderator', + ) => { + await agent.tools.ozone.queue.unassignModerator(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneQueueUnassignModerator, + callerRole, + ), + }) + } + + const clearAssignments = async () => { + await network.ozone.ctx.db.db.deleteFrom('moderator_assignment').execute() + } + + const createQueue = async (name: string, reportTypes: string[]) => { + const { data } = await agent.tools.ozone.queue.createQueue( + { + name, + subjectTypes: ['account'], + reportTypes, + }, + { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneQueueCreateQueue, + 'admin', + ), + }, + ) + return data + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'queue_assignment', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + await basicSeed(sc) + await network.processAll() + + // Clean up any leftover data from previous runs + await network.ozone.ctx.db.db.deleteFrom('moderator_assignment').execute() + await network.ozone.ctx.db.db.deleteFrom('report_queue').execute() + + // Seed queues and capture their actual IDs + const queue1 = await createQueue('Queue 1', [ + 'com.atproto.moderation.defs#reasonSpam', + ]) + const queue2 = await createQueue('Queue 2', [ + 'com.atproto.moderation.defs#reasonOther', + ]) + const queue3 = await createQueue('Queue 3', [ + 'com.atproto.moderation.defs#reasonMisleading', + ]) + q1 = queue1.queue.id + q2 = queue2.queue.id + q3 = queue3.queue.id + }) + + afterAll(async () => { + await network.close() + }) + + it('get active assignments', async () => { + await assign({ queueId: q1, did: network.ozone.adminAccnt.did }, 'admin') + const result = await getAssignments({ onlyActive: true }) + + expect(result.assignments.length).toBeGreaterThanOrEqual(1) + const queueIds = result.assignments.map((a) => a.queue.id) + expect(queueIds).toContain(q1) + }) + + it('filters assignments by queueId', async () => { + await assign( + { queueId: q1, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + + const result = await getAssignments({ + queueIds: [q1], + }) + + expect(result.assignments.length).toBeGreaterThanOrEqual(1) + expect(result.assignments[0].queue.id).toBe(q1) + }) + + it('filters assignments by dids', async () => { + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + await assign({ queueId: q1, did: sc.dids.carol }, 'admin') + + const result = await getAssignments({ + dids: [sc.dids.bob], + }) + + expect(result.assignments.length).toBeGreaterThanOrEqual(1) + }) + + it('get assignments for a user', async () => { + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + + const result = await getAssignments({ + dids: [sc.dids.bob], + }) + + expect(result.assignments.length).toBeGreaterThanOrEqual(1) + }) + + it('get active assignments for queue', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + const result = await getAssignments({ + queueIds: [q1], + onlyActive: true, + }) + expect(result.assignments.length).toBe(1) + }) + + it('get all assignments for queue', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.alice }, 'admin') + const result = await getAssignments({ + queueIds: [q1], + onlyActive: false, + }) + expect(result.assignments.length).toBe(1) + }) + + it('invalid queue ID throws error', async () => { + const p = assign( + { queueId: 9999, did: network.ozone.adminAccnt.did }, + 'admin', + ) + await expect(p).rejects.toThrow('Invalid queue') + }) + + describe('pagination', () => { + it('paginates assignments with limit', async () => { + await clearAssignments() + // Create assignments for multiple queues + await assign({ queueId: q1, did: sc.dids.alice }, 'admin') + await assign({ queueId: q2, did: sc.dids.alice }, 'admin') + await assign({ queueId: q3, did: sc.dids.alice }, 'admin') + + const firstPage = await getAssignments({ limit: 2 }) + expect(firstPage.assignments.length).toBe(2) + expect(firstPage.cursor).toBeDefined() + }) + + it('returns all results when limit exceeds total', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.alice }, 'admin') + await assign({ queueId: q2, did: sc.dids.alice }, 'admin') + + const result = await getAssignments({ limit: 50 }) + expect(result.assignments.length).toBe(2) + // Cursor always points to the last item returned, even when all results fit in one page + expect(result.cursor).toBeDefined() + }) + + it('fetches next page using cursor', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.alice }, 'admin') + await assign({ queueId: q2, did: sc.dids.bob }, 'admin') + await assign({ queueId: q3, did: sc.dids.carol }, 'admin') + + const firstPage = await getAssignments({ limit: 2 }) + expect(firstPage.assignments.length).toBe(2) + expect(firstPage.cursor).toBeDefined() + + const secondPage = await getAssignments({ + limit: 2, + cursor: firstPage.cursor, + }) + expect(secondPage.assignments.length).toBe(1) + // Cursor points to the last item returned; a subsequent fetch with this cursor would return 0 results + expect(secondPage.cursor).toBeDefined() + + // Ensure no overlap between pages + const firstPageIds = firstPage.assignments.map((a) => a.id) + const secondPageIds = secondPage.assignments.map((a) => a.id) + for (const id of secondPageIds) { + expect(firstPageIds).not.toContain(id) + } + }) + + it('returns all assignments across pages', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.alice }, 'admin') + await assign({ queueId: q2, did: sc.dids.bob }, 'admin') + await assign({ queueId: q3, did: sc.dids.carol }, 'admin') + + // Collect all assignments via pagination + const allAssignments: typeof firstPage.assignments = [] + let cursor: string | undefined + const firstPage = await getAssignments({ limit: 1 }) + allAssignments.push(...firstPage.assignments) + cursor = firstPage.cursor + + while (cursor) { + const page = await getAssignments({ limit: 1, cursor }) + allAssignments.push(...page.assignments) + cursor = page.cursor + } + + expect(allAssignments.length).toBe(3) + // Verify all unique + const ids = allAssignments.map((a) => a.id) + expect(new Set(ids).size).toBe(3) + }) + + it('applies filters alongside pagination', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.alice }, 'admin') + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + await assign({ queueId: q2, did: sc.dids.carol }, 'admin') + + const result = await getAssignments({ queueIds: [q1], limit: 1 }) + expect(result.assignments.length).toBe(1) + expect(result.assignments[0].queue.id).toBe(q1) + expect(result.cursor).toBeDefined() + + const nextPage = await getAssignments({ + queueIds: [q1], + limit: 1, + cursor: result.cursor, + }) + expect(nextPage.assignments.length).toBe(1) + expect(nextPage.assignments[0].queue.id).toBe(q1) + }) + }) + + describe('admin', () => { + it('should be able to assign self to a queue', async () => { + const assignment = await assign( + { queueId: q1, did: network.ozone.adminAccnt.did }, + 'admin', + ) + + expect(assignment.queue.id).toBe(q1) + expect(assignment.moderator?.did).toBe(network.ozone.adminAccnt.did) + + const assignments = await getAssignments({ onlyActive: true }, 'admin') + const queueIds = assignments.assignments.map((a) => a.queue.id) + expect(queueIds).toContain(q1) + }) + it('should be able to assign a mod to a queue', async () => { + const assignment = await assign( + { queueId: q1, did: sc.dids.bob }, + 'admin', + ) + + expect(assignment.queue.id).toBe(q1) + + const assignments = await getAssignments({ onlyActive: true }, 'admin') + const queueIds = assignments.assignments.map((a) => a.queue.id) + expect(queueIds).toContain(q1) + }) + it('should be able to assign multiple mods to a queue', async () => { + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + await assign({ queueId: q1, did: sc.dids.carol }, 'admin') + const assignments = await getAssignments( + { onlyActive: true, queueIds: [q1] }, + 'admin', + ) + expect(assignments.assignments.length).toBeGreaterThanOrEqual(2) + }) + }) + + describe('moderator', () => { + it('should be able to assign self to a queue', async () => { + const assignment = await assign( + { queueId: q1, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + + expect(assignment.queue.id).toBe(q1) + expect(assignment.moderator?.did).toBe(network.ozone.moderatorAccnt.did) + + const assignments = await getAssignments({ onlyActive: true }, 'admin') + const queueIds = assignments.assignments.map((a) => a.queue.id) + expect(queueIds).toContain(q1) + }) + it('should not be able to assign another user to a queue', async () => { + const p = assign( + { queueId: q1, did: network.ozone.adminAccnt.did }, + 'moderator', + ) + await expect(p).rejects.toThrow('Unauthorized') + }) + + it('assigns permanently with no endAt', async () => { + const assignment = await assign( + { queueId: q1, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + expect(assignment.endAt).toBeUndefined() + }) + }) + + describe('triage', () => { + it('should not be able to assign self to a queue', async () => { + const p = assign( + { queueId: q1, did: network.ozone.triageAccnt.did }, + 'triage', + ) + await expect(p).rejects.toThrow('Unauthorized') + }) + it('should not be able to assign another user to a queue', async () => { + const p = assign( + { queueId: q1, did: network.ozone.adminAccnt.did }, + 'triage', + ) + await expect(p).rejects.toThrow('Unauthorized') + }) + }) + + describe('unassign', () => { + it('moderator can unassign self and assignment becomes inactive', async () => { + await clearAssignments() + await assign( + { queueId: q1, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + + await unassign( + { queueId: q1, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + + const active = await getAssignments({ + queueIds: [q1], + dids: [network.ozone.moderatorAccnt.did], + onlyActive: true, + }) + expect(active.assignments.length).toBe(0) + }) + + it('admin can unassign another moderator', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + + await unassign({ queueId: q1, did: sc.dids.bob }, 'admin') + + const active = await getAssignments({ + queueIds: [q1], + dids: [sc.dids.bob], + onlyActive: true, + }) + expect(active.assignments.length).toBe(0) + }) + + it('moderator cannot unassign another user', async () => { + await clearAssignments() + await assign({ queueId: q1, did: sc.dids.bob }, 'admin') + + const p = unassign({ queueId: q1, did: sc.dids.bob }, 'moderator') + await expect(p).rejects.toThrow('Unauthorized') + }) + + it('triage cannot unassign', async () => { + await clearAssignments() + await assign({ queueId: q1, did: network.ozone.triageAccnt.did }, 'admin') + + const p = unassign( + { queueId: q1, did: network.ozone.triageAccnt.did }, + 'triage', + ) + await expect(p).rejects.toThrow('Unauthorized') + }) + + it('throws InvalidAssignment when no active assignment exists', async () => { + await clearAssignments() + const p = unassign( + { queueId: q1, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + await expect(p).rejects.toThrow('No active assignment') + }) + }) +}) diff --git a/packages/ozone/tests/queue-router.test.ts b/packages/ozone/tests/queue-router.test.ts new file mode 100644 index 00000000000..7d26e91967a --- /dev/null +++ b/packages/ozone/tests/queue-router.test.ts @@ -0,0 +1,306 @@ +import AtpAgent from '@atproto/api' +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' + +const REASON_SPAM = 'com.atproto.moderation.defs#reasonSpam' +const REASON_THREAT = 'tools.ozone.report.defs#reasonViolenceThreats' +const REASON_MISLEADING = 'com.atproto.moderation.defs#reasonMisleading' + +describe('queue-router', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + let modClient: ModeratorClient + + const modHeaders = (nsid: string) => network.ozone.modHeaders(nsid, 'admin') + + const createQueue = async (input: { + name: string + subjectTypes: string[] + reportTypes: string[] + collection?: string + }) => { + const { data } = await agent.tools.ozone.queue.createQueue(input, { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueCreateQueue), + }) + return data.queue + } + + const deleteQueue = async (queueId: number) => { + await agent.tools.ozone.queue.deleteQueue( + { queueId }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueDeleteQueue), + }, + ) + } + + // Creates a report event (account-level) directly via modClient for a given DID + reason + const reportAccount = async (did: string, reportType: string) => { + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventReport', + reportType, + comment: 'automated test report', + }, + subject: { $type: 'com.atproto.admin.defs#repoRef', did }, + }) + } + + // Creates a record-level report event via modClient + const reportRecord = async (uri: string, cid: string, reportType: string) => { + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventReport', + reportType, + comment: 'automated test report', + }, + subject: { $type: 'com.atproto.repo.strongRef', uri, cid }, + }) + } + + // Returns the most recent report for a subject using the queryReports API. + // Pass a DID for account subjects or an at:// URI for record subjects. + const queryLatestReportForSubject = async ( + subjectOrUri: string, + status: 'open' | 'closed' | 'escalated' | 'queued' | 'assigned' = 'queued', + ) => { + const { reports } = await modClient.queryReports({ + status, + subject: subjectOrUri, + }) + return reports[0] + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_queue_router', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + it('inserts report rows with no queue assignment when no queues are configured', async () => { + // This test intentionally runs before any queues are created. The daemon + // still inserts the report row (with queueId = -1) so the invariant + // "every modEventReport has a corresponding report row" holds. + await reportAccount(sc.dids.alice, REASON_SPAM) + + await network.ozone.daemon.ctx.queueRouter.routeReports() + + // Cursor advances past the processed event + const cursor = await network.ozone.daemon.ctx.queueRouter.getCursor() + expect(cursor).not.toBeNull() + expect(cursor!).toBeGreaterThan(0) + + // Report row exists with no queue (queueId = -1 surfaces as undefined) + const report = await queryLatestReportForSubject(sc.dids.alice, 'open') + expect(report).toBeDefined() + expect(report.queue).toBeUndefined() + }) + + describe('with queues configured', () => { + let spamAccountQueueId: number + let threatAccountQueueId: number + let spamPostQueueId: number + + beforeAll(async () => { + const [spamAccountQueue, threatAccountQueue, spamPostQueue] = + await Promise.all([ + createQueue({ + name: 'QR: Spam Accounts', + subjectTypes: ['account'], + reportTypes: [REASON_SPAM], + }), + createQueue({ + name: 'QR: Threat Accounts', + subjectTypes: ['account'], + reportTypes: [REASON_THREAT], + }), + createQueue({ + name: 'QR: Spam Posts', + subjectTypes: ['record'], + reportTypes: [REASON_SPAM], + collection: 'app.bsky.feed.post', + }), + ]) + spamAccountQueueId = spamAccountQueue.id + threatAccountQueueId = threatAccountQueue.id + spamPostQueueId = spamPostQueue.id + }) + + afterAll(async () => { + await Promise.all([ + deleteQueue(spamAccountQueueId).catch(() => {}), + deleteQueue(threatAccountQueueId).catch(() => {}), + deleteQueue(spamPostQueueId).catch(() => {}), + ]) + }) + + it('routes an account report to the matching queue', async () => { + await reportAccount(sc.dids.bob, REASON_SPAM) + + const beforeRouting = new Date() + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await queryLatestReportForSubject(sc.dids.bob) + expect(report).toBeDefined() + expect(report.queue?.id).toBe(spamAccountQueueId) + expect(new Date(report.queuedAt!).getTime()).toBeGreaterThanOrEqual( + beforeRouting.getTime(), + ) + }) + + it('routes a record report to the matching queue with collection filter', async () => { + const alicePost = sc.posts[sc.dids.alice][0] + const postUri = alicePost.ref.uriStr + const postCid = alicePost.ref.cidStr + + await reportRecord(postUri, postCid, REASON_SPAM) + + const beforeRouting = new Date() + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await queryLatestReportForSubject(postUri) + expect(report).toBeDefined() + expect(report.queue?.id).toBe(spamPostQueueId) + expect(new Date(report.queuedAt!).getTime()).toBeGreaterThanOrEqual( + beforeRouting.getTime(), + ) + }) + + it('routes a record report to a queue with null collection (matches all)', async () => { + // Create a catch-all record queue with no collection filter + const catchAllQueue = await createQueue({ + name: 'QR: All Records Threat', + subjectTypes: ['record'], + reportTypes: [REASON_THREAT], + }) + + // Use a different post than the collection-filter test to avoid subject overlap + const bobPost = sc.posts[sc.dids.bob][0] + const postUri = bobPost.ref.uriStr + const postCid = bobPost.ref.cidStr + + await reportRecord(postUri, postCid, REASON_THREAT) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await queryLatestReportForSubject(postUri) + expect(report).toBeDefined() + expect(report.queue?.id).toBe(catchAllQueue.id) + + // Clean up + await deleteQueue(catchAllQueue.id) + }) + + it('sets queueId to -1 for reports with no matching queue', async () => { + // REASON_MISLEADING has no configured queue + await reportAccount(sc.dids.carol, REASON_MISLEADING) + + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await queryLatestReportForSubject(sc.dids.carol, 'open') + expect(report).toBeDefined() + expect(report.queue).toBeUndefined() + expect(report.queuedAt).toBeUndefined() + }) + + it('skips unmatched reports (queueId = -1)', async () => { + // The previous test already set carol's report to queueId = -1 (REASON_MISLEADING) + const report = await queryLatestReportForSubject(sc.dids.carol, 'open') + expect(report).toBeDefined() + expect(report.queue).toBeUndefined() // queueId = -1 + + // Run the routing again + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const reportAfter = await queryLatestReportForSubject( + sc.dids.carol, + 'open', + ) + expect(reportAfter.queue).toBeUndefined() // still unmatched, was skipped + expect(reportAfter.id).toBe(report.id) // same report, unchanged + }) + + it('advances cursor so already-processed events are skipped on subsequent runs', async () => { + await reportAccount(sc.dids.dan, REASON_THREAT) + + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await queryLatestReportForSubject(sc.dids.dan) + expect(report).toBeDefined() + expect(report.queue?.id).toBe(threatAccountQueueId) + + const cursorAfterFirst = + await network.ozone.daemon.ctx.queueRouter.getCursor() + expect(cursorAfterFirst).not.toBeNull() + + // Delete the report row to simulate an unprocessed state — there is no + // API surface for this, so a direct DB write is necessary. The cursor + // (which points at the moderation_event id) stays past this event, so + // the daemon must not re-insert. + await network.ozone.daemon.ctx.db.db + .deleteFrom('report') + .where('id', '=', report.id) + .execute() + + // A second run must not reprocess the event because its id is below the cursor + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const reportAfterSecondRun = await queryLatestReportForSubject( + sc.dids.dan, + ) + // No report row should have been re-inserted + expect(reportAfterSecondRun).toBeUndefined() + + // Cursor unchanged — second run found nothing past it + const cursorAfterSecond = + await network.ozone.daemon.ctx.queueRouter.getCursor() + expect(cursorAfterSecond).toBe(cursorAfterFirst) + }) + + it('skips disabled queues when routing', async () => { + // Disable the threat queue and create the report concurrently + await Promise.all([ + agent.tools.ozone.queue.updateQueue( + { queueId: threatAccountQueueId, enabled: false }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueUpdateQueue), + }, + ), + reportAccount(sc.dids.alice, REASON_THREAT), + ]) + + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await queryLatestReportForSubject(sc.dids.alice, 'open') + expect(report).toBeDefined() + // Threat queue is disabled, so no match → queue is absent + expect(report.queue).toBeUndefined() + + // Re-enable the queue for subsequent tests + await agent.tools.ozone.queue.updateQueue( + { queueId: threatAccountQueueId, enabled: true }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueUpdateQueue), + }, + ) + }) + }) +}) diff --git a/packages/ozone/tests/queues.test.ts b/packages/ozone/tests/queues.test.ts new file mode 100644 index 00000000000..0d40b6c5095 --- /dev/null +++ b/packages/ozone/tests/queues.test.ts @@ -0,0 +1,690 @@ +import AtpAgent from '@atproto/api' +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' + +describe('ozone-queues', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + let modClient: ModeratorClient + + const modHeaders = async (nsid: string) => + network.ozone.modHeaders(nsid, 'admin') + + const triageHeaders = async (nsid: string) => + network.ozone.modHeaders(nsid, 'triage') + + const createQueue = async ( + input: { + name: string + subjectTypes: string[] + reportTypes: string[] + collection?: string + description?: string + }, + role: 'admin' | 'triage' = 'admin', + ) => { + const headers = + role === 'triage' + ? await triageHeaders(ids.ToolsOzoneQueueCreateQueue) + : await modHeaders(ids.ToolsOzoneQueueCreateQueue) + return agent.tools.ozone.queue.createQueue(input, { + encoding: 'application/json', + headers, + }) + } + + const deleteQueue = async ( + queueId: number, + options: { migrateToQueueId?: number; role?: 'admin' | 'triage' } = {}, + ) => { + const { migrateToQueueId, role = 'admin' } = options + const headers = + role === 'triage' + ? await triageHeaders(ids.ToolsOzoneQueueDeleteQueue) + : await modHeaders(ids.ToolsOzoneQueueDeleteQueue) + return agent.tools.ozone.queue.deleteQueue( + { + queueId, + ...(migrateToQueueId !== undefined ? { migrateToQueueId } : {}), + }, + { + encoding: 'application/json', + headers, + }, + ) + } + + const listQueues = async (params?: { + enabled?: boolean + subjectType?: string + collection?: string + reportTypes?: string[] + limit?: number + cursor?: string + }) => { + const { data } = await agent.tools.ozone.queue.listQueues(params, { + headers: await modHeaders(ids.ToolsOzoneQueueListQueues), + }) + return data + } + + const updateQueue = async ( + input: { + queueId: number + name?: string + enabled?: boolean + description?: string + }, + role: 'admin' | 'triage' = 'admin', + ) => { + const headers = + role === 'triage' + ? await triageHeaders(ids.ToolsOzoneQueueUpdateQueue) + : await modHeaders(ids.ToolsOzoneQueueUpdateQueue) + return agent.tools.ozone.queue.updateQueue(input, { + encoding: 'application/json', + headers, + }) + } + + const cleanupQueues = async (ids: number[]) => { + await Promise.all(ids.map((id) => deleteQueue(id).catch(() => {}))) + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_queues', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + describe('createQueue', () => { + const createdIds: number[] = [] + + afterEach(async () => { + await cleanupQueues(createdIds.splice(0)) + }) + + it('creates a queue successfully', async () => { + const { data } = await createQueue({ + name: 'CQ: Spam Accounts', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + }) + createdIds.push(data.queue.id) + + expect(data.queue.name).toBe('CQ: Spam Accounts') + expect(data.queue.subjectTypes).toEqual(['account']) + expect(data.queue.reportTypes).toEqual([ + 'com.atproto.moderation.defs#reasonSpam', + ]) + expect(data.queue.enabled).toBe(true) + expect(data.queue.id).toBeDefined() + expect(data.queue.createdBy).toBeDefined() + expect(data.queue.createdAt).toBeDefined() + expect(data.queue.updatedAt).toBeDefined() + expect(data.queue.stats).toBeDefined() + }) + + it('creates a queue with description', async () => { + const { data } = await createQueue({ + name: 'CQ: Described Queue', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + description: 'Handles spam account reports', + }) + createdIds.push(data.queue.id) + + expect(data.queue.description).toBe('Handles spam account reports') + }) + + it('creates a queue with collection filter', async () => { + const { data } = await createQueue({ + name: 'CQ: Post Spam', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + collection: 'app.bsky.feed.post', + }) + createdIds.push(data.queue.id) + + expect(data.queue.collection).toBe('app.bsky.feed.post') + }) + + it('rejects creation by non-moderator', async () => { + await expect( + createQueue( + { + name: 'CQ: Unauthorized Queue', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + }, + 'triage', + ), + ).rejects.toThrow() + }) + + it('rejects conflicting queue - same subject type and report type', async () => { + const { data: q1 } = await createQueue({ + name: 'CQ: Threat Accounts', + subjectTypes: ['account'], + reportTypes: ['tools.ozone.report.defs#reasonViolenceThreats'], + }) + createdIds.push(q1.queue.id) + + await expect( + createQueue({ + name: 'CQ: Threat Accounts Duplicate', + subjectTypes: ['account'], + reportTypes: ['tools.ozone.report.defs#reasonViolenceThreats'], + }), + ).rejects.toMatchObject({ error: 'ConflictingQueue' }) + }) + + it('rejects conflicting queue - partial overlap in subject types', async () => { + const { data: q1 } = await createQueue({ + name: 'CQ: Spam Account Only', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonOther'], + }) + createdIds.push(q1.queue.id) + + // 'account' overlaps, same collection (null), 'reasonOther' overlaps = conflict + await expect( + createQueue({ + name: 'CQ: Spam All', + subjectTypes: ['account', 'record'], + reportTypes: ['com.atproto.moderation.defs#reasonOther'], + }), + ).rejects.toMatchObject({ error: 'ConflictingQueue' }) + }) + + it('rejects conflicting queue - partial overlap in report types', async () => { + const { data: q1 } = await createQueue({ + name: 'CQ: Mixed Reports', + subjectTypes: ['account'], + reportTypes: [ + 'tools.ozone.report.defs#reasonViolenceThreats', + 'com.atproto.moderation.defs#reasonMisleading', + ], + }) + createdIds.push(q1.queue.id) + + // threat overlaps = conflict + await expect( + createQueue({ + name: 'CQ: Just Threat', + subjectTypes: ['account'], + reportTypes: ['tools.ozone.report.defs#reasonViolenceThreats'], + }), + ).rejects.toMatchObject({ error: 'ConflictingQueue' }) + }) + + it('allows non-conflicting queues with same report type but different collection', async () => { + const { data: q1 } = await createQueue({ + name: 'CQ: Spam Posts', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + collection: 'app.bsky.feed.post', + }) + createdIds.push(q1.queue.id) + + // Different collection = no conflict + const { data: q2 } = await createQueue({ + name: 'CQ: Spam Feeds', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + collection: 'app.bsky.feed.generator', + }) + createdIds.push(q2.queue.id) + + expect(q2.queue.name).toBe('CQ: Spam Feeds') + }) + + it('allows non-conflicting queues with same report type but different subject type', async () => { + const { data: q1 } = await createQueue({ + name: 'CQ: Record Sexual', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSexual'], + collection: 'app.bsky.feed.post', + }) + createdIds.push(q1.queue.id) + + // account vs record = different subject type with collection distinction = no conflict + const { data: q2 } = await createQueue({ + name: 'CQ: Account Sexual', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSexual'], + }) + createdIds.push(q2.queue.id) + + expect(q2.queue.name).toBe('CQ: Account Sexual') + }) + }) + + describe('listQueues', () => { + let queueIds: number[] = [] + + beforeAll(async () => { + const q1 = await createQueue({ + name: 'LQ: Spam', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + }) + const q2 = await createQueue({ + name: 'LQ: Threat', + subjectTypes: ['account'], + reportTypes: ['tools.ozone.report.defs#reasonViolenceThreats'], + }) + const q3 = await createQueue({ + name: 'LQ: Sexual Posts', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSexual'], + collection: 'app.bsky.feed.post', + }) + queueIds = [q1.data.queue.id, q2.data.queue.id, q3.data.queue.id] + }) + + afterAll(async () => { + await cleanupQueues(queueIds) + }) + + it('returns all queues', async () => { + const result = await listQueues() + expect(result.queues.length).toBeGreaterThanOrEqual(3) + // Verify our 3 queues are present + const ourIds = new Set(queueIds) + const found = result.queues.filter((q) => ourIds.has(q.id)) + expect(found.length).toBe(3) + }) + + it('limits the number of returned queues', async () => { + const result = await listQueues({ limit: 2 }) + expect(result.queues.length).toBe(2) + expect(result.cursor).toBeDefined() + }) + + it('paginates correctly', async () => { + const firstPage = await listQueues({ limit: 2 }) + expect(firstPage.queues.length).toBe(2) + expect(firstPage.cursor).toBeDefined() + + const secondPage = await listQueues({ + cursor: firstPage.cursor, + limit: 2, + }) + expect(secondPage.queues.length).toBeGreaterThanOrEqual(1) + + // No overlap between pages + const firstPageIds = firstPage.queues.map((q) => q.id) + const secondPageIds = secondPage.queues.map((q) => q.id) + expect(firstPageIds.some((id) => secondPageIds.includes(id))).toBe(false) + }) + + it('filters by enabled status', async () => { + await updateQueue({ queueId: queueIds[0], enabled: false }) + + const enabledQueues = await listQueues({ enabled: true }) + const disabledQueues = await listQueues({ enabled: false }) + + expect(enabledQueues.queues.every((q) => q.enabled)).toBe(true) + expect(disabledQueues.queues.every((q) => !q.enabled)).toBe(true) + expect(disabledQueues.queues.some((q) => q.id === queueIds[0])).toBe(true) + + // Re-enable + await updateQueue({ queueId: queueIds[0], enabled: true }) + }) + + it('filters by subjectType, collection, and reportTypes', async () => { + // q3 is the only record+post+sexual queue + const bySubjectType = await listQueues({ subjectType: 'record' }) + expect( + bySubjectType.queues.every((q) => q.subjectTypes.includes('record')), + ).toBe(true) + expect(bySubjectType.queues.some((q) => q.id === queueIds[2])).toBe(true) + expect(bySubjectType.queues.some((q) => q.id === queueIds[0])).toBe(false) + + const byCollection = await listQueues({ + collection: 'app.bsky.feed.post', + }) + expect( + byCollection.queues.every((q) => q.collection === 'app.bsky.feed.post'), + ).toBe(true) + expect(byCollection.queues.some((q) => q.id === queueIds[2])).toBe(true) + expect(byCollection.queues.some((q) => q.id === queueIds[0])).toBe(false) + + const byReportTypes = await listQueues({ + reportTypes: [ + 'com.atproto.moderation.defs#reasonSexual', + 'com.atproto.moderation.defs#reasonSpam', + ], + }) + // q1 (spam) and q3 (sexual) should appear, q2 (threat) should not + expect(byReportTypes.queues.some((q) => q.id === queueIds[0])).toBe(true) + expect(byReportTypes.queues.some((q) => q.id === queueIds[2])).toBe(true) + expect(byReportTypes.queues.some((q) => q.id === queueIds[1])).toBe(false) + + // All three combined — only q3 matches + const combined = await listQueues({ + subjectType: 'record', + collection: 'app.bsky.feed.post', + reportTypes: ['com.atproto.moderation.defs#reasonSexual'], + }) + expect(combined.queues.length).toBe(1) + expect(combined.queues[0].id).toBe(queueIds[2]) + }) + + it('returns queue stats', async () => { + await modClient.computeStats() + const result = await listQueues() + for (const queue of result.queues) { + expect(queue.stats).toBeDefined() + expect(typeof queue.stats.pendingCount).toBe('number') + expect(typeof queue.stats.actionedCount).toBe('number') + expect(typeof queue.stats.escalatedCount).toBe('number') + } + }) + }) + + describe('updateQueue', () => { + let testQueueId: number + + beforeEach(async () => { + const { data } = await createQueue({ + name: 'UQ: Test Queue', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonOther'], + }) + testQueueId = data.queue.id + }) + + afterEach(async () => { + await deleteQueue(testQueueId).catch(() => {}) + }) + + it('updates queue name', async () => { + const { data } = await updateQueue({ + queueId: testQueueId, + name: 'UQ: Updated Name', + }) + expect(data.queue.name).toBe('UQ: Updated Name') + expect(data.queue.id).toBe(testQueueId) + }) + + it('updates queue enabled status', async () => { + const { data } = await updateQueue({ + queueId: testQueueId, + enabled: false, + }) + expect(data.queue.enabled).toBe(false) + + const { data: reEnabled } = await updateQueue({ + queueId: testQueueId, + enabled: true, + }) + expect(reEnabled.queue.enabled).toBe(true) + }) + + it('updates queue description', async () => { + const { data } = await updateQueue({ + queueId: testQueueId, + description: 'Updated description', + }) + expect(data.queue.description).toBe('Updated description') + }) + + it('updates both name and enabled status', async () => { + const { data } = await updateQueue({ + queueId: testQueueId, + name: 'UQ: New Name', + enabled: false, + }) + expect(data.queue.name).toBe('UQ: New Name') + expect(data.queue.enabled).toBe(false) + }) + + it('rejects update by non-moderator', async () => { + await expect( + updateQueue({ queueId: testQueueId, name: 'Should Fail' }, 'triage'), + ).rejects.toThrow() + }) + + it('returns error for non-existent queue', async () => { + await expect( + updateQueue({ queueId: 999999, name: 'Ghost Queue' }), + ).rejects.toThrow() + }) + }) + + describe('deleteQueue', () => { + it('deletes a queue', async () => { + const { data: created } = await createQueue({ + name: 'DQ: Queue To Delete', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + }) + + const { data } = await deleteQueue(created.queue.id) + expect(data.deleted).toBe(true) + + // Verify it's gone from list + const listResult = await listQueues() + expect(listResult.queues.some((q) => q.id === created.queue.id)).toBe( + false, + ) + }) + + it('returns error for non-existent queue', async () => { + await expect(deleteQueue(999999)).rejects.toThrow() + }) + + it('rejects deletion by non-moderator', async () => { + const { data: created } = await createQueue({ + name: 'DQ: Auth Test Queue', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonMisleading'], + }) + + await expect( + deleteQueue(created.queue.id, { role: 'triage' }), + ).rejects.toThrow() + + // Clean up + await deleteQueue(created.queue.id) + }) + + it('accepts a valid migrateToQueueId', async () => { + const { data: qA } = await createQueue({ + name: 'DQ: Migrate Source', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + collection: 'app.bsky.feed.post', + }) + const { data: qB } = await createQueue({ + name: 'DQ: Migrate Target', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonSexual'], + collection: 'app.bsky.feed.post', + }) + + const { data } = await deleteQueue(qA.queue.id, { + migrateToQueueId: qB.queue.id, + }) + expect(data.deleted).toBe(true) + expect(data.reportsMigrated).toBe(0) + + // Clean up + await deleteQueue(qB.queue.id) + }) + + it('rejects migrateToQueueId when target does not exist', async () => { + const { data: created } = await createQueue({ + name: 'DQ: Bad Migration Source', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSexual'], + }) + + await expect( + deleteQueue(created.queue.id, { migrateToQueueId: 999999 }), + ).rejects.toThrow() + + // Clean up + await deleteQueue(created.queue.id) + }) + }) + + describe('report migration on delete', () => { + const REASON_SPAM = 'com.atproto.moderation.defs#reasonSpam' + const REASON_THREAT = 'tools.ozone.report.defs#reasonViolenceThreats' + + const reportAccount = async (did: string, reportType: string) => { + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventReport', + reportType, + comment: 'test report', + }, + subject: { $type: 'com.atproto.admin.defs#repoRef', did }, + }) + } + + const queryLatestReportForSubject = async ( + subjectOrUri: string, + status: + | 'open' + | 'closed' + | 'escalated' + | 'queued' + | 'assigned' = 'queued', + ) => { + const { reports } = await modClient.queryReports({ + status, + subject: subjectOrUri, + }) + return reports[0] + } + + it('migrates non-closed reports to the target queue', async () => { + const [{ data: qAData }, { data: qBData }] = await Promise.all([ + createQueue({ + name: 'M: Spam Accounts', + subjectTypes: ['account'], + reportTypes: [REASON_SPAM], + }), + createQueue({ + name: 'M: Threat Accounts', + subjectTypes: ['account'], + reportTypes: [REASON_THREAT], + }), + ]) + + await reportAccount(sc.dids.alice, REASON_SPAM) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const { data } = await deleteQueue(qAData.queue.id, { + migrateToQueueId: qBData.queue.id, + }) + expect(data.deleted).toBe(true) + expect(data.reportsMigrated).toBe(1) + + const report = await queryLatestReportForSubject(sc.dids.alice) + expect(report.queue?.id).toBe(qBData.queue.id) + expect(report.queuedAt).toBeDefined() + + // Clean up + await deleteQueue(qBData.queue.id) + }) + + it('moves non-closed reports to -1 when no target is specified', async () => { + const { + data: { queue }, + } = await createQueue({ + name: 'M: Spam No Target', + subjectTypes: ['account'], + reportTypes: [REASON_SPAM], + }) + + await reportAccount(sc.dids.bob, REASON_SPAM) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const { data } = await deleteQueue(queue.id) + expect(data.deleted).toBe(true) + expect(data.reportsMigrated).toBe(1) + + const report = await queryLatestReportForSubject(sc.dids.bob) + expect(report.queue).toBeUndefined() + expect(report.queuedAt).toBeUndefined() + }) + + it('does not migrate closed reports', async () => { + const { + data: { queue }, + } = await createQueue({ + name: 'M: Spam Closed', + subjectTypes: ['account'], + reportTypes: [REASON_SPAM], + }) + + await reportAccount(sc.dids.carol, REASON_SPAM) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const reportBefore = await queryLatestReportForSubject(sc.dids.carol) + expect(reportBefore.queue?.id).toBe(queue.id) + + // Close the report directly — no API surface for setting status in tests + await network.ozone.daemon.ctx.db.db + .updateTable('report') + .set({ status: 'closed' }) + .where('id', '=', reportBefore.id) + .execute() + + const { data } = await deleteQueue(queue.id) + expect(data.deleted).toBe(true) + expect(data.reportsMigrated).toBe(0) + + // Closed report remains assigned to the soft-deleted queue for historical reference + const reportAfter = await queryLatestReportForSubject( + sc.dids.carol, + 'closed', + ) + expect(reportAfter.queue?.id).toBe(queue.id) + }) + + it('allows creating a queue with the same name and config after soft delete', async () => { + const { + data: { queue: original }, + } = await createQueue({ + name: 'M: Reusable Config', + subjectTypes: ['account'], + reportTypes: [REASON_THREAT], + }) + await deleteQueue(original.id) + + // Same name and config should be allowed once the original is soft-deleted + const { + data: { queue: replacement }, + } = await createQueue({ + name: 'M: Reusable Config', + subjectTypes: ['account'], + reportTypes: [REASON_THREAT], + }) + expect(replacement.id).not.toBe(original.id) + + // Clean up + await deleteQueue(replacement.id) + }) + }) +}) diff --git a/packages/ozone/tests/report-action.test.ts b/packages/ozone/tests/report-action.test.ts new file mode 100644 index 00000000000..01cbce4ffe1 --- /dev/null +++ b/packages/ozone/tests/report-action.test.ts @@ -0,0 +1,308 @@ +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { + REASONMISLEADING, + REASONSPAM, +} from '../src/lexicon/types/com/atproto/moderation/defs' + +describe('report-action', () => { + let network: TestNetwork + let sc: SeedClient + let modClient: ModeratorClient + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_report_action', + }) + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + }) + + beforeEach(async () => { + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + describe('emitEvent with reportAction', () => { + it('actions specific report IDs and updates status to closed', async () => { + // Create 3 reports on bob's account + const bobsAccount = { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + } + + for (let i = 0; i < 3; i++) { + await sc.createReport({ + reasonType: REASONSPAM, + reason: `Spam report ${i}`, + subject: bobsAccount, + reportedBy: sc.dids.alice, + }) + } + + await network.processAll() + + // Query to get the actual report table IDs + const allBobReports = await modClient.queryReports({ + status: 'open', + subject: sc.dids.bob, + }) + const reportIds = allBobReports.reports.map((r) => r.id) + + // Action the first 2 reports with an acknowledge event + await modClient.emitEvent({ + event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' }, + subject: bobsAccount, + reportAction: { + ids: [reportIds[0], reportIds[1]], + note: 'Reviewed and found no violation', + }, + }) + + // Query reports and verify status — split by expected status since + // queryReports requires a status filter + const closedBobReports = await modClient.queryReports({ + status: 'closed', + subject: sc.dids.bob, + }) + const openBobReports = await modClient.queryReports({ + status: 'open', + subject: sc.dids.bob, + }) + + // First 2 should be closed, third should still be open + const report1 = closedBobReports.reports.find( + (r) => r.id === reportIds[0], + ) + const report2 = closedBobReports.reports.find( + (r) => r.id === reportIds[1], + ) + const report3 = openBobReports.reports.find((r) => r.id === reportIds[2]) + + expect(report1?.status).toBe('closed') + expect(report1?.actionNote).toBe('Reviewed and found no violation') + expect(report1?.actionEventIds?.length).toBe(1) + + expect(report2?.status).toBe('closed') + expect(report2?.actionNote).toBe('Reviewed and found no violation') + expect(report2?.actionEventIds?.length).toBe(1) + + expect(report3?.status).toBe('open') + expect(report3?.actionNote).toBeFalsy() + expect(report3?.actionEventIds).toBeFalsy() + }) + + it('actions reports by type and associates multiple events', async () => { + // Create mixed reports on alice's account + const alicesAccount = { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + } + + // Create 2 spam and 2 misleading reports + for (let i = 0; i < 2; i++) { + await sc.createReport({ + reasonType: REASONSPAM, + reason: `Spam ${i}`, + subject: alicesAccount, + reportedBy: sc.dids.bob, + }) + await sc.createReport({ + reasonType: REASONMISLEADING, + reason: `Misleading ${i}`, + subject: alicesAccount, + reportedBy: sc.dids.bob, + }) + } + + await network.processAll() + + // Action only spam reports with takedown + const takedownEvent = await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventTakedown', + comment: 'Spam account', + }, + subject: alicesAccount, + reportAction: { + types: ['com.atproto.moderation.defs#reasonSpam'], + note: 'Account taken down for spam', + }, + }) + + // Later, escalate the misleading reports + const escalateEvent = await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventEscalate', + comment: 'Needs review', + }, + subject: alicesAccount, + reportAction: { + types: ['com.atproto.moderation.defs#reasonMisleading'], + }, + }) + + // Query and verify + const spamReports = await modClient.queryReports({ + status: 'closed', + subject: sc.dids.alice, + reportTypes: [REASONSPAM], + }) + const misleadingReports = await modClient.queryReports({ + status: 'escalated', + subject: sc.dids.alice, + reportTypes: [REASONMISLEADING], + }) + + // Spam reports should be closed with takedown event ID + expect(spamReports.reports.length).toBe(2) + spamReports.reports.forEach((report) => { + expect(report.status).toBe('closed') + expect(report.actionNote).toBe('Account taken down for spam') + expect(report.actionEventIds).toContain(takedownEvent.id) + }) + + // Misleading reports should be escalated with escalate event ID + expect(misleadingReports.reports.length).toBe(2) + misleadingReports.reports.forEach((report) => { + expect(report.status).toBe('escalated') + expect(report.actionEventIds).toContain(escalateEvent.id) + }) + }) + + it('actions all reports on a subject and dismisses with comment event', async () => { + // Create a post with multiple reports (use Carol's post to avoid conflicts) + const carolsPost = { + $type: 'com.atproto.repo.strongRef', + uri: sc.posts[sc.dids.carol][0].ref.uriStr, + cid: sc.posts[sc.dids.carol][0].ref.cidStr, + } + + // Create 3 reports of different types + await sc.createReport({ + reasonType: REASONSPAM, + reason: 'Spam post', + subject: carolsPost, + reportedBy: sc.dids.bob, + }) + await sc.createReport({ + reasonType: REASONMISLEADING, + reason: 'Misleading content', + subject: carolsPost, + reportedBy: sc.dids.bob, + }) + await sc.createReport({ + reasonType: REASONSPAM, + reason: 'Another spam report', + subject: carolsPost, + reportedBy: sc.dids.dan, + }) + + await network.processAll() + + // Dismiss all reports with a comment (no subject action) + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventComment', + comment: 'False positive', + }, + subject: carolsPost, + reportAction: { + all: true, + note: 'Thank you for reporting. No violation found.', + }, + }) + + // Query reports on this post + const postReports = await modClient.queryReports({ + status: 'closed', + subject: carolsPost.uri, + }) + + // All 3 reports should be closed + expect(postReports.reports.length).toBe(3) + postReports.reports.forEach((report) => { + expect(report.status).toBe('closed') + expect(report.actionNote).toBe( + 'Thank you for reporting. No violation found.', + ) + expect(report.actionEventIds?.length).toBeGreaterThan(0) + }) + }) + + it('validates report IDs belong to the subject and throws error for mismatches', async () => { + // Create reports on two different subjects (use carol and dan to avoid conflicts) + const carolsAccount = { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + } + const dansAccount = { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.dan, + } + + await sc.createReport({ + reasonType: REASONSPAM, + reason: 'Spam', + subject: carolsAccount, + reportedBy: sc.dids.bob, + }) + + await sc.createReport({ + reasonType: REASONSPAM, + reason: 'Spam', + subject: dansAccount, + reportedBy: sc.dids.bob, + }) + + await network.processAll() + + // Query to get actual report table IDs + const carolReports = await modClient.queryReports({ + status: 'open', + subject: sc.dids.carol, + }) + const danReports = await modClient.queryReports({ + status: 'open', + subject: sc.dids.dan, + }) + + const carolReportId = carolReports.reports[0].id + const danReportId = danReports.reports[0].id + + // Try to action dan's report while targeting carol's account - should fail + const promise = modClient.emitEvent({ + event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' }, + subject: carolsAccount, + reportAction: { + ids: [danReportId], + note: 'This should fail', + }, + }) + + await expect(promise).rejects.toThrow( + /No matching reports found|do not exist or do not belong/, + ) + + // Verify carol's report was not affected + const carolReportsAfter = await modClient.queryReports({ + status: 'open', + subject: sc.dids.carol, + }) + const report = carolReportsAfter.reports.find( + (r) => r.id === carolReportId, + ) + expect(report?.status).toBe('open') + expect(report?.actionEventIds).toBeFalsy() + }) + }) +}) diff --git a/packages/ozone/tests/report-activity.test.ts b/packages/ozone/tests/report-activity.test.ts new file mode 100644 index 00000000000..e7cd84841b0 --- /dev/null +++ b/packages/ozone/tests/report-activity.test.ts @@ -0,0 +1,567 @@ +import AtpAgent from '@atproto/api' +import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' +import { REASONSPAM } from '../src/lexicon/types/com/atproto/moderation/defs' + +const DEFS = 'tools.ozone.report.defs' + +describe('report-activity', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + + const modHeaders = async (nsid: string) => + network.ozone.modHeaders(nsid, 'admin') + + const createReport = async (subjectDid: string) => { + await sc.createReport({ + reasonType: REASONSPAM, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: subjectDid, + }, + reportedBy: sc.dids.bob, + }) + await network.processAll() + + const { data } = await agent.tools.ozone.report.queryReports( + { status: 'open', subject: subjectDid }, + { headers: await modHeaders(ids.ToolsOzoneReportQueryReports) }, + ) + const report = data.reports[0] + if (!report) throw new Error(`No report found for subject ${subjectDid}`) + return report + } + + const createActivity = async ( + input: { + reportId: number + activity: { $type: string; [k: string]: unknown } + internalNote?: string + publicNote?: string + isAutomated?: boolean + }, + role: 'admin' | 'triage' = 'admin', + ) => { + return agent.tools.ozone.report.createActivity(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportCreateActivity, + role, + ), + }) + } + + const listActivities = async ( + params: { reportId: number; limit?: number; cursor?: string }, + role: 'admin' | 'triage' = 'admin', + ) => { + return agent.tools.ozone.report.listActivities(params, { + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportListActivities, + role, + ), + }) + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_report_activity', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + await basicSeed(sc) + await network.processAll() + }) + + afterAll(async () => { + await network.close() + }) + + describe('createActivity — noteActivity', () => { + it('creates an internal note', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'Looks like this may be a bot account.', + }) + + expect(data.activity.reportId).toBe(report.id) + expect(data.activity.activity.$type).toBe(`${DEFS}#noteActivity`) + expect(data.activity.internalNote).toBe( + 'Looks like this may be a bot account.', + ) + expect(data.activity.publicNote).toBeUndefined() + expect(data.activity.isAutomated).toBe(false) + expect(data.activity.createdBy).toBeDefined() + expect(data.activity.createdAt).toBeDefined() + expect(data.activity.id).toBeDefined() + }) + + it('creates a public note', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + publicNote: 'We have reviewed your report.', + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#noteActivity`) + expect(data.activity.publicNote).toBe('We have reviewed your report.') + expect(data.activity.internalNote).toBeUndefined() + }) + + it('creates a note without text', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#noteActivity`) + expect(data.activity.internalNote).toBeUndefined() + expect(data.activity.publicNote).toBeUndefined() + }) + + it('does not change report status', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'Just noting this.', + }) + + const { data: updated } = await agent.tools.ozone.report.getReport( + { id: report.id }, + { headers: await modHeaders(ids.ToolsOzoneReportGetReport) }, + ) + expect(updated.status).toBe('open') + }) + }) + + describe('createActivity — state-change activities (valid transitions)', () => { + it('open → closed (closeActivity)', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#closeActivity`) + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('open') + } + + const { data: updated } = await agent.tools.ozone.report.getReport( + { id: report.id }, + { headers: await modHeaders(ids.ToolsOzoneReportGetReport) }, + ) + expect(updated.status).toBe('closed') + }) + + it('open → escalated (escalationActivity)', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#escalationActivity`) + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('open') + } + }) + + it('open → queued (queueActivity)', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#queueActivity`) + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('open') + } + }) + + it('open → assigned (assignmentActivity)', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#assignmentActivity` }, + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#assignmentActivity`) + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('open') + } + }) + + it('queued → assigned (assignmentActivity)', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#assignmentActivity` }, + }) + + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('queued') + } + }) + + it('escalated → closed (closeActivity)', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('escalated') + } + }) + + it('assigned → closed (closeActivity)', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#assignmentActivity` }, + }) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('assigned') + } + }) + + it('assigned → escalated (escalationActivity)', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#assignmentActivity` }, + }) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }) + + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('assigned') + } + }) + + it('closed → open (reopenActivity)', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#reopenActivity` }, + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#reopenActivity`) + if ('previousStatus' in data.activity.activity) { + expect(data.activity.activity.previousStatus).toBe('closed') + } + + const { data: updated } = await agent.tools.ozone.report.getReport( + { id: report.id }, + { headers: await modHeaders(ids.ToolsOzoneReportGetReport) }, + ) + expect(updated.status).toBe('open') + }) + + it('attaches internalNote and publicNote alongside a state-change', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + internalNote: 'Confirmed spam internally.', + publicNote: 'We have closed your report.', + }) + + expect(data.activity.activity.$type).toBe(`${DEFS}#closeActivity`) + expect(data.activity.internalNote).toBe('Confirmed spam internally.') + expect(data.activity.publicNote).toBe('We have closed your report.') + }) + }) + + describe('createActivity — AlreadyInTargetState', () => { + it('rejects when report is already in the target status', async () => { + const report = await createReport(sc.dids.alice) + // Report starts as 'open', closeActivity targets 'closed' + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }), + ).rejects.toMatchObject({ error: 'AlreadyInTargetState' }) + }) + + it('does not record an activity when AlreadyInTargetState is thrown', async () => { + const report = await createReport(sc.dids.alice) + // queueActivity targets 'queued' — report already starts 'open' so first one works + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }), + ).rejects.toMatchObject({ error: 'AlreadyInTargetState' }) + + const { data } = await listActivities({ reportId: report.id }) + expect(data.activities).toHaveLength(1) + }) + }) + + describe('createActivity — InvalidStateTransition', () => { + it('rejects closed → escalated', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidStateTransition' }) + }) + + it('rejects closed → queued', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidStateTransition' }) + }) + + it('rejects escalated → queued', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidStateTransition' }) + }) + + it('rejects queued → closed', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#queueActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidStateTransition' }) + }) + + it('rejects reopenActivity on open report', async () => { + const report = await createReport(sc.dids.alice) + // report starts as 'open', reopenActivity only valid from 'closed' + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#reopenActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidStateTransition' }) + }) + + it('rejects reopenActivity on escalated report', async () => { + const report = await createReport(sc.dids.alice) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#reopenActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidStateTransition' }) + }) + }) + + describe('createActivity — input validation errors', () => { + it('rejects unknown activity type', async () => { + const report = await createReport(sc.dids.alice) + await expect( + createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#unknownActivity` }, + }), + ).rejects.toMatchObject({ error: 'InvalidActivityType' }) + }) + + it('rejects unknown reportId', async () => { + await expect( + createActivity({ + reportId: 999999, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'Ghost report', + }), + ).rejects.toMatchObject({ error: 'ReportNotFound' }) + }) + }) + + describe('listActivities', () => { + it('returns empty list for report with no activities', async () => { + const report = await createReport(sc.dids.alice) + const { data } = await listActivities({ reportId: report.id }) + + expect(data.activities).toEqual([]) + expect(data.cursor).toBeUndefined() + }) + + it('returns activities sorted most-recent-first', async () => { + const report = await createReport(sc.dids.alice) + + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'First note', + }) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#escalationActivity` }, + }) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'Third note', + }) + + const { data } = await listActivities({ reportId: report.id }) + + expect(data.activities).toHaveLength(3) + expect(data.activities[0].id).toBeGreaterThan(data.activities[1].id) + expect(data.activities[1].id).toBeGreaterThan(data.activities[2].id) + expect(data.activities[0].internalNote).toBe('Third note') + expect(data.activities[2].internalNote).toBe('First note') + }) + + it('returns correct shape for each activity type', async () => { + const report = await createReport(sc.dids.alice) + + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'n', + }) + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#closeActivity` }, + }) + + const { data } = await listActivities({ reportId: report.id }) + const [closeAct, noteAct] = data.activities // most-recent first + + expect(closeAct.activity.$type).toBe(`${DEFS}#closeActivity`) + if ('previousStatus' in closeAct.activity) { + expect(closeAct.activity.previousStatus).toBe('open') + } + expect(closeAct.internalNote).toBeUndefined() + expect(closeAct.isAutomated).toBe(false) + + expect(noteAct.activity.$type).toBe(`${DEFS}#noteActivity`) + expect('previousStatus' in noteAct.activity).toBe(false) + expect(noteAct.internalNote).toBe('n') + }) + + it('paginates correctly', async () => { + const report = await createReport(sc.dids.alice) + + for (let i = 0; i < 5; i++) { + await createActivity({ + reportId: report.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: `Note ${i}`, + }) + } + + const firstPage = await listActivities({ reportId: report.id, limit: 2 }) + expect(firstPage.data.activities).toHaveLength(2) + expect(firstPage.data.cursor).toBeDefined() + + const secondPage = await listActivities({ + reportId: report.id, + limit: 2, + cursor: firstPage.data.cursor, + }) + expect(secondPage.data.activities).toHaveLength(2) + expect(secondPage.data.cursor).toBeDefined() + + const thirdPage = await listActivities({ + reportId: report.id, + limit: 2, + cursor: secondPage.data.cursor, + }) + expect(thirdPage.data.activities).toHaveLength(1) + expect(thirdPage.data.cursor).toBeUndefined() + + const allIds = [ + ...firstPage.data.activities, + ...secondPage.data.activities, + ...thirdPage.data.activities, + ].map((a) => a.id) + expect(new Set(allIds).size).toBe(5) + }) + + it('only returns activities for the requested report', async () => { + const reportA = await createReport(sc.dids.alice) + const reportB = await createReport(sc.dids.bob) + + await createActivity({ + reportId: reportA.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'Note on A', + }) + await createActivity({ + reportId: reportB.id, + activity: { $type: `${DEFS}#noteActivity` }, + internalNote: 'Note on B', + }) + + const { data } = await listActivities({ reportId: reportA.id }) + expect(data.activities.every((a) => a.reportId === reportA.id)).toBe(true) + expect(data.activities.some((a) => a.reportId === reportB.id)).toBe(false) + }) + }) +}) diff --git a/packages/ozone/tests/report-assignment.test.ts b/packages/ozone/tests/report-assignment.test.ts new file mode 100644 index 00000000000..ba7e82e0908 --- /dev/null +++ b/packages/ozone/tests/report-assignment.test.ts @@ -0,0 +1,517 @@ +import AtpAgent, { + ComAtprotoModerationDefs, + ToolsOzoneReportAssignModerator, + ToolsOzoneReportGetAssignments, + ToolsOzoneReportListActivities, + ToolsOzoneReportUnassignModerator, +} from '@atproto/api' +import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' + +describe('report-assignment', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + + const assignReport = async ( + input: ToolsOzoneReportAssignModerator.InputSchema, + callerRole: 'admin' | 'moderator' | 'triage' = 'moderator', + ) => { + const { data } = await agent.tools.ozone.report.assignModerator(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportAssignModerator, + callerRole, + ), + }) + return data + } + + const unassignReport = async ( + input: ToolsOzoneReportUnassignModerator.InputSchema, + callerRole: 'admin' | 'moderator' | 'triage' = 'moderator', + ) => { + const { data } = await agent.tools.ozone.report.unassignModerator(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportUnassignModerator, + callerRole, + ), + }) + return data + } + + const getAssignments = async ( + input: ToolsOzoneReportGetAssignments.QueryParams, + callerRole: 'admin' | 'moderator' | 'triage' = 'moderator', + ) => { + const { data } = await agent.tools.ozone.report.getAssignments(input, { + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportGetAssignments, + callerRole, + ), + }) + return data + } + + const clearQueues = async () => { + await network.ozone.ctx.db.db.deleteFrom('report_queue').execute() + } + const clearAssignments = async () => { + await network.ozone.ctx.db.db.deleteFrom('moderator_assignment').execute() + } + + const listActivities = async ( + params: ToolsOzoneReportListActivities.QueryParams, + callerRole: 'admin' | 'moderator' | 'triage' = 'admin', + ) => { + const { data } = await agent.tools.ozone.report.listActivities(params, { + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportListActivities, + callerRole, + ), + }) + return data + } + + const createReport = async (): Promise => { + const event = await sc.createReport({ + reasonType: ComAtprotoModerationDefs.REASONSPAM, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + }, + reportedBy: sc.dids.alice, + }) + // Report rows are inserted asynchronously by the queue-router daemon — + // drain it before looking up the row. + await network.processAll() + const report = await network.ozone.ctx.db.db + .selectFrom('report') + .select('id') + .where('eventId', '=', event.id) + .executeTakeFirstOrThrow() + return report.id + } + + const createQueue = async (name: string, reportTypes: string[]) => { + const { data } = await agent.tools.ozone.queue.createQueue( + { + name, + subjectTypes: ['account'], + reportTypes, + }, + { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneQueueCreateQueue, + 'admin', + ), + }, + ) + return data + } + + let queueId: number + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'report_assignment', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + await basicSeed(sc) + await network.processAll() + await clearAssignments() + await clearQueues() + + const queue = await createQueue('Report Queue', [ + 'com.atproto.moderation.defs#reasonSpam', + ]) + queueId = queue.queue.id + }) + + afterAll(async () => { + await network.close() + }) + + it('can get assignment history', async () => { + const reportId = await createReport() + await assignReport({ reportId }, 'moderator') + const result = await getAssignments({ reportIds: [reportId] }) + expect(result.assignments.length).toBe(1) + }) + + it('moderator can assign', async () => { + const reportId = await createReport() + const assignment = await assignReport({ reportId }, 'moderator') + expect(assignment.reportId).toBe(reportId) + expect(assignment.moderator?.did).toBe(network.ozone.moderatorAccnt.did) + expect(new Date(assignment.endAt!).getTime()).toBeGreaterThanOrEqual( + new Date().getTime(), + ) + }) + + it('moderator can refresh assignment', async () => { + const reportId = await createReport() + const assignment1 = await assignReport({ reportId }, 'moderator') + const assignment2 = await assignReport({ reportId }, 'moderator') + expect(assignment2.moderator?.did).toBe(network.ozone.moderatorAccnt.did) + expect(new Date(assignment2.endAt!).getTime()).toBeGreaterThan( + new Date(assignment1.endAt!).getTime(), + ) + }) + + it('moderator can assign then un-assign a report', async () => { + const reportId = await createReport() + await assignReport({ reportId }, 'moderator') + const assignment = await unassignReport({ reportId }, 'moderator') + expect(new Date(assignment.endAt!).getTime()).toBeLessThanOrEqual( + new Date().getTime(), + ) + }) + + it('assignment can be exchanged', async () => { + const reportId = await createReport() + await assignReport({ reportId }, 'admin') + await unassignReport({ reportId }, 'moderator') + const assignment = await assignReport({ reportId }, 'moderator') + expect(assignment.reportId).toBe(reportId) + expect(assignment.moderator?.did).toBe(network.ozone.moderatorAccnt.did) + expect(new Date(assignment.endAt!).getTime()).toBeGreaterThanOrEqual( + new Date().getTime(), + ) + }) + + it('invalid assignment throws error', async () => { + const reportId = 999999 + await expect(assignReport({ reportId }, 'moderator')).rejects.toThrow( + 'Invalid report', + ) + }) + + it('invalid unassignment throws error', async () => { + const reportId = await createReport() + await expect(unassignReport({ reportId }, 'moderator')).rejects.toThrow( + 'Report is not assigned', + ) + }) + + describe('pagination', () => { + it('paginates assignments with limit', async () => { + await clearAssignments() + const r1 = await createReport() + const r2 = await createReport() + const r3 = await createReport() + await assignReport({ reportId: r1 }, 'admin') + await assignReport({ reportId: r2 }, 'admin') + await assignReport({ reportId: r3 }, 'admin') + + const firstPage = await getAssignments({ limit: 2 }) + expect(firstPage.assignments.length).toBe(2) + expect(firstPage.cursor).toBeDefined() + }) + + it('returns all results when limit exceeds total', async () => { + await clearAssignments() + const r1 = await createReport() + const r2 = await createReport() + await assignReport({ reportId: r1 }, 'admin') + await assignReport({ reportId: r2 }, 'admin') + + const result = await getAssignments({ limit: 50 }) + expect(result.assignments.length).toBe(2) + expect(result.cursor).toBeDefined() + }) + + it('fetches next page using cursor', async () => { + await clearAssignments() + const r1 = await createReport() + const r2 = await createReport() + const r3 = await createReport() + await assignReport({ reportId: r1 }, 'admin') + await assignReport({ reportId: r2 }, 'admin') + await assignReport({ reportId: r3 }, 'admin') + + const firstPage = await getAssignments({ limit: 2 }) + expect(firstPage.assignments.length).toBe(2) + expect(firstPage.cursor).toBeDefined() + + const secondPage = await getAssignments({ + limit: 2, + cursor: firstPage.cursor, + }) + expect(secondPage.assignments.length).toBe(1) + expect(secondPage.cursor).toBeDefined() + + // Ensure no overlap between pages + const firstPageIds = firstPage.assignments.map((a) => a.id) + const secondPageIds = secondPage.assignments.map((a) => a.id) + for (const id of secondPageIds) { + expect(firstPageIds).not.toContain(id) + } + }) + + it('returns all assignments across pages', async () => { + await clearAssignments() + const r1 = await createReport() + const r2 = await createReport() + const r3 = await createReport() + await assignReport({ reportId: r1 }, 'admin') + await assignReport({ reportId: r2 }, 'admin') + await assignReport({ reportId: r3 }, 'admin') + + // Collect all assignments via pagination + const allAssignments: typeof firstPage.assignments = [] + let cursor: string | undefined + const firstPage = await getAssignments({ limit: 1 }) + allAssignments.push(...firstPage.assignments) + cursor = firstPage.cursor + + while (cursor) { + const page = await getAssignments({ limit: 1, cursor }) + allAssignments.push(...page.assignments) + cursor = page.cursor + } + + expect(allAssignments.length).toBe(3) + // Verify all unique + const ids = allAssignments.map((a) => a.id) + expect(new Set(ids).size).toBe(3) + }) + + it('applies filters alongside pagination', async () => { + await clearAssignments() + const r1 = await createReport() + const r2 = await createReport() + const r3 = await createReport() + await assignReport({ reportId: r1 }, 'admin') + await assignReport({ reportId: r2 }, 'admin') + await assignReport({ reportId: r3 }, 'moderator') + + const result = await getAssignments({ + dids: [network.ozone.adminAccnt.did], + limit: 1, + }) + expect(result.assignments.length).toBe(1) + expect(result.assignments[0].moderator?.did).toBe( + network.ozone.adminAccnt.did, + ) + expect(result.cursor).toBeDefined() + + const nextPage = await getAssignments({ + dids: [network.ozone.adminAccnt.did], + limit: 1, + cursor: result.cursor, + }) + expect(nextPage.assignments.length).toBe(1) + expect(nextPage.assignments[0].moderator?.did).toBe( + network.ozone.adminAccnt.did, + ) + }) + }) + + it('hydrates queue when queueId is provided', async () => { + const reportId = await createReport() + const assignment = await assignReport({ reportId, queueId }, 'admin') + expect(assignment.reportId).toBe(reportId) + expect(assignment.queue).toBeDefined() + expect(assignment.queue!.id).toBe(queueId) + expect(assignment.queue!.name).toBe('Report Queue') + expect(assignment.queue!.subjectTypes).toEqual(['account']) + }) + + it('omits queue when no queueId is provided', async () => { + const reportId = await createReport() + const assignment = await assignReport({ reportId }, 'admin') + expect(assignment.reportId).toBe(reportId) + expect(assignment.queue).toBeUndefined() + }) + + it('hydrates queue in getAssignments', async () => { + await clearAssignments() + const reportId = await createReport() + await assignReport({ reportId, queueId }, 'admin') + const result = await getAssignments({ reportIds: [reportId] }) + expect(result.assignments.length).toBe(1) + expect(result.assignments[0].queue).toBeDefined() + expect(result.assignments[0].queue!.id).toBe(queueId) + expect(result.assignments[0].queue!.name).toBe('Report Queue') + }) + + it('cannot double assign', async () => { + const reportId = await createReport() + await assignReport({ reportId }, 'moderator') + await expect(assignReport({ reportId }, 'admin')).rejects.toThrow( + 'Report already assigned', + ) + }) + + describe('isPermanent', () => { + it('creates a permanent assignment with no endAt', async () => { + const reportId = await createReport() + const assignment = await assignReport( + { reportId, isPermanent: true }, + 'moderator', + ) + expect(assignment.reportId).toBe(reportId) + expect(assignment.endAt).toBeUndefined() + }) + + it('upgrades an active assignment to permanent', async () => { + const reportId = await createReport() + const temp = await assignReport({ reportId }, 'moderator') + expect(temp.endAt).toBeDefined() + + const permanent = await assignReport( + { reportId, isPermanent: true }, + 'moderator', + ) + expect(permanent.id).toBe(temp.id) + expect(permanent.endAt).toBeUndefined() + }) + + it('permanent assignment is unassignable', async () => { + const reportId = await createReport() + await assignReport({ reportId, isPermanent: true }, 'moderator') + const unassigned = await unassignReport({ reportId }, 'moderator') + expect(new Date(unassigned.endAt!).getTime()).toBeLessThanOrEqual( + new Date().getTime(), + ) + }) + + it('throws AlreadyAssigned when another user has a permanent assignment', async () => { + const reportId = await createReport() + await assignReport({ reportId, isPermanent: true }, 'moderator') + await expect( + assignReport({ reportId, isPermanent: true }, 'admin'), + ).rejects.toThrow('Report already assigned') + }) + + it('throws AlreadyAssigned for non-permanent assignment when another user holds permanent', async () => { + const reportId = await createReport() + await assignReport({ reportId, isPermanent: true }, 'moderator') + await expect(assignReport({ reportId }, 'admin')).rejects.toThrow( + 'Report already assigned', + ) + }) + + it('records assignedTo in activity meta when admin assigns to another mod', async () => { + const reportId = await createReport() + const assignment = await assignReport( + { reportId, isPermanent: true, did: network.ozone.moderatorAccnt.did }, + 'admin', + ) + expect(assignment.reportId).toBe(reportId) + expect(assignment.moderator?.did).toBe(network.ozone.moderatorAccnt.did) + + const { activities } = await listActivities({ reportId }) + const assignmentActivity = activities.find( + (a) => + a.activity.$type === 'tools.ozone.report.defs#assignmentActivity', + ) + expect(assignmentActivity).toBeDefined() + expect(assignmentActivity!.meta?.assignedTo).toBe( + network.ozone.moderatorAccnt.did, + ) + expect(assignmentActivity!.createdBy).toBe(network.ozone.adminAccnt.did) + }) + + it('non-admin cannot assign to a different user', async () => { + const reportId = await createReport() + await expect( + assignReport( + { reportId, isPermanent: true, did: network.ozone.adminAccnt.did }, + 'moderator', + ), + ).rejects.toThrow('Unauthorized') + }) + + it('assignedTo equals createdBy when mod assigns to self', async () => { + const reportId = await createReport() + await assignReport( + { reportId, isPermanent: true, did: network.ozone.moderatorAccnt.did }, + 'moderator', + ) + + const { activities } = await listActivities({ reportId }) + const assignmentActivity = activities.find( + (a) => + a.activity.$type === 'tools.ozone.report.defs#assignmentActivity', + ) + expect(assignmentActivity).toBeDefined() + expect(assignmentActivity!.meta?.assignedTo).toBe( + network.ozone.moderatorAccnt.did, + ) + expect(assignmentActivity!.createdBy).toBe( + network.ozone.moderatorAccnt.did, + ) + }) + + it('same user can call isPermanent again idempotently', async () => { + const reportId = await createReport() + await assignReport({ reportId, isPermanent: true }, 'moderator') + const again = await assignReport( + { reportId, isPermanent: true }, + 'moderator', + ) + expect(again.endAt).toBeUndefined() + }) + + it('permanent assignment appears in onlyActive filter', async () => { + await clearAssignments() + const reportId = await createReport() + await assignReport({ reportId, isPermanent: true }, 'moderator') + const result = await getAssignments({ reportIds: [reportId] }) + expect(result.assignments.length).toBe(1) + expect(result.assignments[0].endAt).toBeUndefined() + }) + }) + + describe('unassign returns report to queue', () => { + const getReportStatus = async (reportId: number) => { + const row = await network.ozone.ctx.db.db + .selectFrom('report') + .select('status') + .where('id', '=', reportId) + .executeTakeFirstOrThrow() + return row.status + } + + it('flips status from assigned back to queued and logs queueActivity', async () => { + const reportId = await createReport() + await assignReport({ reportId, queueId, isPermanent: true }, 'moderator') + expect(await getReportStatus(reportId)).toBe('assigned') + + await unassignReport({ reportId }, 'moderator') + expect(await getReportStatus(reportId)).toBe('queued') + + const { activities } = await listActivities({ reportId }) + const queueActivity = activities.find( + (a) => a.activity.$type === 'tools.ozone.report.defs#queueActivity', + ) + expect(queueActivity).toBeDefined() + if ('previousStatus' in queueActivity!.activity) { + expect(queueActivity!.activity.previousStatus).toBe('assigned') + } + expect(queueActivity!.createdBy).toBe(network.ozone.moderatorAccnt.did) + expect(queueActivity!.isAutomated).toBe(false) + }) + + it('flips status from assigned back to open when assignment had no queueId', async () => { + const reportId = await createReport() + await assignReport({ reportId, isPermanent: true }, 'moderator') + expect(await getReportStatus(reportId)).toBe('assigned') + + await unassignReport({ reportId }, 'moderator') + // No queueId on the assignment, so the report goes back to 'open'. + expect(await getReportStatus(reportId)).toBe('open') + + const { activities } = await listActivities({ reportId }) + const queueActivity = activities.find( + (a) => a.activity.$type === 'tools.ozone.report.defs#queueActivity', + ) + expect(queueActivity).toBeUndefined() + }) + }) +}) diff --git a/packages/ozone/tests/report-reassign-queue.test.ts b/packages/ozone/tests/report-reassign-queue.test.ts new file mode 100644 index 00000000000..a5f33586a54 --- /dev/null +++ b/packages/ozone/tests/report-reassign-queue.test.ts @@ -0,0 +1,340 @@ +import AtpAgent from '@atproto/api' +import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' +import { REASONSPAM } from '../src/lexicon/types/com/atproto/moderation/defs' + +const DEFS = 'tools.ozone.report.defs' + +describe('report-reassign-queue', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + + // Track queue IDs created during each test so afterEach can soft-delete them. + // Soft-deleted queues are filtered out of `checkConflict`, so tests are free + // to reuse the same queue configuration without tripping ConflictingQueue. + const createdQueueIds: number[] = [] + + const modHeaders = async ( + nsid: string, + role: 'admin' | 'moderator' | 'triage' = 'admin', + ) => network.ozone.modHeaders(nsid, role) + + const createReport = async (subjectDid: string) => { + await sc.createReport({ + reasonType: REASONSPAM, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: subjectDid, + }, + reportedBy: sc.dids.bob, + }) + await network.processAll() + + const { data } = await agent.tools.ozone.report.queryReports( + { status: 'open', subject: subjectDid }, + { headers: await modHeaders(ids.ToolsOzoneReportQueryReports) }, + ) + const report = data.reports[0] + if (!report) throw new Error(`No report found for subject ${subjectDid}`) + return report + } + + const createQueue = async ( + overrides: { + name?: string + subjectTypes?: string[] + reportTypes?: string[] + } = {}, + ) => { + const name = overrides.name ?? `q-${Date.now()}-${Math.random()}` + const input = { + name, + subjectTypes: overrides.subjectTypes ?? ['account'], + reportTypes: overrides.reportTypes ?? [ + 'com.atproto.moderation.defs#reasonSpam', + ], + } + const { data } = await agent.tools.ozone.queue.createQueue(input, { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueCreateQueue), + }) + createdQueueIds.push(data.queue.id) + return data + } + + const deleteQueue = async (queueId: number) => + agent.tools.ozone.queue.deleteQueue( + { queueId }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueDeleteQueue), + }, + ) + + const closeReport = async (reportId: number) => { + await agent.tools.ozone.report.createActivity( + { + reportId, + activity: { $type: `${DEFS}#closeActivity` }, + }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneReportCreateActivity), + }, + ) + } + + const disableQueue = async (queueId: number) => { + return agent.tools.ozone.queue.updateQueue( + { queueId, enabled: false }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueUpdateQueue), + }, + ) + } + + const escalateReport = async (reportId: number) => { + await agent.tools.ozone.report.createActivity( + { + reportId, + activity: { $type: `${DEFS}#escalationActivity` }, + }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneReportCreateActivity), + }, + ) + } + + const reassignQueue = async ( + input: { reportId: number; queueId: number; comment?: string }, + role: 'admin' | 'moderator' | 'triage' = 'admin', + ) => { + return agent.tools.ozone.report.reassignQueue(input, { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneReportReassignQueue, role), + }) + } + + const listActivities = async (reportId: number) => { + const { data } = await agent.tools.ozone.report.listActivities( + { reportId }, + { headers: await modHeaders(ids.ToolsOzoneReportListActivities) }, + ) + return data + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_report_reassign_queue', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + await basicSeed(sc) + await network.processAll() + }) + + afterEach(async () => { + await Promise.all( + createdQueueIds.splice(0).map((id) => deleteQueue(id).catch(() => {})), + ) + }) + + afterAll(async () => { + await network.close() + }) + + describe('happy path: assigning to a real queue', () => { + it('transitions open → queued and writes an activity row', async () => { + const report = await createReport(sc.dids.alice) + const queue = await createQueue() + + const { data } = await reassignQueue({ + reportId: report.id, + queueId: queue.queue.id, + comment: 'Routing to spam queue for review', + }) + + expect(data.report.id).toBe(report.id) + expect(data.report.status).toBe('queued') + expect(data.report.queue?.id).toBe(queue.queue.id) + expect(data.report.queuedAt).toBeDefined() + + const activities = await listActivities(report.id) + const queueActivity = activities.activities.find( + (a) => a.activity.$type === `${DEFS}#queueActivity`, + ) + expect(queueActivity).toBeDefined() + expect(queueActivity!.internalNote).toBe( + 'Routing to spam queue for review', + ) + expect(queueActivity!.publicNote).toBeUndefined() + expect(queueActivity!.isAutomated).toBe(false) + expect((queueActivity!.activity as any).previousStatus).toBe('open') + expect(queueActivity!.meta!.toQueueId).toEqual(queue.queue.id) + }) + }) + + describe('queue-to-queue reassignment', () => { + it('keeps status queued and records fromQueueId correctly', async () => { + const report = await createReport(sc.dids.carol) + const queueA = await createQueue() + // Second queue needs a distinct config to avoid ConflictingQueue. + const queueB = await createQueue({ + reportTypes: ['com.atproto.moderation.defs#reasonViolation'], + }) + + await reassignQueue({ reportId: report.id, queueId: queueA.queue.id }) + + const { data } = await reassignQueue({ + reportId: report.id, + queueId: queueB.queue.id, + }) + + expect(data.report.status).toBe('queued') + expect(data.report.queue?.id).toBe(queueB.queue.id) + + const activities = await listActivities(report.id) + const queueActivities = activities.activities.filter( + (a) => a.activity.$type === `${DEFS}#queueActivity`, + ) + // Sorted DESC, so [0] is the most recent. + expect(queueActivities.length).toBeGreaterThanOrEqual(2) + expect((queueActivities[0].activity as any).previousStatus).toBe('queued') + expect(queueActivities[0].meta).toEqual({ + fromQueueId: queueA.queue.id, + toQueueId: queueB.queue.id, + }) + }) + }) + + describe('unassignment (queueId = -1)', () => { + it('transitions queued → open and clears queuedAt', async () => { + const report = await createReport(sc.dids.dan) + const queue = await createQueue() + + await reassignQueue({ reportId: report.id, queueId: queue.queue.id }) + + const { data } = await reassignQueue({ + reportId: report.id, + queueId: -1, + }) + + expect(data.report.status).toBe('open') + expect(data.report.queue).toBeUndefined() + expect(data.report.queuedAt).toBeUndefined() + + const activities = await listActivities(report.id) + const latest = activities.activities[0] + expect(latest.activity.$type).toBe(`${DEFS}#queueActivity`) + expect((latest.activity as any).previousStatus).toBe('queued') + expect(latest.meta).toEqual({ + fromQueueId: queue.queue.id, + toQueueId: -1, + }) + }) + }) + + describe('errors', () => { + it('throws ReportClosed when report is closed', async () => { + const report = await createReport(sc.dids.alice) + await closeReport(report.id) + const queue = await createQueue() + + await expect( + reassignQueue({ reportId: report.id, queueId: queue.queue.id }), + ).rejects.toThrow(/ReportClosed|closed/) + }) + + it('throws AlreadyInTargetQueue when target equals current queue', async () => { + const report = await createReport(sc.dids.alice) + const queue = await createQueue() + await reassignQueue({ reportId: report.id, queueId: queue.queue.id }) + + await expect( + reassignQueue({ reportId: report.id, queueId: queue.queue.id }), + ).rejects.toThrow(/AlreadyInTargetQueue|already/) + }) + + it('throws AlreadyInTargetQueue when unassigning a never-queued report', async () => { + const report = await createReport(sc.dids.alice) + + await expect( + reassignQueue({ reportId: report.id, queueId: -1 }), + ).rejects.toThrow(/AlreadyInTargetQueue|already/) + }) + + it('throws QueueNotFound when target queue does not exist', async () => { + const report = await createReport(sc.dids.alice) + + await expect( + reassignQueue({ reportId: report.id, queueId: 999999 }), + ).rejects.toThrow(/QueueNotFound|not found/) + }) + + it('throws QueueNotFound when target queue is soft-deleted', async () => { + const report = await createReport(sc.dids.alice) + const queue = await createQueue() + await deleteQueue(queue.queue.id) + + await expect( + reassignQueue({ reportId: report.id, queueId: queue.queue.id }), + ).rejects.toThrow(/QueueNotFound|not found/) + }) + + it('throws QueueDisabled when target queue is disabled', async () => { + const report = await createReport(sc.dids.alice) + const queue = await createQueue() + await disableQueue(queue.queue.id) + + await expect( + reassignQueue({ reportId: report.id, queueId: queue.queue.id }), + ).rejects.toThrow(/QueueDisabled|disabled/) + }) + + it('throws ReportNotFound when report does not exist', async () => { + const queue = await createQueue() + + await expect( + reassignQueue({ reportId: 999999, queueId: queue.queue.id }), + ).rejects.toThrow(/ReportNotFound|not found/) + }) + }) + + describe('status-preserving cases', () => { + it('keeps escalated status when reassigning an escalated report', async () => { + const report = await createReport(sc.dids.alice) + await escalateReport(report.id) + const queue = await createQueue() + + const { data } = await reassignQueue({ + reportId: report.id, + queueId: queue.queue.id, + }) + + expect(data.report.status).toBe('escalated') + expect(data.report.queue?.id).toBe(queue.queue.id) + + const activities = await listActivities(report.id) + const latest = activities.activities[0] + expect(latest.activity.$type).toBe(`${DEFS}#queueActivity`) + expect((latest.activity as any).previousStatus).toBe('escalated') + }) + }) + + describe('auth', () => { + it('allows triage role to reassign', async () => { + const report = await createReport(sc.dids.alice) + const queue = await createQueue() + + const { data } = await reassignQueue( + { reportId: report.id, queueId: queue.queue.id }, + 'triage', + ) + + expect(data.report.status).toBe('queued') + }) + }) +}) diff --git a/packages/ozone/tests/report-routing.test.ts b/packages/ozone/tests/report-routing.test.ts new file mode 100644 index 00000000000..20d372167ec --- /dev/null +++ b/packages/ozone/tests/report-routing.test.ts @@ -0,0 +1,245 @@ +import AtpAgent from '@atproto/api' +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' + +const REASON_SPAM = 'com.atproto.moderation.defs#reasonSpam' +const REASON_THREAT = 'tools.ozone.report.defs#reasonViolenceThreats' +const REASON_MISLEADING = 'com.atproto.moderation.defs#reasonMisleading' + +describe('queue-router', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + let modClient: ModeratorClient + + const modHeaders = (nsid: string) => network.ozone.modHeaders(nsid, 'admin') + + const createQueue = async (input: { + name: string + subjectTypes: string[] + reportTypes: string[] + collection?: string + }) => { + const { data } = await agent.tools.ozone.queue.createQueue(input, { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueCreateQueue), + }) + return data.queue + } + + const deleteQueue = async (queueId: number) => { + await agent.tools.ozone.queue.deleteQueue( + { queueId }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueDeleteQueue), + }, + ) + } + + // Creates a report event (account-level) directly via modClient for a given DID + reason + const reportAccount = async (did: string, reportType: string) => { + await modClient.emitEvent({ + event: { + $type: 'tools.ozone.moderation.defs#modEventReport', + reportType, + comment: 'automated test report', + }, + subject: { $type: 'com.atproto.admin.defs#repoRef', did }, + }) + } + + // Returns the most recent report row for a subject directly from the DB. + // Pass a DID for account subjects or an at:// URI for record subjects. + const getLatestReportForSubject = async (subjectOrUri: string) => { + const db = network.ozone.daemon.ctx.db + const isDid = subjectOrUri.startsWith('did:') + let query = db.db + .selectFrom('report as r') + .innerJoin('moderation_event as me', 'me.id', 'r.eventId') + .select(['r.id', 'r.queueId', 'r.queuedAt', 'r.status']) + .orderBy('r.id', 'desc') + .limit(1) + if (isDid) { + query = query + .where('me.subjectDid', '=', subjectOrUri) + .where('me.subjectUri', 'is', null) + } else { + query = query.where('me.subjectUri', '=', subjectOrUri) + } + return query.executeTakeFirstOrThrow() + } + + const getLatest = async () => { + const { data } = await agent.tools.ozone.report.getLatestReport( + {}, + { headers: await modHeaders(ids.ToolsOzoneReportGetLatestReport) }, + ) + return data.report + } + + const routeReports = async (startReportId: number, endReportId: number) => { + const { data } = await agent.tools.ozone.queue.routeReports( + { startReportId, endReportId }, + { + encoding: 'application/json', + headers: await modHeaders(ids.ToolsOzoneQueueRouteReports), + }, + ) + return data + } + + const clearQueues = async () => { + const db = network.ozone.ctx.db.db + await db.deleteFrom('report_queue').execute() + } + + let spamAccountQueueId: number + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_report_routing', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + await clearQueues() + const [spamAccountQueue] = await Promise.all([ + createQueue({ + name: 'QR: Spam Accounts', + subjectTypes: ['account'], + reportTypes: [REASON_SPAM], + }), + ]) + spamAccountQueueId = spamAccountQueue.id + }) + + afterAll(async () => { + await network.close() + }) + + it('routes unassigned AND unmatched reports to a newly created queue', async () => { + // Create unmatchable report (queueId will be set to -1 by daemon) + await reportAccount(sc.dids.bob, REASON_MISLEADING) + await network.ozone.daemon.ctx.queueRouter.routeReports() + const unmatchedReport = await getLatestReportForSubject(sc.dids.bob) + expect(unmatchedReport.queueId).toBe(-1) + + // Create an unassigned (queueId IS NULL) report — this state no longer + // arises from the normal flow, since the daemon always sets a queueId, + // but the manual routeReports endpoint still handles legacy NULL rows. + // Simulate it via a direct DB insert of a report event + report row. + await reportAccount(sc.dids.carol, REASON_MISLEADING) + const carolEvent = await network.ozone.daemon.ctx.db.db + .selectFrom('moderation_event') + .select(['id', 'subjectDid', 'meta']) + .where('subjectDid', '=', sc.dids.carol) + .where('action', '=', 'tools.ozone.moderation.defs#modEventReport') + .orderBy('id', 'desc') + .limit(1) + .executeTakeFirstOrThrow() + const now = new Date().toISOString() + await network.ozone.daemon.ctx.db.db + .insertInto('report') + .values({ + eventId: carolEvent.id, + queueId: null, + actionEventIds: null, + actionNote: null, + isMuted: false, + status: 'open', + reportType: REASON_MISLEADING, + did: carolEvent.subjectDid, + recordPath: '', + subjectMessageId: null, + createdAt: now, + updatedAt: now, + }) + .execute() + const unassignedReport = await getLatestReportForSubject(sc.dids.carol) + expect(unassignedReport.queueId).toBeNull() + + // Create a queue that now matches misleading account reports + const misleadingQueue = await createQueue({ + name: 'QR: Misleading Accounts', + subjectTypes: ['account'], + reportTypes: [REASON_MISLEADING], + }) + + // Re-route both reports + const startId = Math.min(unmatchedReport.id, unassignedReport.id) + const endId = Math.max(unmatchedReport.id, unassignedReport.id) + const result = await routeReports(startId, endId) + expect(result.assigned).toBe(2) + expect(result.unmatched).toBe(0) + + // Verify both reports match + const unmatchedAfter = await getLatestReportForSubject(sc.dids.bob) + expect(unmatchedAfter.queueId).toBe(misleadingQueue.id) + const unassignedAfter = await getLatestReportForSubject(sc.dids.carol) + expect(unassignedAfter.queueId).toBe(misleadingQueue.id) + + // cleanup + await deleteQueue(misleadingQueue.id) + }) + + it('skips reports already assigned to a valid queue', async () => { + await reportAccount(sc.dids.bob, REASON_SPAM) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const reportBob = await getLatestReportForSubject(sc.dids.bob) + expect(reportBob.queueId).toBe(spamAccountQueueId) + + // Report is already assigned — endpoint only processes null/unmatched + const result = await routeReports(reportBob.id, reportBob.id) + expect(result.assigned).toBe(0) + expect(result.unmatched).toBe(0) + }) + + it('rejects when startReportId > endReportId', async () => { + await expect(routeReports(100, 50)).rejects.toThrow( + 'startReportId must be less than or equal to endReportId', + ) + }) + + it('rejects when more than 5000 reports', async () => { + await expect(routeReports(100, 5101)).rejects.toThrow( + 'Cannot route more than 5000 reports at a time', + ) + }) + + describe('get latest report', () => { + it('returns latest report', async () => { + // Create a new report so we know what the latest should be + await reportAccount(sc.dids.dan, REASON_SPAM) + // Report rows are inserted asynchronously by the queue-router daemon — + // drain it before querying. + await network.processAll() + + const latest = await getLatest() + expect(latest).toBeDefined() + expect(latest.id).toBeGreaterThan(0) + + // Verify it matches the DB + const dbReport = await getLatestReportForSubject(sc.dids.dan) + expect(latest.id).toBe(dbReport.id) + }) + + it('returns a newer report after creating one', async () => { + const first = await getLatest() + + await reportAccount(sc.dids.alice, REASON_THREAT) + await network.processAll() + + const second = await getLatest() + expect(second.id).toBeGreaterThan(first.id) + }) + }) +}) diff --git a/packages/ozone/tests/report-stats.test.ts b/packages/ozone/tests/report-stats.test.ts new file mode 100644 index 00000000000..47549319983 --- /dev/null +++ b/packages/ozone/tests/report-stats.test.ts @@ -0,0 +1,545 @@ +import { sql } from 'kysely' +import AtpAgent from '@atproto/api' +import { + ModeratorClient, + SeedClient, + TestNetwork, + basicSeed, +} from '@atproto/dev-env' +import { ids } from '../src/lexicon/lexicons' +import { REPORT_TYPE_GROUPS } from '../src/report/stats' + +describe('report-stats', () => { + let network: TestNetwork + let agent: AtpAgent + let sc: SeedClient + let modClient: ModeratorClient + let spamQueueId: number + let threatQueueId: number + + const createQueue = async (input: { + name: string + subjectTypes: string[] + reportTypes: string[] + collection?: string + }) => { + const { data } = await agent.tools.ozone.queue.createQueue(input, { + encoding: 'application/json', + headers: await network.ozone.modHeaders( + ids.ToolsOzoneQueueCreateQueue, + 'admin', + ), + }) + return data.queue + } + + const getLiveStats = async (params?: { + queueId?: number + moderatorDid?: string + reportTypes?: string[] + }) => { + const { data } = await agent.tools.ozone.report.getLiveStats(params, { + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportGetLiveStats, + 'admin', + ), + }) + return data.stats + } + + const getHistoricalStats = async (params?: { + queueId?: number + moderatorDid?: string + reportTypes?: string[] + startDate?: string + endDate?: string + limit?: number + cursor?: string + }) => { + const { data } = await agent.tools.ozone.report.getHistoricalStats(params, { + headers: await network.ozone.modHeaders( + ids.ToolsOzoneReportGetHistoricalStats, + 'admin', + ), + }) + return data + } + + beforeAll(async () => { + network = await TestNetwork.create({ + dbPostgresSchema: 'ozone_report_stats', + }) + agent = network.ozone.getAgent() + sc = network.getSeedClient() + modClient = network.ozone.getModClient() + await basicSeed(sc) + await network.processAll() + + // seed queues + const spamQueue = await createQueue({ + name: 'Stats: Spam Accounts', + subjectTypes: ['account'], + reportTypes: ['com.atproto.moderation.defs#reasonSpam'], + }) + const threatQueue = await createQueue({ + name: 'Stats: Threat Accounts', + subjectTypes: ['account'], + reportTypes: ['tools.ozone.report.defs#reasonViolenceThreats'], + }) + spamQueueId = spamQueue.id + threatQueueId = threatQueue.id + + // seed reports + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonSpam', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + reportedBy: sc.dids.bob, + }) + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonSpam', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + }, + reportedBy: sc.dids.alice, + }) + await sc.createReport({ + reasonType: 'tools.ozone.report.defs#reasonViolenceThreats', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportedBy: sc.dids.alice, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + await modClient.computeStats() + }) + + afterAll(async () => { + await network.close() + }) + + describe('aggregate', () => { + it('returns aggregate stats when no params provided', async () => { + const stats = await getLiveStats() + expect(stats.inboundCount).toBeGreaterThanOrEqual(3) + expect(stats.lastUpdated).toBeDefined() + }) + + it('includes unqueued reports in aggregate', async () => { + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonMisleading', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportedBy: sc.dids.bob, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + await modClient.computeStats() + const stats = await getLiveStats() + expect(stats.pendingCount).toBeGreaterThanOrEqual(1) + }) + + it('pendingCount includes reports created before the time window', async () => { + const db = network.ozone.ctx.db + + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonSpam', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + reportedBy: sc.dids.carol, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const oldDate = new Date( + Date.now() - 3 * 24 * 60 * 60 * 1000, + ).toISOString() + const report = await db.db + .selectFrom('report') + .select(['id']) + .where('status', '!=', 'closed') + .orderBy('id', 'desc') + .executeTakeFirstOrThrow() + await db.db + .updateTable('report') + .set({ createdAt: oldDate, updatedAt: oldDate }) + .where('id', '=', report.id) + .execute() + + await modClient.computeStats() + const aggregateStats = await getLiveStats() + const queueStats = await getLiveStats({ queueId: spamQueueId }) + + expect(aggregateStats.pendingCount).toBeGreaterThanOrEqual(1) + expect(queueStats.pendingCount).toBeGreaterThanOrEqual(1) + }) + + it('omitting reportTypes returns aggregate across all types', async () => { + await modClient.computeStats() + + // No params = aggregate; reportTypes omitted should yield same result + const stats = await getLiveStats() + expect(stats.inboundCount).toBeGreaterThanOrEqual(3) + expect(stats.pendingCount).toBeGreaterThanOrEqual(1) + }) + }) + + describe('queue', () => { + it('returns per-queue stats for spam queue', async () => { + const stats = await getLiveStats({ queueId: spamQueueId }) + expect(stats.pendingCount).toBeGreaterThanOrEqual(2) + expect(stats.inboundCount).toBeGreaterThanOrEqual(2) + }) + + it('returns per-queue stats for threat queue', async () => { + const stats = await getLiveStats({ queueId: threatQueueId }) + expect(stats.pendingCount).toBeGreaterThanOrEqual(1) + }) + + it('reflects status changes after recompute', async () => { + const stats1 = await getLiveStats({ queueId: spamQueueId }) + + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonSpam', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportedBy: sc.dids.bob, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + await modClient.computeStats() + const stats2 = await getLiveStats({ queueId: spamQueueId }) + + expect(stats2.pendingCount! - stats1.pendingCount!).toBe(1) + expect(stats2.inboundCount! - stats1.inboundCount!).toBe(1) + }) + + it('returns zeroed stats for empty queue', async () => { + const emptyQueue = await createQueue({ + name: 'Stats: Empty Queue', + subjectTypes: ['record'], + reportTypes: ['com.atproto.moderation.defs#reasonOther'], + }) + await modClient.computeStats() + const stats = await getLiveStats({ queueId: emptyQueue.id }) + + expect(stats.pendingCount).toBe(0) + expect(stats.inboundCount).toBe(0) + expect(stats.avgHandlingTimeSec).toBeUndefined() + }) + + it('computes stats for unqueued reports (queueId = -1)', async () => { + const db = network.ozone.ctx.db + + const unqueuedBefore = await db.db + .selectFrom('report') + .select(sql`count(*)`.as('count')) + .where('queueId', '=', -1) + .where('status', '!=', 'closed') + .executeTakeFirstOrThrow() + + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonMisleading', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + reportedBy: sc.dids.carol, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + await modClient.computeStats() + + const unqueuedAfter = await db.db + .selectFrom('report') + .select(sql`count(*)`.as('count')) + .where('queueId', '=', -1) + .where('status', '!=', 'closed') + .executeTakeFirstOrThrow() + expect(Number(unqueuedAfter.count)).toBe(Number(unqueuedBefore.count) + 1) + + const stats = await getLiveStats({ queueId: -1 }) + expect(stats.pendingCount).toBe(Number(unqueuedAfter.count)) + expect(stats.inboundCount).toBeGreaterThanOrEqual(1) + expect(stats.lastUpdated).toBeDefined() + }) + + it('unqueued stats are separate from aggregate stats', async () => { + await modClient.computeStats() + + const aggregateStats = await getLiveStats() + const unqueuedStats = await getLiveStats({ queueId: -1 }) + + expect(aggregateStats.pendingCount).toBeGreaterThanOrEqual( + unqueuedStats.pendingCount ?? 0, + ) + }) + }) + + describe('moderator', () => { + it('returns per-moderator stats after action', async () => { + const moderatorDid = network.ozone.moderatorAccnt.did + const db = network.ozone.ctx.db + + // Create reports, assign moderator, backdate assignment, then close + const ages = [30, 60, 90] + for (const ts of ages) { + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonOther', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportedBy: sc.dids.bob, + }) + // Report rows are inserted asynchronously by the queue-router daemon — + // drain it before looking up the row. + await network.processAll() + const backdate = new Date(Date.now() - ts * 1000).toISOString() + const report = await db.db + .selectFrom('report') + .select(['id', 'status']) + .orderBy('id', 'desc') + .executeTakeFirstOrThrow() + await db.db + .updateTable('report') + .set({ + status: 'open', + createdAt: backdate, + updatedAt: backdate, + }) + .where('id', '=', report.id) + .execute() + await db.db + .insertInto('moderator_assignment') + .values({ + did: moderatorDid, + reportId: report.id, + queueId: null, + startAt: backdate, + endAt: null, + }) + .execute() + await modClient.emitEvent( + { + event: { + $type: 'tools.ozone.moderation.defs#modEventAcknowledge', + }, + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.carol, + }, + reportAction: { all: true }, + }, + 'moderator', + ) + } + + await modClient.computeStats() + const stats = await getLiveStats({ moderatorDid }) + const avgHandlingTime = ages.reduce((a, b) => a + b, 0) / ages.length + expect(stats.avgHandlingTimeSec).toBeDefined() + expect(stats.avgHandlingTimeSec).toBeGreaterThanOrEqual( + avgHandlingTime - 5, + ) + expect(stats.avgHandlingTimeSec).toBeLessThanOrEqual(avgHandlingTime + 5) + }) + + it('returns zeroed per-moderator stats for inactive moderator', async () => { + const triageDid = network.ozone.triageAccnt.did + await modClient.computeStats() + const stats = await getLiveStats({ moderatorDid: triageDid }) + + expect(stats.actionedCount).toBe(0) + expect(stats.inboundCount).toBe(0) + expect(stats.escalatedCount).toBeUndefined() + expect(stats.pendingCount).toBeUndefined() + }) + }) + + describe('report type group', () => { + it('computes per-group stats for Legacy group', async () => { + await modClient.computeStats() + + const legacyStats = await getLiveStats({ + reportTypes: REPORT_TYPE_GROUPS['Legacy'], + }) + const allStats = await getLiveStats() + + // Legacy group includes spam, etc. seeded above + expect(legacyStats.inboundCount).toBeGreaterThanOrEqual(3) + + // Aggregate should be >= legacy group + expect(allStats.inboundCount).toBeGreaterThanOrEqual( + legacyStats.inboundCount!, + ) + }) + + it('only counts matching report types within group', async () => { + await modClient.computeStats() + + const legacyStats = await getLiveStats({ + reportTypes: REPORT_TYPE_GROUPS['Legacy'], + }) + const violenceStats = await getLiveStats({ + reportTypes: REPORT_TYPE_GROUPS['Violence'], + }) + + // Legacy group should include spam + misleading + expect(legacyStats.inboundCount).toBeGreaterThanOrEqual(2) + expect(legacyStats.pendingCount).toBeGreaterThanOrEqual(0) + // Violence group should only include threats + expect(violenceStats.inboundCount).toBeGreaterThanOrEqual(1) + expect(violenceStats.pendingCount).toBeGreaterThanOrEqual(1) + }) + + it('tracks escalated counts within group', async () => { + const db = network.ozone.ctx.db + + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonSpam', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.bob, + }, + reportedBy: sc.dids.carol, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await db.db + .selectFrom('report') + .select(['id']) + .orderBy('id', 'desc') + .executeTakeFirstOrThrow() + + await db.db + .updateTable('report') + .set({ status: 'escalated', updatedAt: new Date().toISOString() }) + .where('id', '=', report.id) + .execute() + + await modClient.computeStats() + + const stats = await getLiveStats({ + reportTypes: REPORT_TYPE_GROUPS['Legacy'], + }) + expect(stats.escalatedCount).toBeGreaterThanOrEqual(1) + }) + + it('returns zeroed stats for unused report type group', async () => { + await modClient.computeStats() + + // Civic group has no seeded reports: all counts should be 0 + const stats = await getLiveStats({ + reportTypes: REPORT_TYPE_GROUPS.Civic, + }) + expect(stats.inboundCount).toBe(0) + expect(stats.pendingCount).toBe(0) + }) + + it('handles avg handling time within group', async () => { + const db = network.ozone.ctx.db + + await sc.createReport({ + reasonType: 'com.atproto.moderation.defs#reasonRude', + subject: { + $type: 'com.atproto.admin.defs#repoRef', + did: sc.dids.alice, + }, + reportedBy: sc.dids.carol, + }) + await network.ozone.daemon.ctx.queueRouter.routeReports() + + const report = await db.db + .selectFrom('report') + .select(['id']) + .orderBy('id', 'desc') + .executeTakeFirstOrThrow() + + const backdate = new Date(Date.now() - 120 * 1000).toISOString() + const now = new Date().toISOString() + await db.db + .updateTable('report') + .set({ + createdAt: backdate, + updatedAt: now, + closedAt: now, + status: 'closed', + }) + .where('id', '=', report.id) + .execute() + + await modClient.computeStats() + + const stats = await getLiveStats({ + reportTypes: REPORT_TYPE_GROUPS['Legacy'], + }) + expect(stats.actionedCount).toBeGreaterThanOrEqual(1) + expect(stats.avgHandlingTimeSec).toBeDefined() + // Group includes all legacy types; avg is diluted by other closed reports + expect(stats.avgHandlingTimeSec).toBeGreaterThanOrEqual(1) + }) + }) + + describe('historical stats', () => { + it('returns historical aggregate stats with date field', async () => { + await modClient.computeStats() + + const result = await getHistoricalStats() + expect(result.stats.length).toBeGreaterThanOrEqual(1) + + const first = result.stats[0] + expect(first.date).toBeDefined() + expect(first.date).toMatch(/^\d{4}-\d{2}-\d{2}$/) + expect(first.inboundCount).toBeGreaterThanOrEqual(0) + }) + + it('returns historical per-queue stats', async () => { + await modClient.computeStats() + + const result = await getHistoricalStats({ queueId: spamQueueId }) + expect(result.stats.length).toBeGreaterThanOrEqual(1) + expect(result.stats[0].date).toBeDefined() + expect(result.stats[0].inboundCount).toBeGreaterThanOrEqual(0) + }) + + it('supports pagination with limit and cursor', async () => { + await modClient.computeStats() + + const page1 = await getHistoricalStats({ limit: 1 }) + expect(page1.stats.length).toBe(1) + + if (page1.cursor) { + const page2 = await getHistoricalStats({ + limit: 1, + cursor: page1.cursor, + }) + expect(page2.stats.length).toBeLessThanOrEqual(1) + } + }) + + it('supports date range filtering', async () => { + await modClient.computeStats() + + const now = new Date() + const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000) + const todayStr = now.toISOString().slice(0, 10) + const yesterdayStr = yesterday.toISOString().slice(0, 10) + + const result = await getHistoricalStats({ + startDate: yesterday.toISOString(), + endDate: now.toISOString(), + }) + for (const stat of result.stats) { + expect(stat.date >= yesterdayStr).toBe(true) + expect(stat.date <= todayStr).toBe(true) + } + }) + }) +}) From 44352e6472c441eb89c7e9d28a83b95addcdf7bb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 18:45:56 +0200 Subject: [PATCH 19/87] Version packages (#4918) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/sour-squids-rush.md | 7 ------- packages/api/CHANGELOG.md | 6 ++++++ packages/api/package.json | 2 +- packages/dev-env/CHANGELOG.md | 10 ++++++++++ packages/dev-env/package.json | 2 +- packages/ozone/CHANGELOG.md | 9 +++++++++ packages/ozone/package.json | 2 +- 7 files changed, 28 insertions(+), 10 deletions(-) delete mode 100644 .changeset/sour-squids-rush.md diff --git a/.changeset/sour-squids-rush.md b/.changeset/sour-squids-rush.md deleted file mode 100644 index 7840392e80f..00000000000 --- a/.changeset/sour-squids-rush.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@atproto/dev-env': patch -'@atproto/ozone': patch -'@atproto/api': patch ---- - -Introduce report based moderation flow in ozone diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index c59b44c51c7..8dceda22647 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/api +## 0.19.16 + +### Patch Changes + +- [#4661](https://github.com/bluesky-social/atproto/pull/4661) [`d05b76c`](https://github.com/bluesky-social/atproto/commit/d05b76cdb59e5bf0af739d1dcbe54df5e7faa7b3) Thanks [@foysalit](https://github.com/foysalit)! - Introduce report based moderation flow in ozone + ## 0.19.15 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 02e01678562..5535f8998ce 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.15", + "version": "0.19.16", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 013a5398847..7b1425552ef 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/dev-env +## 0.4.7 + +### Patch Changes + +- [#4661](https://github.com/bluesky-social/atproto/pull/4661) [`d05b76c`](https://github.com/bluesky-social/atproto/commit/d05b76cdb59e5bf0af739d1dcbe54df5e7faa7b3) Thanks [@foysalit](https://github.com/foysalit)! - Introduce report based moderation flow in ozone + +- Updated dependencies [[`d05b76c`](https://github.com/bluesky-social/atproto/commit/d05b76cdb59e5bf0af739d1dcbe54df5e7faa7b3)]: + - @atproto/ozone@0.1.174 + - @atproto/api@0.19.16 + ## 0.4.6 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 6249c28e851..88508a37c07 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.4.6", + "version": "0.4.7", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index 9c788091b6e..c64d620e33c 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/ozone +## 0.1.174 + +### Patch Changes + +- [#4661](https://github.com/bluesky-social/atproto/pull/4661) [`d05b76c`](https://github.com/bluesky-social/atproto/commit/d05b76cdb59e5bf0af739d1dcbe54df5e7faa7b3) Thanks [@foysalit](https://github.com/foysalit)! - Introduce report based moderation flow in ozone + +- Updated dependencies [[`d05b76c`](https://github.com/bluesky-social/atproto/commit/d05b76cdb59e5bf0af739d1dcbe54df5e7faa7b3)]: + - @atproto/api@0.19.16 + ## 0.1.173 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 5636c4f8cd9..113f1539e5d 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.173", + "version": "0.1.174", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ From 733d557d8314265d2c9bdee8d77ba49941dc5d81 Mon Sep 17 00:00:00 2001 From: rafael Date: Fri, 8 May 2026 15:30:32 -0300 Subject: [PATCH 20/87] update courier proto (#4919) --- .changeset/clear-donkeys-stop.md | 5 +++++ packages/bsky/proto/courier.proto | 8 ++++++++ packages/bsky/src/proto/courier_pb.ts | 8 ++++++++ 3 files changed, 21 insertions(+) create mode 100644 .changeset/clear-donkeys-stop.md diff --git a/.changeset/clear-donkeys-stop.md b/.changeset/clear-donkeys-stop.md new file mode 100644 index 00000000000..65f2196cd75 --- /dev/null +++ b/.changeset/clear-donkeys-stop.md @@ -0,0 +1,5 @@ +--- +'@atproto/bsky': patch +--- + +update courier proto diff --git a/packages/bsky/proto/courier.proto b/packages/bsky/proto/courier.proto index c446240b051..e84585ad3ee 100644 --- a/packages/bsky/proto/courier.proto +++ b/packages/bsky/proto/courier.proto @@ -33,6 +33,8 @@ message Notification { google.protobuf.Timestamp timestamp = 7; google.protobuf.Struct additional = 8; bool client_controlled = 9; + // Maps to iOS's `thread-id`: https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification. + string thread_id = 10; } message PushNotificationsRequest { @@ -69,7 +71,13 @@ message SetAgeRestrictedResponse {} service Service { rpc Ping(PingRequest) returns (PingResponse); + + // Push notifications. + rpc PushNotifications(PushNotificationsRequest) returns (PushNotificationsResponse); + + // Device token management. + rpc RegisterDeviceToken(RegisterDeviceTokenRequest) returns (RegisterDeviceTokenResponse); rpc UnregisterDeviceToken(UnregisterDeviceTokenRequest) returns (UnregisterDeviceTokenResponse); rpc SetAgeRestricted(SetAgeRestrictedRequest) returns (SetAgeRestrictedResponse); diff --git a/packages/bsky/src/proto/courier_pb.ts b/packages/bsky/src/proto/courier_pb.ts index 51f2018300a..200c4a782ea 100644 --- a/packages/bsky/src/proto/courier_pb.ts +++ b/packages/bsky/src/proto/courier_pb.ts @@ -151,6 +151,13 @@ export class Notification extends Message { */ clientControlled = false; + /** + * Maps to iOS's `thread-id`: https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification. + * + * @generated from field: string thread_id = 10; + */ + threadId = ""; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -168,6 +175,7 @@ export class Notification extends Message { { no: 7, name: "timestamp", kind: "message", T: Timestamp }, { no: 8, name: "additional", kind: "message", T: Struct }, { no: 9, name: "client_controlled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 10, name: "thread_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): Notification { From 907edfa1d16b1074bab4dc617d0bd1a810f3da02 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Mon, 11 May 2026 04:47:52 +0100 Subject: [PATCH 21/87] Improve lex SDK JSDoc (#4888) --- .changeset/tall-views-lick.md | 5 +++++ packages/lex/lex-client/src/client.ts | 20 ++++++++++++++++++-- packages/lex/lex-client/src/response.ts | 19 ++++++++++++++++++- 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 .changeset/tall-views-lick.md diff --git a/.changeset/tall-views-lick.md b/.changeset/tall-views-lick.md new file mode 100644 index 00000000000..80b9e349371 --- /dev/null +++ b/.changeset/tall-views-lick.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-client': patch +--- + +Small JSDoc improvements diff --git a/packages/lex/lex-client/src/client.ts b/packages/lex/lex-client/src/client.ts index 43fb767affc..71f44017707 100644 --- a/packages/lex/lex-client/src/client.ts +++ b/packages/lex/lex-client/src/client.ts @@ -63,12 +63,26 @@ export type { /** * Configuration options for creating a {@link Client}. * + * @property {@link ClientOptions.labelers} - An iterable of labeler DIDs to include in requests. These will be combined with any global app labelers configured via {@link Client.configure}. + * @property {@link ClientOptions.service} - An optional service identifier (DID or URL) for routing requests with service proxying. + * @property {@link ClientOptions.headers} - Custom headers to include in all requests made by this client instance. + * @property {@link ClientOptions.validateRequest} - If true, validates request bodies against their lexicon schemas before sending. Defaults to false for performance. + * @property {@link ClientOptions.validateResponse} - If false, skips validation of response bodies against their lexicon schemas. Defaults to true to catch errors, but can be disabled for performance if you trust the server responses. Note that defaults will not be applied if validation is disabled, which can cause typing inconsistencies, so use with caution. + * @property {@link ClientOptions.strictResponseProcessing} - If false, relaxes certain validation rules during response processing (e.g., allowing floats, deeper nesting, etc.). Defaults to true for strict compliance with {@link https://atproto.com/specs/data-model lexicon data model}, but can be disabled to handle non-compliant responses. + * + * @see {@link XrpcRequestHeadersOptions} + * @see {@link XrpcRequestProcessingOptions} + * @see {@link XrpcResponseOptions} + * * @example * ```typescript * const options: ClientOptions = { * labelers: ['did:plc:labeler1'], * service: 'did:web:api.bsky.app#bsky_appview', - * headers: { 'X-Custom-Header': 'value' } + * headers: { 'X-Custom-Header': 'value' }, + * validateRequest: false, + * validateResponse: true, + * strictResponseProcessing: false, * } * ``` */ @@ -223,6 +237,7 @@ export type RecordKeyOptions< /** * Type-safe options for {@link Client.create}, combining record options with key requirements. * @typeParam T - The record schema type + * @see {@link CreateRecordOptions} */ export type CreateOptions = CreateRecordOptions & RecordKeyOptions @@ -321,9 +336,10 @@ export type ListRecord = * services. It provides type-safe methods for XRPC calls, record operations, * and blob handling. * - * @example // Basic usage + * @example * ```typescript * import { Client } from '@atproto/lex' + * import { app } from '#/lexicons * * const client = new Client(oauthSession) * diff --git a/packages/lex/lex-client/src/response.ts b/packages/lex/lex-client/src/response.ts index 5d77a535bb3..7a89b8e1e42 100644 --- a/packages/lex/lex-client/src/response.ts +++ b/packages/lex/lex-client/src/response.ts @@ -117,9 +117,26 @@ export type XrpcResponseOptions = { } /** - * Small container for XRPC response data. + * Small container for XRPC response. * * @implements {ResultSuccess>} for convenience in result handling contexts. + * + * @example + * + * ```typescript + * import { app } from '#/lexicons' + * import { XrpcResponse } from '@atproto/lex-client' + * + * const fetchResponse = await fetch('https://example.com/xrpc/app.bsky.feed.getTimeline') + * + * const response = await XrpcResponse.fromFetchResponse( + * app.bsky.feed.getTimeline.main, + * fetchResponse, + * ) + * + * // Fully typed (validated) response body, according to the method's output schema + * const { cursor, feed } = response.body + * ``` */ export class XrpcResponse implements ResultSuccess> From 6ccfa49cdf3f995dd6f30f594d284aa0fe395e61 Mon Sep 17 00:00:00 2001 From: "Ms. Boba" Date: Mon, 11 May 2026 04:10:57 -0700 Subject: [PATCH 22/87] Fix "impossible" comparison in serviceAuth (#4892) * fix impossible comparison in service auth * add changeset --------- Co-authored-by: Matthieu Sieben --- .changeset/many-ravens-travel.md | 5 ++ .../lex/lex-server/src/service-auth.test.ts | 87 +++++++++++++++++++ packages/lex/lex-server/src/service-auth.ts | 2 +- 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 .changeset/many-ravens-travel.md create mode 100644 packages/lex/lex-server/src/service-auth.test.ts diff --git a/.changeset/many-ravens-travel.md b/.changeset/many-ravens-travel.md new file mode 100644 index 00000000000..1bb19ada1df --- /dev/null +++ b/.changeset/many-ravens-travel.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-server': patch +--- + +Fix `lxm` service token validation diff --git a/packages/lex/lex-server/src/service-auth.test.ts b/packages/lex/lex-server/src/service-auth.test.ts new file mode 100644 index 00000000000..6f7ba405a2d --- /dev/null +++ b/packages/lex/lex-server/src/service-auth.test.ts @@ -0,0 +1,87 @@ +import { describe, expect, it, vi } from 'vitest' +import { serviceAuth } from './service-auth.js' + +describe('serviceAuth - lxm validation', () => { + const audience = 'did:web:api.example.com' + const issuer = 'did:web:caller.example.com' + const nsid = 'io.example.test' + + function makeJwt(payload: Record): string { + const header = Buffer.from( + JSON.stringify({ alg: 'ES256K', typ: 'JWT' }), + ).toString('base64url') + const body = Buffer.from(JSON.stringify(payload)).toString('base64url') + const sig = Buffer.from([0]).toString('base64url') + return `${header}.${body}.${sig}` + } + + function basePayload(overrides: Record = {}) { + const now = Math.floor(Date.now() / 1000) + return { iss: issuer, aud: audience, iat: now, exp: now + 60, ...overrides } + } + + function setup() { + const resolve = vi.fn(async () => { + throw new Error('stop after lxm check') + }) + const auth = serviceAuth({ + audience, + unique: async () => true, + didResolver: { resolve }, + }) + return { auth, resolve } + } + + it('rejects with BadJwtLexiconMethod when lxm does not match method.nsid', async () => { + const { auth, resolve } = setup() + const jwt = makeJwt(basePayload({ lxm: 'io.example.different' })) + const request = new Request(`https://api.example.com/xrpc/${nsid}`, { + headers: { authorization: `Bearer ${jwt}` }, + }) + + await expect( + auth({ request, method: { nsid } as any, params: {} }), + ).rejects.toThrow('Invalid JWT lexicon method ("lxm")') + expect(resolve).not.toHaveBeenCalled() + }) + + it('passes lxm check when payload.lxm matches method.nsid', async () => { + const { auth, resolve } = setup() + const jwt = makeJwt(basePayload({ lxm: nsid })) + const request = new Request(`https://api.example.com/xrpc/${nsid}`, { + headers: { authorization: `Bearer ${jwt}` }, + }) + + await expect( + auth({ request, method: { nsid } as any, params: {} }), + ).rejects.toThrow() + // The DID resolver isn't called unless "lxm" validation succeeded + expect(resolve).toHaveBeenCalled() + }) + + it('skips lxm check when payload has no lxm claim', async () => { + const { auth, resolve } = setup() + const jwt = makeJwt(basePayload()) + const request = new Request(`https://api.example.com/xrpc/${nsid}`, { + headers: { authorization: `Bearer ${jwt}` }, + }) + + await expect( + auth({ request, method: { nsid } as any, params: {} }), + ).rejects.toThrow() + expect(resolve).toHaveBeenCalled() + }) + + it('rejects an empty-string lxm claim against a real NSID', async () => { + const { auth, resolve } = setup() + const jwt = makeJwt(basePayload({ lxm: '' })) + const request = new Request(`https://api.example.com/xrpc/${nsid}`, { + headers: { authorization: `Bearer ${jwt}` }, + }) + + await expect( + auth({ request, method: { nsid } as any, params: {} }), + ).rejects.toThrow('Invalid JWT lexicon method ("lxm")') + expect(resolve).not.toHaveBeenCalled() + }) +}) diff --git a/packages/lex/lex-server/src/service-auth.ts b/packages/lex/lex-server/src/service-auth.ts index fd69f7c1a67..030fb6ad2da 100644 --- a/packages/lex/lex-server/src/service-auth.ts +++ b/packages/lex/lex-server/src/service-auth.ts @@ -442,7 +442,7 @@ async function parseJwt( ) } - if (payload.lxm != null && typeof payload.lxm !== options.lxm) { + if (payload.lxm != null && payload.lxm !== options.lxm) { throw new LexServerAuthError( 'AuthenticationRequired', 'Invalid JWT lexicon method ("lxm")', From 8ffae17323df37f2be1dd7286bb9443fa1aa5b42 Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 11 May 2026 13:31:58 -0300 Subject: [PATCH 23/87] update chat lexicons (#4924) * update chat lexicons * codegen --- .changeset/bright-foxes-jump.md | 5 +++++ lexicons/chat/bsky/convo/listConvos.json | 5 +++++ packages/api/src/client/lexicons.ts | 6 ++++++ packages/api/src/client/types/chat/bsky/convo/listConvos.ts | 2 ++ packages/ozone/src/lexicon/lexicons.ts | 6 ++++++ .../ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts | 2 ++ 6 files changed, 26 insertions(+) create mode 100644 .changeset/bright-foxes-jump.md diff --git a/.changeset/bright-foxes-jump.md b/.changeset/bright-foxes-jump.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/bright-foxes-jump.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/convo/listConvos.json b/lexicons/chat/bsky/convo/listConvos.json index 098b66aac15..68deb2d6f07 100644 --- a/lexicons/chat/bsky/convo/listConvos.json +++ b/lexicons/chat/bsky/convo/listConvos.json @@ -28,6 +28,11 @@ "type": "string", "description": "Filter by conversation kind.", "knownValues": ["direct", "group"] + }, + "lockStatus": { + "type": "string", + "description": "Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus.", + "knownValues": ["unlocked", "locked", "locked-permanently"] } } }, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 77fd3860e52..39ab8d52472 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -11480,6 +11480,12 @@ export const schemaDict = { description: 'Filter by conversation kind.', knownValues: ['direct', 'group'], }, + lockStatus: { + type: 'string', + description: + 'Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus.', + knownValues: ['unlocked', 'locked', 'locked-permanently'], + }, }, }, output: { diff --git a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts index b1036369dbb..9e2123769ce 100644 --- a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts +++ b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts @@ -24,6 +24,8 @@ export type QueryParams = { status?: 'request' | 'accepted' | (string & {}) /** Filter by conversation kind. */ kind?: 'direct' | 'group' | (string & {}) + /** Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus. */ + lockStatus?: 'unlocked' | 'locked' | 'locked-permanently' | (string & {}) } export type InputSchema = undefined diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 359e0b8827f..71afb9d3aa6 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -11480,6 +11480,12 @@ export const schemaDict = { description: 'Filter by conversation kind.', knownValues: ['direct', 'group'], }, + lockStatus: { + type: 'string', + description: + 'Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus.', + knownValues: ['unlocked', 'locked', 'locked-permanently'], + }, }, }, output: { diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts index 97f0f22675e..5479e745b0e 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts @@ -23,6 +23,8 @@ export type QueryParams = { status?: 'request' | 'accepted' | (string & {}) /** Filter by conversation kind. */ kind?: 'direct' | 'group' | (string & {}) + /** Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus. */ + lockStatus?: 'unlocked' | 'locked' | 'locked-permanently' | (string & {}) } export type InputSchema = undefined From 2fd8d62708dc23de6ed21cbcccfebab68b19f588 Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 11 May 2026 14:56:58 -0300 Subject: [PATCH 24/87] increase string preview in validation error (#4925) --- .changeset/olive-bottles-jog.md | 5 +++++ packages/lex/lex-schema/src/core/validation-issue.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/olive-bottles-jog.md diff --git a/.changeset/olive-bottles-jog.md b/.changeset/olive-bottles-jog.md new file mode 100644 index 00000000000..0f32ab99833 --- /dev/null +++ b/.changeset/olive-bottles-jog.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-schema': patch +--- + +Increase string preview validation error diff --git a/packages/lex/lex-schema/src/core/validation-issue.ts b/packages/lex/lex-schema/src/core/validation-issue.ts index a030cb8bae1..c4206b01905 100644 --- a/packages/lex/lex-schema/src/core/validation-issue.ts +++ b/packages/lex/lex-schema/src/core/validation-issue.ts @@ -1,6 +1,6 @@ import { ifCid, isLegacyBlobRef, isPlainObject } from '@atproto/lex-data' -const STRING_PREVIEW_MAX_LENGTH = 48 +const STRING_PREVIEW_MAX_LENGTH = 256 const STRING_PREVIEW_TRUNCATED_SUFFIX = '…' /** From 4502df140600fc74ef5b69db84ff4529797f3ca3 Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 11 May 2026 17:36:04 -0300 Subject: [PATCH 25/87] update chat lexicons (#4926) * update chat lexicons * changeset --- .changeset/neat-lights-march.md | 5 +++++ lexicons/chat/bsky/authFullChatClient.json | 2 +- lexicons/chat/bsky/group/defs.json | 9 +++++++-- ...ublicInfo.json => getJoinLinkPreview.json} | 8 ++++---- packages/api/src/client/index.ts | 16 +++++++-------- packages/api/src/client/lexicons.ts | 20 ++++++++++++------- .../src/client/types/chat/bsky/group/defs.ts | 16 ++++++++------- ...oupPublicInfo.ts => getJoinLinkPreview.ts} | 4 ++-- packages/ozone/src/lexicon/index.ts | 12 +++++------ packages/ozone/src/lexicon/lexicons.ts | 20 ++++++++++++------- .../src/lexicon/types/chat/bsky/group/defs.ts | 16 ++++++++------- ...oupPublicInfo.ts => getJoinLinkPreview.ts} | 4 ++-- 12 files changed, 79 insertions(+), 53 deletions(-) create mode 100644 .changeset/neat-lights-march.md rename lexicons/chat/bsky/group/{getGroupPublicInfo.json => getJoinLinkPreview.json} (78%) rename packages/api/src/client/types/chat/bsky/group/{getGroupPublicInfo.ts => getJoinLinkPreview.ts} (91%) rename packages/ozone/src/lexicon/types/chat/bsky/group/{getGroupPublicInfo.ts => getJoinLinkPreview.ts} (88%) diff --git a/.changeset/neat-lights-march.md b/.changeset/neat-lights-march.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/neat-lights-march.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/authFullChatClient.json b/lexicons/chat/bsky/authFullChatClient.json index 4593bd03e22..8cf70ea290d 100644 --- a/lexicons/chat/bsky/authFullChatClient.json +++ b/lexicons/chat/bsky/authFullChatClient.json @@ -47,7 +47,7 @@ "chat.bsky.group.editGroup", "chat.bsky.group.editJoinLink", "chat.bsky.group.enableJoinLink", - "chat.bsky.group.getGroupPublicInfo", + "chat.bsky.group.getJoinLinkPreview", "chat.bsky.group.listJoinRequests", "chat.bsky.group.rejectJoinRequest", "chat.bsky.group.removeMembers", diff --git a/lexicons/chat/bsky/group/defs.json b/lexicons/chat/bsky/group/defs.json index 91aa9cb4dc5..3bf4816ecbb 100644 --- a/lexicons/chat/bsky/group/defs.json +++ b/lexicons/chat/bsky/group/defs.json @@ -31,7 +31,7 @@ "createdAt": { "type": "string", "format": "datetime" } } }, - "groupPublicView": { + "joinLinkPreviewView": { "type": "object", "required": ["name", "owner", "memberCount", "requireApproval"], "properties": { @@ -41,7 +41,12 @@ "ref": "chat.bsky.actor.defs#profileViewBasic" }, "memberCount": { "type": "integer" }, - "requireApproval": { "type": "boolean" } + "requireApproval": { "type": "boolean" }, + "convo": { + "type": "ref", + "ref": "chat.bsky.convo.defs#convoView", + "description": "Present only if the request is authenticated and the user is a member of the group." + } } }, "joinRequestView": { diff --git a/lexicons/chat/bsky/group/getGroupPublicInfo.json b/lexicons/chat/bsky/group/getJoinLinkPreview.json similarity index 78% rename from lexicons/chat/bsky/group/getGroupPublicInfo.json rename to lexicons/chat/bsky/group/getJoinLinkPreview.json index 85b6563ccff..6cc2389edd7 100644 --- a/lexicons/chat/bsky/group/getGroupPublicInfo.json +++ b/lexicons/chat/bsky/group/getJoinLinkPreview.json @@ -1,6 +1,6 @@ { "lexicon": 1, - "id": "chat.bsky.group.getGroupPublicInfo", + "id": "chat.bsky.group.getJoinLinkPreview", "defs": { "main": { "type": "query", @@ -17,11 +17,11 @@ "encoding": "application/json", "schema": { "type": "object", - "required": ["group"], + "required": ["joinLinkPreview"], "properties": { - "group": { + "joinLinkPreview": { "type": "ref", - "ref": "chat.bsky.group.defs#groupPublicView" + "ref": "chat.bsky.group.defs#joinLinkPreviewView" } } } diff --git a/packages/api/src/client/index.ts b/packages/api/src/client/index.ts index 2629d4681ac..ff1bc4f77e1 100644 --- a/packages/api/src/client/index.ts +++ b/packages/api/src/client/index.ts @@ -189,7 +189,7 @@ import * as ChatBskyGroupDisableJoinLink from './types/chat/bsky/group/disableJo import * as ChatBskyGroupEditGroup from './types/chat/bsky/group/editGroup.js' import * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink.js' import * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' -import * as ChatBskyGroupGetGroupPublicInfo from './types/chat/bsky/group/getGroupPublicInfo.js' +import * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' import * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' import * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' import * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' @@ -550,7 +550,7 @@ export * as ChatBskyGroupDisableJoinLink from './types/chat/bsky/group/disableJo export * as ChatBskyGroupEditGroup from './types/chat/bsky/group/editGroup.js' export * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink.js' export * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' -export * as ChatBskyGroupGetGroupPublicInfo from './types/chat/bsky/group/getGroupPublicInfo.js' +export * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' export * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' export * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' export * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' @@ -4152,14 +4152,14 @@ export class ChatBskyGroupNS { }) } - getGroupPublicInfo( - params?: ChatBskyGroupGetGroupPublicInfo.QueryParams, - opts?: ChatBskyGroupGetGroupPublicInfo.CallOptions, - ): Promise { + getJoinLinkPreview( + params?: ChatBskyGroupGetJoinLinkPreview.QueryParams, + opts?: ChatBskyGroupGetJoinLinkPreview.CallOptions, + ): Promise { return this._client - .call('chat.bsky.group.getGroupPublicInfo', params, undefined, opts) + .call('chat.bsky.group.getJoinLinkPreview', params, undefined, opts) .catch((e) => { - throw ChatBskyGroupGetGroupPublicInfo.toKnownErr(e) + throw ChatBskyGroupGetJoinLinkPreview.toKnownErr(e) }) } diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 39ab8d52472..63ca56b0e09 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -12228,7 +12228,7 @@ export const schemaDict = { }, }, }, - groupPublicView: { + joinLinkPreviewView: { type: 'object', required: ['name', 'owner', 'memberCount', 'requireApproval'], properties: { @@ -12245,6 +12245,12 @@ export const schemaDict = { requireApproval: { type: 'boolean', }, + convo: { + type: 'ref', + ref: 'lex:chat.bsky.convo.defs#convoView', + description: + 'Present only if the request is authenticated and the user is a member of the group.', + }, }, }, joinRequestView: { @@ -12470,9 +12476,9 @@ export const schemaDict = { }, }, }, - ChatBskyGroupGetGroupPublicInfo: { + ChatBskyGroupGetJoinLinkPreview: { lexicon: 1, - id: 'chat.bsky.group.getGroupPublicInfo', + id: 'chat.bsky.group.getJoinLinkPreview', defs: { main: { type: 'query', @@ -12496,11 +12502,11 @@ export const schemaDict = { encoding: 'application/json', schema: { type: 'object', - required: ['group'], + required: ['joinLinkPreview'], properties: { - group: { + joinLinkPreview: { type: 'ref', - ref: 'lex:chat.bsky.group.defs#groupPublicView', + ref: 'lex:chat.bsky.group.defs#joinLinkPreviewView', }, }, }, @@ -24954,7 +24960,7 @@ export const ids = { ChatBskyGroupEditGroup: 'chat.bsky.group.editGroup', ChatBskyGroupEditJoinLink: 'chat.bsky.group.editJoinLink', ChatBskyGroupEnableJoinLink: 'chat.bsky.group.enableJoinLink', - ChatBskyGroupGetGroupPublicInfo: 'chat.bsky.group.getGroupPublicInfo', + ChatBskyGroupGetJoinLinkPreview: 'chat.bsky.group.getJoinLinkPreview', ChatBskyGroupListJoinRequests: 'chat.bsky.group.listJoinRequests', ChatBskyGroupRejectJoinRequest: 'chat.bsky.group.rejectJoinRequest', ChatBskyGroupRemoveMembers: 'chat.bsky.group.removeMembers', diff --git a/packages/api/src/client/types/chat/bsky/group/defs.ts b/packages/api/src/client/types/chat/bsky/group/defs.ts index 22710307e01..c98d2e2a045 100644 --- a/packages/api/src/client/types/chat/bsky/group/defs.ts +++ b/packages/api/src/client/types/chat/bsky/group/defs.ts @@ -10,6 +10,7 @@ import { type OmitKey, } from '../../../../util' import type * as ChatBskyActorDefs from '../actor/defs.js' +import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, validate = _validate @@ -37,22 +38,23 @@ export function validateJoinLinkView(v: V) { return validate(v, id, hashJoinLinkView) } -export interface GroupPublicView { - $type?: 'chat.bsky.group.defs#groupPublicView' +export interface JoinLinkPreviewView { + $type?: 'chat.bsky.group.defs#joinLinkPreviewView' name: string owner: ChatBskyActorDefs.ProfileViewBasic memberCount: number requireApproval: boolean + convo?: ChatBskyConvoDefs.ConvoView } -const hashGroupPublicView = 'groupPublicView' +const hashJoinLinkPreviewView = 'joinLinkPreviewView' -export function isGroupPublicView(v: V) { - return is$typed(v, id, hashGroupPublicView) +export function isJoinLinkPreviewView(v: V) { + return is$typed(v, id, hashJoinLinkPreviewView) } -export function validateGroupPublicView(v: V) { - return validate(v, id, hashGroupPublicView) +export function validateJoinLinkPreviewView(v: V) { + return validate(v, id, hashJoinLinkPreviewView) } export interface JoinRequestView { diff --git a/packages/api/src/client/types/chat/bsky/group/getGroupPublicInfo.ts b/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts similarity index 91% rename from packages/api/src/client/types/chat/bsky/group/getGroupPublicInfo.ts rename to packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts index 616f7475fb2..a560b76f750 100644 --- a/packages/api/src/client/types/chat/bsky/group/getGroupPublicInfo.ts +++ b/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts @@ -14,7 +14,7 @@ import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, validate = _validate -const id = 'chat.bsky.group.getGroupPublicInfo' +const id = 'chat.bsky.group.getJoinLinkPreview' export type QueryParams = { code: string @@ -22,7 +22,7 @@ export type QueryParams = { export type InputSchema = undefined export interface OutputSchema { - group: ChatBskyGroupDefs.GroupPublicView + joinLinkPreview: ChatBskyGroupDefs.JoinLinkPreviewView } export interface CallOptions { diff --git a/packages/ozone/src/lexicon/index.ts b/packages/ozone/src/lexicon/index.ts index d51182aa757..5c551b96481 100644 --- a/packages/ozone/src/lexicon/index.ts +++ b/packages/ozone/src/lexicon/index.ts @@ -151,7 +151,7 @@ import * as ChatBskyGroupDisableJoinLink from './types/chat/bsky/group/disableJo import * as ChatBskyGroupEditGroup from './types/chat/bsky/group/editGroup.js' import * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink.js' import * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' -import * as ChatBskyGroupGetGroupPublicInfo from './types/chat/bsky/group/getGroupPublicInfo.js' +import * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' import * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' import * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' import * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' @@ -2329,15 +2329,15 @@ export class ChatBskyGroupNS { return this._server.xrpc.method(nsid, cfg) } - getGroupPublicInfo( + getJoinLinkPreview( cfg: MethodConfigOrHandler< A, - ChatBskyGroupGetGroupPublicInfo.QueryParams, - ChatBskyGroupGetGroupPublicInfo.HandlerInput, - ChatBskyGroupGetGroupPublicInfo.HandlerOutput + ChatBskyGroupGetJoinLinkPreview.QueryParams, + ChatBskyGroupGetJoinLinkPreview.HandlerInput, + ChatBskyGroupGetJoinLinkPreview.HandlerOutput >, ) { - const nsid = 'chat.bsky.group.getGroupPublicInfo' // @ts-ignore + const nsid = 'chat.bsky.group.getJoinLinkPreview' // @ts-ignore return this._server.xrpc.method(nsid, cfg) } diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 71afb9d3aa6..a479fb59646 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -12228,7 +12228,7 @@ export const schemaDict = { }, }, }, - groupPublicView: { + joinLinkPreviewView: { type: 'object', required: ['name', 'owner', 'memberCount', 'requireApproval'], properties: { @@ -12245,6 +12245,12 @@ export const schemaDict = { requireApproval: { type: 'boolean', }, + convo: { + type: 'ref', + ref: 'lex:chat.bsky.convo.defs#convoView', + description: + 'Present only if the request is authenticated and the user is a member of the group.', + }, }, }, joinRequestView: { @@ -12470,9 +12476,9 @@ export const schemaDict = { }, }, }, - ChatBskyGroupGetGroupPublicInfo: { + ChatBskyGroupGetJoinLinkPreview: { lexicon: 1, - id: 'chat.bsky.group.getGroupPublicInfo', + id: 'chat.bsky.group.getJoinLinkPreview', defs: { main: { type: 'query', @@ -12496,11 +12502,11 @@ export const schemaDict = { encoding: 'application/json', schema: { type: 'object', - required: ['group'], + required: ['joinLinkPreview'], properties: { - group: { + joinLinkPreview: { type: 'ref', - ref: 'lex:chat.bsky.group.defs#groupPublicView', + ref: 'lex:chat.bsky.group.defs#joinLinkPreviewView', }, }, }, @@ -24885,7 +24891,7 @@ export const ids = { ChatBskyGroupEditGroup: 'chat.bsky.group.editGroup', ChatBskyGroupEditJoinLink: 'chat.bsky.group.editJoinLink', ChatBskyGroupEnableJoinLink: 'chat.bsky.group.enableJoinLink', - ChatBskyGroupGetGroupPublicInfo: 'chat.bsky.group.getGroupPublicInfo', + ChatBskyGroupGetJoinLinkPreview: 'chat.bsky.group.getJoinLinkPreview', ChatBskyGroupListJoinRequests: 'chat.bsky.group.listJoinRequests', ChatBskyGroupRejectJoinRequest: 'chat.bsky.group.rejectJoinRequest', ChatBskyGroupRemoveMembers: 'chat.bsky.group.removeMembers', diff --git a/packages/ozone/src/lexicon/types/chat/bsky/group/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/group/defs.ts index 22710307e01..c98d2e2a045 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/group/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/group/defs.ts @@ -10,6 +10,7 @@ import { type OmitKey, } from '../../../../util' import type * as ChatBskyActorDefs from '../actor/defs.js' +import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, validate = _validate @@ -37,22 +38,23 @@ export function validateJoinLinkView(v: V) { return validate(v, id, hashJoinLinkView) } -export interface GroupPublicView { - $type?: 'chat.bsky.group.defs#groupPublicView' +export interface JoinLinkPreviewView { + $type?: 'chat.bsky.group.defs#joinLinkPreviewView' name: string owner: ChatBskyActorDefs.ProfileViewBasic memberCount: number requireApproval: boolean + convo?: ChatBskyConvoDefs.ConvoView } -const hashGroupPublicView = 'groupPublicView' +const hashJoinLinkPreviewView = 'joinLinkPreviewView' -export function isGroupPublicView(v: V) { - return is$typed(v, id, hashGroupPublicView) +export function isJoinLinkPreviewView(v: V) { + return is$typed(v, id, hashJoinLinkPreviewView) } -export function validateGroupPublicView(v: V) { - return validate(v, id, hashGroupPublicView) +export function validateJoinLinkPreviewView(v: V) { + return validate(v, id, hashJoinLinkPreviewView) } export interface JoinRequestView { diff --git a/packages/ozone/src/lexicon/types/chat/bsky/group/getGroupPublicInfo.ts b/packages/ozone/src/lexicon/types/chat/bsky/group/getJoinLinkPreview.ts similarity index 88% rename from packages/ozone/src/lexicon/types/chat/bsky/group/getGroupPublicInfo.ts rename to packages/ozone/src/lexicon/types/chat/bsky/group/getJoinLinkPreview.ts index f65b31018f2..191a8b3c7b8 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/group/getGroupPublicInfo.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/group/getJoinLinkPreview.ts @@ -13,7 +13,7 @@ import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, validate = _validate -const id = 'chat.bsky.group.getGroupPublicInfo' +const id = 'chat.bsky.group.getJoinLinkPreview' export type QueryParams = { code: string @@ -21,7 +21,7 @@ export type QueryParams = { export type InputSchema = undefined export interface OutputSchema { - group: ChatBskyGroupDefs.GroupPublicView + joinLinkPreview: ChatBskyGroupDefs.JoinLinkPreviewView } export type HandlerInput = void From 2440d55ddd40bfeb7415993062f3fdda48188017 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 13:43:15 -0700 Subject: [PATCH 26/87] Version packages (#4920) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/bright-foxes-jump.md | 5 ----- .changeset/clear-donkeys-stop.md | 5 ----- .changeset/many-ravens-travel.md | 5 ----- .changeset/neat-lights-march.md | 5 ----- .changeset/olive-bottles-jog.md | 5 ----- .changeset/tall-views-lick.md | 5 ----- packages/api/CHANGELOG.md | 8 ++++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 12 ++++++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 12 ++++++++++++ packages/dev-env/package.json | 2 +- packages/lex/lex-builder/CHANGELOG.md | 8 ++++++++ packages/lex/lex-builder/package.json | 2 +- packages/lex/lex-client/CHANGELOG.md | 9 +++++++++ packages/lex/lex-client/package.json | 2 +- packages/lex/lex-document/CHANGELOG.md | 7 +++++++ packages/lex/lex-document/package.json | 2 +- packages/lex/lex-installer/CHANGELOG.md | 10 ++++++++++ packages/lex/lex-installer/package.json | 2 +- packages/lex/lex-password-session/CHANGELOG.md | 8 ++++++++ packages/lex/lex-password-session/package.json | 2 +- packages/lex/lex-resolver/CHANGELOG.md | 9 +++++++++ packages/lex/lex-resolver/package.json | 2 +- packages/lex/lex-schema/CHANGELOG.md | 6 ++++++ packages/lex/lex-schema/package.json | 2 +- packages/lex/lex-server/CHANGELOG.md | 10 ++++++++++ packages/lex/lex-server/package.json | 2 +- packages/lex/lex/CHANGELOG.md | 10 ++++++++++ packages/lex/lex/package.json | 2 +- packages/lexicon-resolver/CHANGELOG.md | 8 ++++++++ packages/lexicon-resolver/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 8 ++++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/pds/CHANGELOG.md | 9 +++++++++ packages/pds/package.json | 2 +- packages/sync/CHANGELOG.md | 8 ++++++++ packages/sync/package.json | 2 +- packages/tap/CHANGELOG.md | 7 +++++++ packages/tap/package.json | 2 +- packages/xrpc-server/CHANGELOG.md | 8 ++++++++ packages/xrpc-server/package.json | 2 +- 42 files changed, 175 insertions(+), 48 deletions(-) delete mode 100644 .changeset/bright-foxes-jump.md delete mode 100644 .changeset/clear-donkeys-stop.md delete mode 100644 .changeset/many-ravens-travel.md delete mode 100644 .changeset/neat-lights-march.md delete mode 100644 .changeset/olive-bottles-jog.md delete mode 100644 .changeset/tall-views-lick.md diff --git a/.changeset/bright-foxes-jump.md b/.changeset/bright-foxes-jump.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/bright-foxes-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/.changeset/clear-donkeys-stop.md b/.changeset/clear-donkeys-stop.md deleted file mode 100644 index 65f2196cd75..00000000000 --- a/.changeset/clear-donkeys-stop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/bsky': patch ---- - -update courier proto diff --git a/.changeset/many-ravens-travel.md b/.changeset/many-ravens-travel.md deleted file mode 100644 index 1bb19ada1df..00000000000 --- a/.changeset/many-ravens-travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lex-server': patch ---- - -Fix `lxm` service token validation diff --git a/.changeset/neat-lights-march.md b/.changeset/neat-lights-march.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/neat-lights-march.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/.changeset/olive-bottles-jog.md b/.changeset/olive-bottles-jog.md deleted file mode 100644 index 0f32ab99833..00000000000 --- a/.changeset/olive-bottles-jog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lex-schema': patch ---- - -Increase string preview validation error diff --git a/.changeset/tall-views-lick.md b/.changeset/tall-views-lick.md deleted file mode 100644 index 80b9e349371..00000000000 --- a/.changeset/tall-views-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lex-client': patch ---- - -Small JSDoc improvements diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 8dceda22647..a6beb73a8fc 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/api +## 0.19.17 + +### Patch Changes + +- [#4924](https://github.com/bluesky-social/atproto/pull/4924) [`8ffae17`](https://github.com/bluesky-social/atproto/commit/8ffae17323df37f2be1dd7286bb9443fa1aa5b42) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + +- [#4926](https://github.com/bluesky-social/atproto/pull/4926) [`4502df1`](https://github.com/bluesky-social/atproto/commit/4502df140600fc74ef5b69db84ff4529797f3ca3) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + ## 0.19.16 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 5535f8998ce..0b714e19612 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.16", + "version": "0.19.17", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 1b499be3b3a..9f353299fe6 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/bsky +## 0.0.229 + +### Patch Changes + +- [#4919](https://github.com/bluesky-social/atproto/pull/4919) [`733d557`](https://github.com/bluesky-social/atproto/commit/733d557d8314265d2c9bdee8d77ba49941dc5d81) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update courier proto + +- Updated dependencies [[`8ffae17`](https://github.com/bluesky-social/atproto/commit/8ffae17323df37f2be1dd7286bb9443fa1aa5b42), [`4502df1`](https://github.com/bluesky-social/atproto/commit/4502df140600fc74ef5b69db84ff4529797f3ca3)]: + - @atproto/api@0.19.17 + - @atproto/lex@0.0.26 + - @atproto/xrpc-server@0.10.21 + - @atproto/sync@0.2.3 + ## 0.0.228 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 42560a42fc8..2239c62dba2 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.228", + "version": "0.0.229", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 7b1425552ef..490dc3217c2 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/dev-env +## 0.4.8 + +### Patch Changes + +- Updated dependencies [[`8ffae17`](https://github.com/bluesky-social/atproto/commit/8ffae17323df37f2be1dd7286bb9443fa1aa5b42), [`733d557`](https://github.com/bluesky-social/atproto/commit/733d557d8314265d2c9bdee8d77ba49941dc5d81), [`4502df1`](https://github.com/bluesky-social/atproto/commit/4502df140600fc74ef5b69db84ff4529797f3ca3)]: + - @atproto/api@0.19.17 + - @atproto/bsky@0.0.229 + - @atproto/pds@0.4.222 + - @atproto/lex@0.0.26 + - @atproto/xrpc-server@0.10.21 + - @atproto/sync@0.2.3 + ## 0.4.7 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 88508a37c07..c4d5c1244e0 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.4.7", + "version": "0.4.8", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/lex/lex-builder/CHANGELOG.md b/packages/lex/lex-builder/CHANGELOG.md index af3a976bb78..705f41c48ef 100644 --- a/packages/lex/lex-builder/CHANGELOG.md +++ b/packages/lex/lex-builder/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/lex-builder +## 0.0.23 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-document@0.0.21 + ## 0.0.22 ### Patch Changes diff --git a/packages/lex/lex-builder/package.json b/packages/lex/lex-builder/package.json index 3b3d8c10757..8d55fd2882e 100644 --- a/packages/lex/lex-builder/package.json +++ b/packages/lex/lex-builder/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-builder", - "version": "0.0.22", + "version": "0.0.23", "license": "MIT", "description": "TypeScript schema builder for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-client/CHANGELOG.md b/packages/lex/lex-client/CHANGELOG.md index be8c706dc82..cdb04741cf0 100644 --- a/packages/lex/lex-client/CHANGELOG.md +++ b/packages/lex/lex-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/lex-client +## 0.0.21 + +### Patch Changes + +- [#4888](https://github.com/bluesky-social/atproto/pull/4888) [`907edfa`](https://github.com/bluesky-social/atproto/commit/907edfa1d16b1074bab4dc617d0bd1a810f3da02) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Small JSDoc improvements + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588)]: + - @atproto/lex-schema@0.0.20 + ## 0.0.20 ### Patch Changes diff --git a/packages/lex/lex-client/package.json b/packages/lex/lex-client/package.json index d6da1fbe07a..b0e0183532c 100644 --- a/packages/lex/lex-client/package.json +++ b/packages/lex/lex-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-client", - "version": "0.0.20", + "version": "0.0.21", "license": "MIT", "description": "HTTP client for interacting with Lexicon based APIs", "keywords": [ diff --git a/packages/lex/lex-document/CHANGELOG.md b/packages/lex/lex-document/CHANGELOG.md index 2152b874c7d..3baa4e8fd4b 100644 --- a/packages/lex/lex-document/CHANGELOG.md +++ b/packages/lex/lex-document/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/lex-document +## 0.0.21 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588)]: + - @atproto/lex-schema@0.0.20 + ## 0.0.20 ### Patch Changes diff --git a/packages/lex/lex-document/package.json b/packages/lex/lex-document/package.json index e0e0277fca8..f14b19b6b02 100644 --- a/packages/lex/lex-document/package.json +++ b/packages/lex/lex-document/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-document", - "version": "0.0.20", + "version": "0.0.21", "license": "MIT", "description": "Lexicon document validation tools for AT", "keywords": [ diff --git a/packages/lex/lex-installer/CHANGELOG.md b/packages/lex/lex-installer/CHANGELOG.md index d686cb6143c..4d8df19e370 100644 --- a/packages/lex/lex-installer/CHANGELOG.md +++ b/packages/lex/lex-installer/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/lex-installer +## 0.0.26 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-builder@0.0.23 + - @atproto/lex-document@0.0.21 + - @atproto/lex-resolver@0.0.23 + ## 0.0.25 ### Patch Changes diff --git a/packages/lex/lex-installer/package.json b/packages/lex/lex-installer/package.json index b1dc11272ac..1231de7e56f 100644 --- a/packages/lex/lex-installer/package.json +++ b/packages/lex/lex-installer/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-installer", - "version": "0.0.25", + "version": "0.0.26", "license": "MIT", "description": "Lexicon document packet manager for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-password-session/CHANGELOG.md b/packages/lex/lex-password-session/CHANGELOG.md index b7af274738a..20b8822587d 100644 --- a/packages/lex/lex-password-session/CHANGELOG.md +++ b/packages/lex/lex-password-session/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/lex-password-session +## 0.0.14 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588), [`907edfa`](https://github.com/bluesky-social/atproto/commit/907edfa1d16b1074bab4dc617d0bd1a810f3da02)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-client@0.0.21 + ## 0.0.13 ### Patch Changes diff --git a/packages/lex/lex-password-session/package.json b/packages/lex/lex-password-session/package.json index 96242b8ea78..9d04ac12e45 100644 --- a/packages/lex/lex-password-session/package.json +++ b/packages/lex/lex-password-session/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-password-session", - "version": "0.0.13", + "version": "0.0.14", "license": "MIT", "description": "Password based client authentication for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-resolver/CHANGELOG.md b/packages/lex/lex-resolver/CHANGELOG.md index a9b3fa71e39..5933a30952f 100644 --- a/packages/lex/lex-resolver/CHANGELOG.md +++ b/packages/lex/lex-resolver/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/lex-resolver +## 0.0.23 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588), [`907edfa`](https://github.com/bluesky-social/atproto/commit/907edfa1d16b1074bab4dc617d0bd1a810f3da02)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-client@0.0.21 + - @atproto/lex-document@0.0.21 + ## 0.0.22 ### Patch Changes diff --git a/packages/lex/lex-resolver/package.json b/packages/lex/lex-resolver/package.json index 729161c77ee..dd0a692f1c5 100644 --- a/packages/lex/lex-resolver/package.json +++ b/packages/lex/lex-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-resolver", - "version": "0.0.22", + "version": "0.0.23", "license": "MIT", "description": "Lexicon document resolver utility for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-schema/CHANGELOG.md b/packages/lex/lex-schema/CHANGELOG.md index ed004b1bd31..7570fd17d47 100644 --- a/packages/lex/lex-schema/CHANGELOG.md +++ b/packages/lex/lex-schema/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/lex-schema +## 0.0.20 + +### Patch Changes + +- [#4925](https://github.com/bluesky-social/atproto/pull/4925) [`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - Increase string preview validation error + ## 0.0.19 ### Patch Changes diff --git a/packages/lex/lex-schema/package.json b/packages/lex/lex-schema/package.json index 84aadaa57c5..0c55eb85190 100644 --- a/packages/lex/lex-schema/package.json +++ b/packages/lex/lex-schema/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-schema", - "version": "0.0.19", + "version": "0.0.20", "license": "MIT", "description": "Lexicon schema system for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-server/CHANGELOG.md b/packages/lex/lex-server/CHANGELOG.md index 3fe167f35e2..d9b33582f28 100644 --- a/packages/lex/lex-server/CHANGELOG.md +++ b/packages/lex/lex-server/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/lex-server +## 0.0.18 + +### Patch Changes + +- [#4892](https://github.com/bluesky-social/atproto/pull/4892) [`6ccfa49`](https://github.com/bluesky-social/atproto/commit/6ccfa49cdf3f995dd6f30f594d284aa0fe395e61) Thanks [@essential-randomness](https://github.com/essential-randomness)! - Fix `lxm` service token validation + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588), [`907edfa`](https://github.com/bluesky-social/atproto/commit/907edfa1d16b1074bab4dc617d0bd1a810f3da02)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-client@0.0.21 + ## 0.0.17 ### Patch Changes diff --git a/packages/lex/lex-server/package.json b/packages/lex/lex-server/package.json index f233fa4acef..635d1cc3bff 100644 --- a/packages/lex/lex-server/package.json +++ b/packages/lex/lex-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-server", - "version": "0.0.17", + "version": "0.0.18", "license": "MIT", "description": "Request router for Atproto Lexicon protocols and schemas", "keywords": [ diff --git a/packages/lex/lex/CHANGELOG.md b/packages/lex/lex/CHANGELOG.md index 69fc03a23b5..2270b29b60d 100644 --- a/packages/lex/lex/CHANGELOG.md +++ b/packages/lex/lex/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/lex +## 0.0.26 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588), [`907edfa`](https://github.com/bluesky-social/atproto/commit/907edfa1d16b1074bab4dc617d0bd1a810f3da02)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-client@0.0.21 + - @atproto/lex-builder@0.0.23 + - @atproto/lex-installer@0.0.26 + ## 0.0.25 ### Patch Changes diff --git a/packages/lex/lex/package.json b/packages/lex/lex/package.json index 23cb8e6d95b..114fb4f4c85 100644 --- a/packages/lex/lex/package.json +++ b/packages/lex/lex/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex", - "version": "0.0.25", + "version": "0.0.26", "license": "MIT", "description": "Lexicon tooling for AT", "keywords": [ diff --git a/packages/lexicon-resolver/CHANGELOG.md b/packages/lexicon-resolver/CHANGELOG.md index b2e54355cb6..13491c58370 100644 --- a/packages/lexicon-resolver/CHANGELOG.md +++ b/packages/lexicon-resolver/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/lexicon-resolver +## 0.3.6 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.26 + - @atproto/lex-document@0.0.21 + ## 0.3.5 ### Patch Changes diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 2fbcbebdadc..8c3887bd2b6 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lexicon-resolver", - "version": "0.3.5", + "version": "0.3.6", "type": "commonjs", "license": "MIT", "description": "ATProto Lexicon resolution", diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index fe3816c1de7..3ef0e7434ef 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/oauth-provider +## 0.16.4 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex-document@0.0.21 + - @atproto/lex-resolver@0.0.23 + ## 0.16.3 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 5e6bfc3043d..cf45d65973c 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.16.3", + "version": "0.16.4", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index 6ac271c6af1..6cb0c2ce116 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,14 @@ # @atproto/pds +## 0.4.222 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.26 + - @atproto/xrpc-server@0.10.21 + - @atproto/oauth-provider@0.16.4 + ## 0.4.221 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 10f1f8267c6..7060734fccb 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.221", + "version": "0.4.222", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index 9d7e6ccface..c2ccbe14d51 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/sync +## 0.2.3 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.26 + - @atproto/xrpc-server@0.10.21 + ## 0.2.2 ### Patch Changes diff --git a/packages/sync/package.json b/packages/sync/package.json index 43d08ce4291..f66075d078c 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/sync", - "version": "0.2.2", + "version": "0.2.3", "license": "MIT", "description": "atproto sync library", "keywords": [ diff --git a/packages/tap/CHANGELOG.md b/packages/tap/CHANGELOG.md index 241eb6fc5ac..c0d74901d0e 100644 --- a/packages/tap/CHANGELOG.md +++ b/packages/tap/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/tap +## 0.2.14 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.26 + ## 0.2.13 ### Patch Changes diff --git a/packages/tap/package.json b/packages/tap/package.json index b74abf406e2..3bef6221df4 100644 --- a/packages/tap/package.json +++ b/packages/tap/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/tap", - "version": "0.2.13", + "version": "0.2.14", "license": "MIT", "description": "atproto tap client", "keywords": [ diff --git a/packages/xrpc-server/CHANGELOG.md b/packages/xrpc-server/CHANGELOG.md index a44a57b75f3..2831db6717d 100644 --- a/packages/xrpc-server/CHANGELOG.md +++ b/packages/xrpc-server/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/xrpc-server +## 0.10.21 + +### Patch Changes + +- Updated dependencies [[`2fd8d62`](https://github.com/bluesky-social/atproto/commit/2fd8d62708dc23de6ed21cbcccfebab68b19f588), [`907edfa`](https://github.com/bluesky-social/atproto/commit/907edfa1d16b1074bab4dc617d0bd1a810f3da02)]: + - @atproto/lex-schema@0.0.20 + - @atproto/lex-client@0.0.21 + ## 0.10.20 ### Patch Changes diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index b910052d10d..ebee7025ad4 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc-server", - "version": "0.10.20", + "version": "0.10.21", "license": "MIT", "description": "atproto HTTP API (XRPC) server library", "keywords": [ From 15b5a8f77212afb0f8e5bbad8678c4e5246151c3 Mon Sep 17 00:00:00 2001 From: "Ms. Boba" Date: Mon, 11 May 2026 14:13:27 -0700 Subject: [PATCH 27/87] Remove path prefix for XRPC router in README and nodejs files (#4891) --- packages/lex/lex-server/README.md | 2 +- packages/lex/lex-server/src/nodejs.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/lex/lex-server/README.md b/packages/lex/lex-server/README.md index 1f6b85c2839..897b6bfe90c 100644 --- a/packages/lex/lex-server/README.md +++ b/packages/lex/lex-server/README.md @@ -524,7 +524,7 @@ import { toRequestListener } from '@atproto/lex-server/nodejs' const app = express() // Mount the XRPC router -app.use('/xrpc', toRequestListener(router.fetch)) +app.use(toRequestListener(router.fetch)) app.listen(3000) ``` diff --git a/packages/lex/lex-server/src/nodejs.ts b/packages/lex/lex-server/src/nodejs.ts index 606e7264739..834b5efd985 100644 --- a/packages/lex/lex-server/src/nodejs.ts +++ b/packages/lex/lex-server/src/nodejs.ts @@ -397,7 +397,7 @@ function toConnectionInfo(req: IncomingMessage): NodeConnectionInfo { * const app = express() * * // Mount the XRPC router - * app.use('/xrpc', toRequestListener(router.fetch)) + * app.use(toRequestListener(router.fetch)) * ``` */ export function toRequestListener< From 7b8c5d60ab134d99bf4820a69d179cde6034a61c Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 11 May 2026 14:15:00 -0700 Subject: [PATCH 28/87] Add devEngines config for node and pnpm (#4905) * Add devEngines config for node and pnpm * Update GitHub Actions * Feedback --- package.json | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 266b4ff40e6..0e1e88efa07 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,20 @@ "node": ">=18.7.0" }, "packageManager": "pnpm@8.15.9+sha512.499434c9d8fdd1a2794ebf4552b3b25c0a633abcee5bb15e7b5de90f32f47b513aca98cd5cfd001c31f0db454bc3804edccd578501e4ca293a6816166bbd9f81", + "devEngines": { + "packageManager": { + "name": "pnpm", + "onFail": "error" + } + }, + "pnpm": { + "executionEnv": { + "nodeVersion": ">=18.7.0" + }, + "overrides": { + "cookie": "^0.7.2" + } + }, "scripts": { "lint:fix": "pnpm lint --fix", "lint": "NODE_OPTIONS=--max_old_space_size=4096 eslint . --ext .ts,.js,.tsx,.jsx", @@ -59,11 +73,6 @@ "typescript": "^5.8.3", "vitest": "^4.0.16" }, - "pnpm": { - "overrides": { - "cookie": "^0.7.2" - } - }, "workspace": [ "packages/*", "packages/lex/*", From 18d311494038b73e3c3429e504ca6cc05bba5f6d Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 12 May 2026 15:28:00 -0300 Subject: [PATCH 29/87] update chat lexicons (#4932) --- .changeset/bright-convo-sync.md | 5 +++++ lexicons/chat/bsky/convo/defs.json | 8 ++++++++ packages/api/src/client/lexicons.ts | 13 +++++++++++++ .../api/src/client/types/chat/bsky/convo/defs.ts | 16 ++++++++++++++++ packages/ozone/src/lexicon/lexicons.ts | 13 +++++++++++++ .../src/lexicon/types/chat/bsky/convo/defs.ts | 16 ++++++++++++++++ 6 files changed, 71 insertions(+) create mode 100644 .changeset/bright-convo-sync.md diff --git a/.changeset/bright-convo-sync.md b/.changeset/bright-convo-sync.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/bright-convo-sync.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/convo/defs.json b/lexicons/chat/bsky/convo/defs.json index 930de279d14..c9b500380d3 100644 --- a/lexicons/chat/bsky/convo/defs.json +++ b/lexicons/chat/bsky/convo/defs.json @@ -14,6 +14,14 @@ "type": "string", "knownValues": ["request", "accepted"] }, + "convoRef": { + "type": "object", + "required": ["did", "convoId"], + "properties": { + "did": { "type": "string", "format": "did" }, + "convoId": { "type": "string" } + } + }, "messageRef": { "type": "object", "required": ["did", "messageId", "convoId"], diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 63ca56b0e09..3c73806e1b1 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -9941,6 +9941,19 @@ export const schemaDict = { type: 'string', knownValues: ['request', 'accepted'], }, + convoRef: { + type: 'object', + required: ['did', 'convoId'], + properties: { + did: { + type: 'string', + format: 'did', + }, + convoId: { + type: 'string', + }, + }, + }, messageRef: { type: 'object', required: ['did', 'messageId', 'convoId'], diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index 092bc5b9a0c..2c41f591620 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -26,6 +26,22 @@ export type ConvoLockStatus = | (string & {}) export type ConvoStatus = 'request' | 'accepted' | (string & {}) +export interface ConvoRef { + $type?: 'chat.bsky.convo.defs#convoRef' + did: string + convoId: string +} + +const hashConvoRef = 'convoRef' + +export function isConvoRef(v: V) { + return is$typed(v, id, hashConvoRef) +} + +export function validateConvoRef(v: V) { + return validate(v, id, hashConvoRef) +} + export interface MessageRef { $type?: 'chat.bsky.convo.defs#messageRef' did: string diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index a479fb59646..6e249f7d215 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -9941,6 +9941,19 @@ export const schemaDict = { type: 'string', knownValues: ['request', 'accepted'], }, + convoRef: { + type: 'object', + required: ['did', 'convoId'], + properties: { + did: { + type: 'string', + format: 'did', + }, + convoId: { + type: 'string', + }, + }, + }, messageRef: { type: 'object', required: ['did', 'messageId', 'convoId'], diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts index 092bc5b9a0c..2c41f591620 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts @@ -26,6 +26,22 @@ export type ConvoLockStatus = | (string & {}) export type ConvoStatus = 'request' | 'accepted' | (string & {}) +export interface ConvoRef { + $type?: 'chat.bsky.convo.defs#convoRef' + did: string + convoId: string +} + +const hashConvoRef = 'convoRef' + +export function isConvoRef(v: V) { + return is$typed(v, id, hashConvoRef) +} + +export function validateConvoRef(v: V) { + return validate(v, id, hashConvoRef) +} + export interface MessageRef { $type?: 'chat.bsky.convo.defs#messageRef' did: string From 0533a5f60ecc1f15feb9c4940781bc7e217a3644 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 12 May 2026 15:59:39 -0300 Subject: [PATCH 30/87] trigger actions (#4933) --- .changeset/happy-taxis-smoke.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/happy-taxis-smoke.md diff --git a/.changeset/happy-taxis-smoke.md b/.changeset/happy-taxis-smoke.md new file mode 100644 index 00000000000..f20a91247a3 --- /dev/null +++ b/.changeset/happy-taxis-smoke.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +trigger build after github actions previously disabled From 5d9f96c93d34c3f7706fd8a5e5ac4379718a2558 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 16:06:34 -0300 Subject: [PATCH 31/87] Version packages (#4934) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/bright-convo-sync.md | 5 ----- .changeset/happy-taxis-smoke.md | 5 ----- packages/api/CHANGELOG.md | 8 ++++++++ packages/api/package.json | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 .changeset/bright-convo-sync.md delete mode 100644 .changeset/happy-taxis-smoke.md diff --git a/.changeset/bright-convo-sync.md b/.changeset/bright-convo-sync.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/bright-convo-sync.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/.changeset/happy-taxis-smoke.md b/.changeset/happy-taxis-smoke.md deleted file mode 100644 index f20a91247a3..00000000000 --- a/.changeset/happy-taxis-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -trigger build after github actions previously disabled diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index a6beb73a8fc..d1ac4a039c2 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/api +## 0.19.18 + +### Patch Changes + +- [#4932](https://github.com/bluesky-social/atproto/pull/4932) [`18d3114`](https://github.com/bluesky-social/atproto/commit/18d311494038b73e3c3429e504ca6cc05bba5f6d) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + +- [#4933](https://github.com/bluesky-social/atproto/pull/4933) [`0533a5f`](https://github.com/bluesky-social/atproto/commit/0533a5f60ecc1f15feb9c4940781bc7e217a3644) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - trigger build after github actions previously disabled + ## 0.19.17 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 0b714e19612..701791c5cc5 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.17", + "version": "0.19.18", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ From 7cfff18fcafe70e08916aac1acee234479b24d9e Mon Sep 17 00:00:00 2001 From: devin ivy Date: Tue, 12 May 2026 16:57:13 -0400 Subject: [PATCH 32/87] Use pnpm publish in CI to avoid devEngines conflict with npm (#4928) changeset publish uses npm internally for registry checks, which fails because devEngines.packageManager requires pnpm. Switch to pnpm publish -r which handles registry interaction natively. Co-authored-by: Claude Opus 4.6 (1M context) --- .github/workflows/publish.yaml | 7 +------ package.json | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 9cccb9e6d29..0160fb7e62d 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -26,11 +26,6 @@ jobs: cache: pnpm node-version-file: '.nvmrc' registry-url: 'https://registry.npmjs.org' - # Temporary workaround for an issue with Node.js v22 - # https://github.com/npm/cli/issues/9151 - # https://github.com/npm/cli/pull/9152 - - run: npm install --global npm@11.11.1 - - run: npm install --global npm@latest - run: pnpm install --frozen-lockfile env: PUPPETEER_SKIP_DOWNLOAD: true @@ -38,7 +33,7 @@ jobs: uses: changesets/action@v1 id: changesets with: - publish: pnpm release + publish: pnpm run publish:ci version: pnpm run version-packages commit: 'Version packages' title: 'Version packages' diff --git a/package.json b/package.json index 0e1e88efa07..befbe1712d0 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "test:withFlags": "pnpm run test --", "bench": "vitest bench --run", "changeset": "changeset", - "release": "pnpm build && changeset publish", + "publish:ci": "pnpm run build && changeset tag && pnpm publish -r --no-git-checks --access public", "version-packages": "changeset version && git add ." }, "devDependencies": { From dda619433fd0fa5653644aaf3129d5d4bbab2219 Mon Sep 17 00:00:00 2001 From: devin ivy Date: Wed, 13 May 2026 00:07:48 -0400 Subject: [PATCH 33/87] Fix CI publish devEngines conflict with changeset publish (#4938) * Revert "Use pnpm publish in CI to avoid devEngines conflict with npm (#4928)" This reverts commit 7cfff18fcafe70e08916aac1acee234479b24d9e. * Fix CI publish by relaxing devEngines check before changeset publish changeset publish calls npm internally, which fails due to devEngines.packageManager requiring pnpm. Rather than bypassing npm entirely, relax onFail to "warn" via jq immediately before publishing. Co-Authored-By: Claude Opus 4.6 (1M context) --------- Co-authored-by: Claude Opus 4.6 (1M context) --- .github/workflows/publish.yaml | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 0160fb7e62d..55feff28a54 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -26,6 +26,11 @@ jobs: cache: pnpm node-version-file: '.nvmrc' registry-url: 'https://registry.npmjs.org' + # Temporary workaround for an issue with Node.js v22 + # https://github.com/npm/cli/issues/9151 + # https://github.com/npm/cli/pull/9152 + - run: npm install --global npm@11.11.1 + - run: npm install --global npm@latest - run: pnpm install --frozen-lockfile env: PUPPETEER_SKIP_DOWNLOAD: true diff --git a/package.json b/package.json index befbe1712d0..5037395a01c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "test:withFlags": "pnpm run test --", "bench": "vitest bench --run", "changeset": "changeset", - "publish:ci": "pnpm run build && changeset tag && pnpm publish -r --no-git-checks --access public", + "publish:ci": "pnpm build && jq '.devEngines.packageManager.onFail = \"warn\"' package.json > package.json.tmp && mv package.json.tmp package.json && changeset publish", "version-packages": "changeset version && git add ." }, "devDependencies": { From 04d727c69a2683ea15eff70d9d0bb6aa25452778 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 13 May 2026 21:32:44 +0200 Subject: [PATCH 34/87] add tests for account manager (#4844) * add tests for account manager * tidy * changeset * add password test --- .changeset/shaky-clocks-buy.md | 5 + packages/bsky/package.json | 2 +- packages/lexicon-resolver/package.json | 2 +- .../oauth-client-browser-example/package.json | 2 +- packages/pds/package.json | 2 +- packages/pds/tests/account-manager.test.ts | 150 ++++++++++++++++++ packages/sync/package.json | 2 +- 7 files changed, 160 insertions(+), 5 deletions(-) create mode 100644 .changeset/shaky-clocks-buy.md create mode 100644 packages/pds/tests/account-manager.test.ts diff --git a/.changeset/shaky-clocks-buy.md b/.changeset/shaky-clocks-buy.md new file mode 100644 index 00000000000..589c76bed62 --- /dev/null +++ b/.changeset/shaky-clocks-buy.md @@ -0,0 +1,5 @@ +--- +'@atproto/pds': patch +--- + +Add account manager tests diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 2239c62dba2..6b434251bb9 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -16,7 +16,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "codegen": "lex build --override --indexFile --lexicons ../../lexicons", + "codegen": "lex build --clear --indexFile --lexicons ../../lexicons", "prebuild": "pnpm run codegen", "build": "tsc --build tsconfig.build.json", "start": "node --enable-source-maps dist/bin.js", diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 8c3887bd2b6..1be72c5337e 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -12,7 +12,7 @@ "test": "jest", "build": "tsc --build tsconfig.build.json", "prebuild": "pnpm run codegen", - "codegen": "lex build --override --indexFile --lexicons ../../lexicons --include com.atproto.sync.getRecord --include com.atproto.lexicon.schema" + "codegen": "lex build --clear --indexFile --lexicons ../../lexicons --include com.atproto.sync.getRecord --include com.atproto.lexicon.schema" }, "homepage": "https://atproto.com", "repository": { diff --git a/packages/oauth/oauth-client-browser-example/package.json b/packages/oauth/oauth-client-browser-example/package.json index d63fc72f6f0..330eaf15a5d 100644 --- a/packages/oauth/oauth-client-browser-example/package.json +++ b/packages/oauth/oauth-client-browser-example/package.json @@ -46,7 +46,7 @@ "vite": "^6.2.0" }, "scripts": { - "codegen": "lex build --override --indexFile --lexicons ../../../lexicons --out ./src/lexicons", + "codegen": "lex build --clear --indexFile --lexicons ../../../lexicons --out ./src/lexicons", "prebuild": "pnpm run codegen", "build": "vite build --emptyOutDir -- ignore additional npm args", "dev": "vite --port 8080 --host 127.0.0.1" diff --git a/packages/pds/package.json b/packages/pds/package.json index 7060734fccb..667af66bd5d 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -19,7 +19,7 @@ "node": ">=18.7.0" }, "scripts": { - "codegen": "lex build --override --indexFile --lexicons ../../lexicons", + "codegen": "lex build --clear --indexFile --lexicons ../../lexicons", "prebuild": "pnpm run codegen", "build": "tsc --build tsconfig.build.json", "postbuild": "node ./build.templates.js", diff --git a/packages/pds/tests/account-manager.test.ts b/packages/pds/tests/account-manager.test.ts new file mode 100644 index 00000000000..5b9047daecd --- /dev/null +++ b/packages/pds/tests/account-manager.test.ts @@ -0,0 +1,150 @@ +import { type Browser, launch } from 'puppeteer' +import { TestNetworkNoAppView } from '@atproto/dev-env' +import { PageHelper } from './_puppeteer.js' + +describe('account manager', () => { + let browser: Browser + let network: TestNetworkNoAppView + + // @NOTE We are using another language than "en" as default language to + // test the language negotiation. + const languages = ['fr-BE', 'fr', 'en-US', 'en'] + + beforeAll(async () => { + browser = await launch({ + browser: 'chrome', // "firefox" + + // For debugging: + // headless: false, + // devtools: true, + // slowMo: 150, + }) + + network = await TestNetworkNoAppView.create({ + dbPostgresSchema: 'account-manager', + }) + + const sc = network.getSeedClient() + + await sc.createAccount('alice', { + email: 'alice@test.com', + handle: 'alice.test', + password: 'alice-pass', + }) + }) + + afterAll(async () => { + await network?.close() + await browser?.close() + }) + + it('allows creating an account', async () => { + await using page = await PageHelper.from(browser, { languages }) + + await page.goto(new URL('/account', network.pds.url)) + + await page.assertTitle(`S'identifier`) + + await page.clickOnText('Créer un nouveau compte') + + await page.typeInInput('handle', 'bob') + + await page.clickOnText('Suivant') + + await page.typeInInput('email', 'bob@test.com') + await page.typeInInput('password', 'bob-pass') + + await page.clickOnText("S'inscrire") + + await page.assertTitle(`Compte utilisateur`) + + await page.ensureTextVisibility('bob.test', 'span') + await page.ensureTextVisibility('Votre compte Atmosphère est hébergé chez') + }) + + it('allows switching accounts', async () => { + await using page = await PageHelper.from(browser, { languages }) + + await page.goto(new URL('/account', network.pds.url)) + + await page.assertTitle(`Compte utilisateur`) + + await page.clickOnAriaLabel(`Sélecteur de compte`) + await page.clickOnText('Sélectionner un autre compte') + await page.clickOnText('Un autre compte', '*') + + await page.typeInInput('username', 'alice.test') + const input = await page.typeInInput('password', 'alice-pass') + + input.press('Enter') + + await page.ensureTextVisibility('alice.test', 'span') + + await page.clickOnAriaLabel(`Sélecteur de compte`) + await page.clickOnText('Sélectionner un autre compte') + + await page.ensureTextVisibility('alice.test', 'span') + await page.ensureTextVisibility('bob.test', 'span') + }) + + it('forgot about the ephemeral session when loading the page again', async () => { + await using page = await PageHelper.from(browser, { languages }) + + await page.goto(new URL('/account', network.pds.url)) + + await page.assertTitle(`Compte utilisateur`) + + await page.ensureTextVisibility('bob.test', 'span') + + await page.ensureTextVisibility('alice.test', 'span').then( + () => { + throw new Error('Should not be visible') + }, + (err) => { + expect(err).toBeInstanceOf(Error) + }, + ) + }) + + it('allows changing the password', async () => { + const sendResetPasswordMock = jest + .spyOn(network.pds.ctx.mailer, 'sendResetPassword') + .mockImplementation(async () => { + // noop + }) + + await using page = await PageHelper.from(browser, { languages }) + + await page.goto(new URL('/account', network.pds.url)) + + await page.assertTitle(`Compte utilisateur`) + + await page.clickOnText('Mot de passe', 'a') + + expect(sendResetPasswordMock).toHaveBeenCalledTimes(0) + + await page.clickOnText('Envoyer le code') + + await page.waitForNetworkIdle() + + expect(sendResetPasswordMock).toHaveBeenCalledTimes(1) + + const [params] = sendResetPasswordMock.mock.lastCall + expect(params).toEqual({ + handle: 'bob.test', + token: expect.any(String), + }) + + await page.typeInInput('code', params.token) + await page.typeInInput('password', 'bob-new-pass') + + await page.clickOnText('Soumettre') + + await page.ensureTextVisibility( + 'Réinitialisation du mot de passe réussie', + 'div', + ) + + sendResetPasswordMock.mockRestore() + }) +}) diff --git a/packages/sync/package.json b/packages/sync/package.json index f66075d078c..6ed8fb10a95 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -21,7 +21,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { - "codegen": "lex build --override --indexFile --lexicons ../../lexicons --include com.atproto.sync.subscribeRepos", + "codegen": "lex build --clear --indexFile --lexicons ../../lexicons --include com.atproto.sync.subscribeRepos", "prebuild": "pnpm run codegen", "build": "tsc --build tsconfig.build.json", "test": "../dev-infra/with-test-redis-and-db.sh jest" From cb1387899f0b296759ebdf5b8985b6b573091a9a Mon Sep 17 00:00:00 2001 From: rafael Date: Fri, 15 May 2026 15:03:12 -0300 Subject: [PATCH 35/87] update chat lexicons (#4945) Co-authored-by: Claude Opus 4.6 (1M context) --- .changeset/bright-foxes-swim.md | 5 + lexicons/chat/bsky/convo/defs.json | 2 +- lexicons/chat/bsky/group/addMembers.json | 2 +- lexicons/chat/bsky/group/createGroup.json | 2 +- .../bsky/moderation/subscribeModEvents.json | 489 ++++++++++++++- packages/api/src/client/lexicons.ts | 591 +++++++++++++++++- .../src/client/types/chat/bsky/convo/defs.ts | 2 +- .../types/chat/bsky/group/addMembers.ts | 5 +- .../types/chat/bsky/group/createGroup.ts | 5 +- .../bsky/moderation/subscribeModEvents.ts | 328 ++++++++++ packages/ozone/src/lexicon/lexicons.ts | 591 +++++++++++++++++- .../src/lexicon/types/chat/bsky/convo/defs.ts | 2 +- .../types/chat/bsky/group/addMembers.ts | 2 +- .../types/chat/bsky/group/createGroup.ts | 2 +- .../bsky/moderation/subscribeModEvents.ts | 341 +++++++++- 15 files changed, 2348 insertions(+), 21 deletions(-) create mode 100644 .changeset/bright-foxes-swim.md diff --git a/.changeset/bright-foxes-swim.md b/.changeset/bright-foxes-swim.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/bright-foxes-swim.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/convo/defs.json b/lexicons/chat/bsky/convo/defs.json index c9b500380d3..00bff53b74f 100644 --- a/lexicons/chat/bsky/convo/defs.json +++ b/lexicons/chat/bsky/convo/defs.json @@ -303,7 +303,7 @@ "id": { "type": "string" }, "rev": { "type": "string" }, "members": { - "description": "Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who invited the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.", + "description": "Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.", "type": "array", "items": { "type": "ref", diff --git a/lexicons/chat/bsky/group/addMembers.json b/lexicons/chat/bsky/group/addMembers.json index 3cef6ffda0f..449d9818c98 100644 --- a/lexicons/chat/bsky/group/addMembers.json +++ b/lexicons/chat/bsky/group/addMembers.json @@ -8,7 +8,7 @@ "errors": [ { "name": "AccountSuspended" }, { "name": "BlockedActor" }, - { "name": "GroupInvitesDisabled" }, + { "name": "UserForbidsGroups" }, { "name": "ConvoLocked" }, { "name": "InsufficientRole" }, { "name": "InvalidConvo" }, diff --git a/lexicons/chat/bsky/group/createGroup.json b/lexicons/chat/bsky/group/createGroup.json index 79feb8d4e26..7a164d1880e 100644 --- a/lexicons/chat/bsky/group/createGroup.json +++ b/lexicons/chat/bsky/group/createGroup.json @@ -8,7 +8,7 @@ "errors": [ { "name": "AccountSuspended" }, { "name": "BlockedActor" }, - { "name": "GroupInvitesDisabled" }, + { "name": "UserForbidsGroups" }, { "name": "NotFollowedBySender" }, { "name": "RecipientNotFound" } ], diff --git a/lexicons/chat/bsky/moderation/subscribeModEvents.json b/lexicons/chat/bsky/moderation/subscribeModEvents.json index c911498458d..ccd69da3e88 100644 --- a/lexicons/chat/bsky/moderation/subscribeModEvents.json +++ b/lexicons/chat/bsky/moderation/subscribeModEvents.json @@ -17,7 +17,18 @@ "message": { "schema": { "type": "union", - "refs": ["#eventConvoFirstMessage"] + "refs": [ + "#eventConvoFirstMessage", + "#eventGroupChatCreated", + "#eventGroupChatMemberAdded", + "#eventGroupChatMemberJoined", + "#eventGroupChatJoinRequest", + "#eventGroupChatJoinRequestApproved", + "#eventGroupChatJoinRequestRejected", + "#eventChatAccepted", + "#eventGroupChatMemberLeft", + "#eventGroupChatUpdated" + ] } }, "errors": [ @@ -30,6 +41,7 @@ }, "eventConvoFirstMessage": { "type": "object", + "description": "Fired when the first message was sent on a convo.", "required": ["createdAt", "rev", "convoId", "user", "recipients"], "properties": { "convoId": { "type": "string" }, @@ -47,6 +59,481 @@ "format": "did" } } + }, + "eventGroupChatCreated": { + "type": "object", + "description": "Fire when a group chat is created.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "initialMemberDids", + "ownerDid", + "rev" + ], + "properties": { + "actorDid": { + "description": "The DID of the actor performing the action. For this event, same as ownerDid.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { + "description": "The name set at creation time.", + "type": "string" + }, + "initialMemberDids": { + "description": "DIDs of everyone added at creation time.", + "type": "array", + "items": { "type": "string", "format": "did" } + }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" } + } + }, + "eventGroupChatMemberAdded": { + "type": "object", + "description": "Fired when a member is added to a group chat. Note that members are added in the 'request' state.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "ownerDid", + "requestMembersCount", + "rev", + "subjectDid", + "subjectFollowsOwner" + ], + "properties": { + "actorDid": { + "description": "The DID of the actor performing the action. For this event, same as ownerDid.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { "type": "string" }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "requestMembersCount": { + "description": "The number of members who have not yet accepted the convo.", + "type": "integer" + }, + "rev": { "type": "string" }, + "subjectDid": { + "description": "The DID of the member who was added.", + "type": "string", + "format": "did" + }, + "subjectFollowsOwner": { + "description": "Whether the added member follows the group owner.", + "type": "boolean" + } + } + }, + "eventGroupChatMemberJoined": { + "type": "object", + "description": "Fired when a member joins a group chat via an join link that does not require approval.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "joinLinkCode", + "ownerDid", + "rev", + "subjectFollowsOwner" + ], + "properties": { + "actorDid": { + "description": "The DID of the person joining.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { "type": "string" }, + "joinLinkCode": { + "description": "The code of the join link used to join.", + "type": "string" + }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" }, + "subjectFollowsOwner": { + "description": "Whether the joining member follows the group owner.", + "type": "boolean" + } + } + }, + "eventGroupChatJoinRequest": { + "type": "object", + "description": "Fired when a user requests to join a group chat via an join link that requires approval.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "joinLinkCode", + "ownerDid", + "rev", + "subjectFollowsOwner" + ], + "properties": { + "actorDid": { + "description": "The DID of the person requesting to join.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { "type": "string" }, + "joinLinkCode": { + "description": "The code of the join link used to request joining.", + "type": "string" + }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" }, + "subjectFollowsOwner": { + "description": "Whether the requesting member follows the group owner.", + "type": "boolean" + } + } + }, + "eventGroupChatJoinRequestApproved": { + "type": "object", + "description": "Fired when a join request is approved by the group owner.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "ownerDid", + "rev", + "subjectDid" + ], + "properties": { + "actorDid": { + "description": "The DID of the owner approving the request.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { "type": "string" }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" }, + "subjectDid": { + "description": "The DID of the member whose request was approved.", + "type": "string", + "format": "did" + } + } + }, + "eventGroupChatJoinRequestRejected": { + "type": "object", + "description": "Fired when a join request is rejected by the group owner.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "ownerDid", + "rev", + "subjectDid" + ], + "properties": { + "actorDid": { + "description": "The DID of the owner rejecting the request.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { "type": "string" }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" }, + "subjectDid": { + "description": "The DID of the member whose request was rejected.", + "type": "string", + "format": "did" + } + } + }, + "eventChatAccepted": { + "type": "object", + "description": "Fired when a user accepts a chat convo, either explicitly or by sending a message.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "method", + "rev" + ], + "properties": { + "actorDid": { + "description": "The DID of the person accepting the convo.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the convo was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event. Only present for group convos.", + "type": "integer" + }, + "groupName": { + "description": "The name of the group chat. Only present for group convos.", + "type": "string" + }, + "method": { + "description": "How the convo was accepted.", + "type": "string", + "knownValues": ["explicit", "message"] + }, + "ownerDid": { + "description": "The DID of the group chat owner. Only present for group convos.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" } + } + }, + "eventGroupChatMemberLeft": { + "type": "object", + "description": "Fired when a member leaves or is removed from a group chat.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "leaveMethod", + "ownerDid", + "rev", + "subjectDid" + ], + "properties": { + "actorDid": { + "description": "The DID of the actor. For voluntary: the person leaving. For kicked: the owner.", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { "type": "string" }, + "leaveMethod": { + "description": "How the member left.", + "type": "string", + "knownValues": ["voluntary", "kicked"] + }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" }, + "subjectDid": { + "description": "The DID of the member who left or was removed.", + "type": "string", + "format": "did" + } + } + }, + "eventGroupChatUpdated": { + "type": "object", + "description": "Fired when a group chat's metadata or status changes.", + "required": [ + "actorDid", + "convoCreatedAt", + "convoId", + "createdAt", + "groupMemberCount", + "groupName", + "ownerDid", + "rev", + "updateType" + ], + "properties": { + "actorDid": { + "description": "The DID of the actor performing the action (the owner).", + "type": "string", + "format": "did" + }, + "convoCreatedAt": { + "description": "When the group was originally created.", + "type": "string", + "format": "datetime" + }, + "convoId": { "type": "string" }, + "createdAt": { "type": "string", "format": "datetime" }, + "groupMemberCount": { + "description": "Current member count at the time of the event.", + "type": "integer" + }, + "groupName": { + "description": "Current group name.", + "type": "string" + }, + "joinLinkCode": { + "description": "The code of the join link. Only present when updateType is join-link-related.", + "type": "string" + }, + "joinLinkFollowersOnly": { + "description": "Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related.", + "type": "boolean" + }, + "joinLinkRequiresApproval": { + "description": "Whether the join link requires owner approval to join. Only present when updateType is join-link-related.", + "type": "boolean" + }, + "lockReason": { + "description": "Why the group was locked. Only present when updateType is 'locked'.", + "type": "string", + "knownValues": [ + "owner_action", + "owner_left", + "owner_deactivated", + "owner_deleted", + "owner_taken_down", + "label_applied" + ] + }, + "newName": { + "description": "The new group name. Only present when updateType is 'name_changed'.", + "type": "string" + }, + "oldName": { + "description": "The previous group name. Only present when updateType is 'name_changed'.", + "type": "string" + }, + "ownerDid": { + "description": "The DID of the group chat owner.", + "type": "string", + "format": "did" + }, + "rev": { "type": "string" }, + "updateType": { + "description": "What changed.", + "type": "string", + "knownValues": [ + "name_changed", + "locked", + "locked_permanently", + "unlocked", + "join_link_created", + "join_link_disabled", + "join_link_settings_changed" + ] + } + } } } } diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 3c73806e1b1..644c9a0fc0b 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -10323,7 +10323,7 @@ export const schemaDict = { }, members: { description: - 'Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who invited the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.', + 'Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.', type: 'array', items: { type: 'ref', @@ -11963,7 +11963,7 @@ export const schemaDict = { name: 'BlockedActor', }, { - name: 'GroupInvitesDisabled', + name: 'UserForbidsGroups', }, { name: 'ConvoLocked', @@ -12094,7 +12094,7 @@ export const schemaDict = { name: 'BlockedActor', }, { - name: 'GroupInvitesDisabled', + name: 'UserForbidsGroups', }, { name: 'NotFollowedBySender', @@ -12877,6 +12877,15 @@ export const schemaDict = { type: 'union', refs: [ 'lex:chat.bsky.moderation.subscribeModEvents#eventConvoFirstMessage', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatCreated', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberAdded', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberJoined', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequest', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestApproved', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestRejected', + 'lex:chat.bsky.moderation.subscribeModEvents#eventChatAccepted', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberLeft', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatUpdated', ], }, }, @@ -12893,6 +12902,7 @@ export const schemaDict = { }, eventConvoFirstMessage: { type: 'object', + description: 'Fired when the first message was sent on a convo.', required: ['createdAt', 'rev', 'convoId', 'user', 'recipients'], properties: { convoId: { @@ -12924,6 +12934,581 @@ export const schemaDict = { }, }, }, + eventGroupChatCreated: { + type: 'object', + description: 'Fire when a group chat is created.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'initialMemberDids', + 'ownerDid', + 'rev', + ], + properties: { + actorDid: { + description: + 'The DID of the actor performing the action. For this event, same as ownerDid.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + description: 'The name set at creation time.', + type: 'string', + }, + initialMemberDids: { + description: 'DIDs of everyone added at creation time.', + type: 'array', + items: { + type: 'string', + format: 'did', + }, + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + }, + }, + eventGroupChatMemberAdded: { + type: 'object', + description: + "Fired when a member is added to a group chat. Note that members are added in the 'request' state.", + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'requestMembersCount', + 'rev', + 'subjectDid', + 'subjectFollowsOwner', + ], + properties: { + actorDid: { + description: + 'The DID of the actor performing the action. For this event, same as ownerDid.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + requestMembersCount: { + description: + 'The number of members who have not yet accepted the convo.', + type: 'integer', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member who was added.', + type: 'string', + format: 'did', + }, + subjectFollowsOwner: { + description: 'Whether the added member follows the group owner.', + type: 'boolean', + }, + }, + }, + eventGroupChatMemberJoined: { + type: 'object', + description: + 'Fired when a member joins a group chat via an join link that does not require approval.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'joinLinkCode', + 'ownerDid', + 'rev', + 'subjectFollowsOwner', + ], + properties: { + actorDid: { + description: 'The DID of the person joining.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + joinLinkCode: { + description: 'The code of the join link used to join.', + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectFollowsOwner: { + description: 'Whether the joining member follows the group owner.', + type: 'boolean', + }, + }, + }, + eventGroupChatJoinRequest: { + type: 'object', + description: + 'Fired when a user requests to join a group chat via an join link that requires approval.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'joinLinkCode', + 'ownerDid', + 'rev', + 'subjectFollowsOwner', + ], + properties: { + actorDid: { + description: 'The DID of the person requesting to join.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + joinLinkCode: { + description: 'The code of the join link used to request joining.', + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectFollowsOwner: { + description: + 'Whether the requesting member follows the group owner.', + type: 'boolean', + }, + }, + }, + eventGroupChatJoinRequestApproved: { + type: 'object', + description: + 'Fired when a join request is approved by the group owner.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'rev', + 'subjectDid', + ], + properties: { + actorDid: { + description: 'The DID of the owner approving the request.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member whose request was approved.', + type: 'string', + format: 'did', + }, + }, + }, + eventGroupChatJoinRequestRejected: { + type: 'object', + description: + 'Fired when a join request is rejected by the group owner.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'rev', + 'subjectDid', + ], + properties: { + actorDid: { + description: 'The DID of the owner rejecting the request.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member whose request was rejected.', + type: 'string', + format: 'did', + }, + }, + }, + eventChatAccepted: { + type: 'object', + description: + 'Fired when a user accepts a chat convo, either explicitly or by sending a message.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'method', + 'rev', + ], + properties: { + actorDid: { + description: 'The DID of the person accepting the convo.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the convo was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: + 'Current member count at the time of the event. Only present for group convos.', + type: 'integer', + }, + groupName: { + description: + 'The name of the group chat. Only present for group convos.', + type: 'string', + }, + method: { + description: 'How the convo was accepted.', + type: 'string', + knownValues: ['explicit', 'message'], + }, + ownerDid: { + description: + 'The DID of the group chat owner. Only present for group convos.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + }, + }, + eventGroupChatMemberLeft: { + type: 'object', + description: + 'Fired when a member leaves or is removed from a group chat.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'leaveMethod', + 'ownerDid', + 'rev', + 'subjectDid', + ], + properties: { + actorDid: { + description: + 'The DID of the actor. For voluntary: the person leaving. For kicked: the owner.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + leaveMethod: { + description: 'How the member left.', + type: 'string', + knownValues: ['voluntary', 'kicked'], + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member who left or was removed.', + type: 'string', + format: 'did', + }, + }, + }, + eventGroupChatUpdated: { + type: 'object', + description: "Fired when a group chat's metadata or status changes.", + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'rev', + 'updateType', + ], + properties: { + actorDid: { + description: + 'The DID of the actor performing the action (the owner).', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + description: 'Current group name.', + type: 'string', + }, + joinLinkCode: { + description: + 'The code of the join link. Only present when updateType is join-link-related.', + type: 'string', + }, + joinLinkFollowersOnly: { + description: + 'Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related.', + type: 'boolean', + }, + joinLinkRequiresApproval: { + description: + 'Whether the join link requires owner approval to join. Only present when updateType is join-link-related.', + type: 'boolean', + }, + lockReason: { + description: + "Why the group was locked. Only present when updateType is 'locked'.", + type: 'string', + knownValues: [ + 'owner_action', + 'owner_left', + 'owner_deactivated', + 'owner_deleted', + 'owner_taken_down', + 'label_applied', + ], + }, + newName: { + description: + "The new group name. Only present when updateType is 'name_changed'.", + type: 'string', + }, + oldName: { + description: + "The previous group name. Only present when updateType is 'name_changed'.", + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + updateType: { + description: 'What changed.', + type: 'string', + knownValues: [ + 'name_changed', + 'locked', + 'locked_permanently', + 'unlocked', + 'join_link_created', + 'join_link_disabled', + 'join_link_settings_changed', + ], + }, + }, + }, }, }, ChatBskyModerationUpdateActorAccess: { diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index 2c41f591620..92c4cec5939 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -482,7 +482,7 @@ export interface ConvoView { $type?: 'chat.bsky.convo.defs#convoView' id: string rev: string - /** Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who invited the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members. */ + /** Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members. */ members: ChatBskyActorDefs.ProfileViewBasic[] lastMessage?: | $Typed diff --git a/packages/api/src/client/types/chat/bsky/group/addMembers.ts b/packages/api/src/client/types/chat/bsky/group/addMembers.ts index 7ed5cd7c90c..887702d9f7c 100644 --- a/packages/api/src/client/types/chat/bsky/group/addMembers.ts +++ b/packages/api/src/client/types/chat/bsky/group/addMembers.ts @@ -54,7 +54,7 @@ export class BlockedActorError extends XRPCError { } } -export class GroupInvitesDisabledError extends XRPCError { +export class UserForbidsGroupsError extends XRPCError { constructor(src: XRPCError) { super(src.status, src.error, src.message, src.headers, { cause: src }) } @@ -100,8 +100,7 @@ export function toKnownErr(e: any) { if (e instanceof XRPCError) { if (e.error === 'AccountSuspended') return new AccountSuspendedError(e) if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'GroupInvitesDisabled') - return new GroupInvitesDisabledError(e) + if (e.error === 'UserForbidsGroups') return new UserForbidsGroupsError(e) if (e.error === 'ConvoLocked') return new ConvoLockedError(e) if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) if (e.error === 'InvalidConvo') return new InvalidConvoError(e) diff --git a/packages/api/src/client/types/chat/bsky/group/createGroup.ts b/packages/api/src/client/types/chat/bsky/group/createGroup.ts index 9db2a64ec4c..95a9cc26525 100644 --- a/packages/api/src/client/types/chat/bsky/group/createGroup.ts +++ b/packages/api/src/client/types/chat/bsky/group/createGroup.ts @@ -52,7 +52,7 @@ export class BlockedActorError extends XRPCError { } } -export class GroupInvitesDisabledError extends XRPCError { +export class UserForbidsGroupsError extends XRPCError { constructor(src: XRPCError) { super(src.status, src.error, src.message, src.headers, { cause: src }) } @@ -74,8 +74,7 @@ export function toKnownErr(e: any) { if (e instanceof XRPCError) { if (e.error === 'AccountSuspended') return new AccountSuspendedError(e) if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'GroupInvitesDisabled') - return new GroupInvitesDisabledError(e) + if (e.error === 'UserForbidsGroups') return new UserForbidsGroupsError(e) if (e.error === 'NotFollowedBySender') return new NotFollowedBySenderError(e) if (e.error === 'RecipientNotFound') return new RecipientNotFoundError(e) diff --git a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts index ebadfd046f3..aaf8b068dad 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts @@ -15,6 +15,7 @@ const is$typed = _is$typed, validate = _validate const id = 'chat.bsky.moderation.subscribeModEvents' +/** Fired when the first message was sent on a convo. */ export interface EventConvoFirstMessage { $type?: 'chat.bsky.moderation.subscribeModEvents#eventConvoFirstMessage' convoId: string @@ -36,3 +37,330 @@ export function isEventConvoFirstMessage(v: V) { export function validateEventConvoFirstMessage(v: V) { return validate(v, id, hashEventConvoFirstMessage) } + +/** Fire when a group chat is created. */ +export interface EventGroupChatCreated { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatCreated' + /** The DID of the actor performing the action. For this event, same as ownerDid. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + /** The name set at creation time. */ + groupName: string + /** DIDs of everyone added at creation time. */ + initialMemberDids: string[] + /** The DID of the group chat owner. */ + ownerDid: string + rev: string +} + +const hashEventGroupChatCreated = 'eventGroupChatCreated' + +export function isEventGroupChatCreated(v: V) { + return is$typed(v, id, hashEventGroupChatCreated) +} + +export function validateEventGroupChatCreated(v: V) { + return validate(v, id, hashEventGroupChatCreated) +} + +/** Fired when a member is added to a group chat. Note that members are added in the 'request' state. */ +export interface EventGroupChatMemberAdded { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberAdded' + /** The DID of the actor performing the action. For this event, same as ownerDid. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The DID of the group chat owner. */ + ownerDid: string + /** The number of members who have not yet accepted the convo. */ + requestMembersCount: number + rev: string + /** The DID of the member who was added. */ + subjectDid: string + /** Whether the added member follows the group owner. */ + subjectFollowsOwner: boolean +} + +const hashEventGroupChatMemberAdded = 'eventGroupChatMemberAdded' + +export function isEventGroupChatMemberAdded(v: V) { + return is$typed(v, id, hashEventGroupChatMemberAdded) +} + +export function validateEventGroupChatMemberAdded(v: V) { + return validate( + v, + id, + hashEventGroupChatMemberAdded, + ) +} + +/** Fired when a member joins a group chat via an join link that does not require approval. */ +export interface EventGroupChatMemberJoined { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberJoined' + /** The DID of the person joining. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The code of the join link used to join. */ + joinLinkCode: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** Whether the joining member follows the group owner. */ + subjectFollowsOwner: boolean +} + +const hashEventGroupChatMemberJoined = 'eventGroupChatMemberJoined' + +export function isEventGroupChatMemberJoined(v: V) { + return is$typed(v, id, hashEventGroupChatMemberJoined) +} + +export function validateEventGroupChatMemberJoined(v: V) { + return validate( + v, + id, + hashEventGroupChatMemberJoined, + ) +} + +/** Fired when a user requests to join a group chat via an join link that requires approval. */ +export interface EventGroupChatJoinRequest { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequest' + /** The DID of the person requesting to join. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The code of the join link used to request joining. */ + joinLinkCode: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** Whether the requesting member follows the group owner. */ + subjectFollowsOwner: boolean +} + +const hashEventGroupChatJoinRequest = 'eventGroupChatJoinRequest' + +export function isEventGroupChatJoinRequest(v: V) { + return is$typed(v, id, hashEventGroupChatJoinRequest) +} + +export function validateEventGroupChatJoinRequest(v: V) { + return validate( + v, + id, + hashEventGroupChatJoinRequest, + ) +} + +/** Fired when a join request is approved by the group owner. */ +export interface EventGroupChatJoinRequestApproved { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestApproved' + /** The DID of the owner approving the request. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** The DID of the member whose request was approved. */ + subjectDid: string +} + +const hashEventGroupChatJoinRequestApproved = + 'eventGroupChatJoinRequestApproved' + +export function isEventGroupChatJoinRequestApproved(v: V) { + return is$typed(v, id, hashEventGroupChatJoinRequestApproved) +} + +export function validateEventGroupChatJoinRequestApproved(v: V) { + return validate( + v, + id, + hashEventGroupChatJoinRequestApproved, + ) +} + +/** Fired when a join request is rejected by the group owner. */ +export interface EventGroupChatJoinRequestRejected { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestRejected' + /** The DID of the owner rejecting the request. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** The DID of the member whose request was rejected. */ + subjectDid: string +} + +const hashEventGroupChatJoinRequestRejected = + 'eventGroupChatJoinRequestRejected' + +export function isEventGroupChatJoinRequestRejected(v: V) { + return is$typed(v, id, hashEventGroupChatJoinRequestRejected) +} + +export function validateEventGroupChatJoinRequestRejected(v: V) { + return validate( + v, + id, + hashEventGroupChatJoinRequestRejected, + ) +} + +/** Fired when a user accepts a chat convo, either explicitly or by sending a message. */ +export interface EventChatAccepted { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventChatAccepted' + /** The DID of the person accepting the convo. */ + actorDid: string + /** When the convo was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. Only present for group convos. */ + groupMemberCount?: number + /** The name of the group chat. Only present for group convos. */ + groupName?: string + /** How the convo was accepted. */ + method: 'explicit' | 'message' | (string & {}) + /** The DID of the group chat owner. Only present for group convos. */ + ownerDid?: string + rev: string +} + +const hashEventChatAccepted = 'eventChatAccepted' + +export function isEventChatAccepted(v: V) { + return is$typed(v, id, hashEventChatAccepted) +} + +export function validateEventChatAccepted(v: V) { + return validate(v, id, hashEventChatAccepted) +} + +/** Fired when a member leaves or is removed from a group chat. */ +export interface EventGroupChatMemberLeft { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberLeft' + /** The DID of the actor. For voluntary: the person leaving. For kicked: the owner. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** How the member left. */ + leaveMethod: 'voluntary' | 'kicked' | (string & {}) + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** The DID of the member who left or was removed. */ + subjectDid: string +} + +const hashEventGroupChatMemberLeft = 'eventGroupChatMemberLeft' + +export function isEventGroupChatMemberLeft(v: V) { + return is$typed(v, id, hashEventGroupChatMemberLeft) +} + +export function validateEventGroupChatMemberLeft(v: V) { + return validate( + v, + id, + hashEventGroupChatMemberLeft, + ) +} + +/** Fired when a group chat's metadata or status changes. */ +export interface EventGroupChatUpdated { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatUpdated' + /** The DID of the actor performing the action (the owner). */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + /** Current group name. */ + groupName: string + /** The code of the join link. Only present when updateType is join-link-related. */ + joinLinkCode?: string + /** Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related. */ + joinLinkFollowersOnly?: boolean + /** Whether the join link requires owner approval to join. Only present when updateType is join-link-related. */ + joinLinkRequiresApproval?: boolean + /** Why the group was locked. Only present when updateType is 'locked'. */ + lockReason?: + | 'owner_action' + | 'owner_left' + | 'owner_deactivated' + | 'owner_deleted' + | 'owner_taken_down' + | 'label_applied' + | (string & {}) + /** The new group name. Only present when updateType is 'name_changed'. */ + newName?: string + /** The previous group name. Only present when updateType is 'name_changed'. */ + oldName?: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** What changed. */ + updateType: + | 'name_changed' + | 'locked' + | 'locked_permanently' + | 'unlocked' + | 'join_link_created' + | 'join_link_disabled' + | 'join_link_settings_changed' + | (string & {}) +} + +const hashEventGroupChatUpdated = 'eventGroupChatUpdated' + +export function isEventGroupChatUpdated(v: V) { + return is$typed(v, id, hashEventGroupChatUpdated) +} + +export function validateEventGroupChatUpdated(v: V) { + return validate(v, id, hashEventGroupChatUpdated) +} diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 6e249f7d215..4d8223a74a2 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -10323,7 +10323,7 @@ export const schemaDict = { }, members: { description: - 'Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who invited the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.', + 'Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.', type: 'array', items: { type: 'ref', @@ -11963,7 +11963,7 @@ export const schemaDict = { name: 'BlockedActor', }, { - name: 'GroupInvitesDisabled', + name: 'UserForbidsGroups', }, { name: 'ConvoLocked', @@ -12094,7 +12094,7 @@ export const schemaDict = { name: 'BlockedActor', }, { - name: 'GroupInvitesDisabled', + name: 'UserForbidsGroups', }, { name: 'NotFollowedBySender', @@ -12877,6 +12877,15 @@ export const schemaDict = { type: 'union', refs: [ 'lex:chat.bsky.moderation.subscribeModEvents#eventConvoFirstMessage', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatCreated', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberAdded', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberJoined', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequest', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestApproved', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestRejected', + 'lex:chat.bsky.moderation.subscribeModEvents#eventChatAccepted', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberLeft', + 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatUpdated', ], }, }, @@ -12893,6 +12902,7 @@ export const schemaDict = { }, eventConvoFirstMessage: { type: 'object', + description: 'Fired when the first message was sent on a convo.', required: ['createdAt', 'rev', 'convoId', 'user', 'recipients'], properties: { convoId: { @@ -12924,6 +12934,581 @@ export const schemaDict = { }, }, }, + eventGroupChatCreated: { + type: 'object', + description: 'Fire when a group chat is created.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'initialMemberDids', + 'ownerDid', + 'rev', + ], + properties: { + actorDid: { + description: + 'The DID of the actor performing the action. For this event, same as ownerDid.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + description: 'The name set at creation time.', + type: 'string', + }, + initialMemberDids: { + description: 'DIDs of everyone added at creation time.', + type: 'array', + items: { + type: 'string', + format: 'did', + }, + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + }, + }, + eventGroupChatMemberAdded: { + type: 'object', + description: + "Fired when a member is added to a group chat. Note that members are added in the 'request' state.", + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'requestMembersCount', + 'rev', + 'subjectDid', + 'subjectFollowsOwner', + ], + properties: { + actorDid: { + description: + 'The DID of the actor performing the action. For this event, same as ownerDid.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + requestMembersCount: { + description: + 'The number of members who have not yet accepted the convo.', + type: 'integer', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member who was added.', + type: 'string', + format: 'did', + }, + subjectFollowsOwner: { + description: 'Whether the added member follows the group owner.', + type: 'boolean', + }, + }, + }, + eventGroupChatMemberJoined: { + type: 'object', + description: + 'Fired when a member joins a group chat via an join link that does not require approval.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'joinLinkCode', + 'ownerDid', + 'rev', + 'subjectFollowsOwner', + ], + properties: { + actorDid: { + description: 'The DID of the person joining.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + joinLinkCode: { + description: 'The code of the join link used to join.', + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectFollowsOwner: { + description: 'Whether the joining member follows the group owner.', + type: 'boolean', + }, + }, + }, + eventGroupChatJoinRequest: { + type: 'object', + description: + 'Fired when a user requests to join a group chat via an join link that requires approval.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'joinLinkCode', + 'ownerDid', + 'rev', + 'subjectFollowsOwner', + ], + properties: { + actorDid: { + description: 'The DID of the person requesting to join.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + joinLinkCode: { + description: 'The code of the join link used to request joining.', + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectFollowsOwner: { + description: + 'Whether the requesting member follows the group owner.', + type: 'boolean', + }, + }, + }, + eventGroupChatJoinRequestApproved: { + type: 'object', + description: + 'Fired when a join request is approved by the group owner.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'rev', + 'subjectDid', + ], + properties: { + actorDid: { + description: 'The DID of the owner approving the request.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member whose request was approved.', + type: 'string', + format: 'did', + }, + }, + }, + eventGroupChatJoinRequestRejected: { + type: 'object', + description: + 'Fired when a join request is rejected by the group owner.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'rev', + 'subjectDid', + ], + properties: { + actorDid: { + description: 'The DID of the owner rejecting the request.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member whose request was rejected.', + type: 'string', + format: 'did', + }, + }, + }, + eventChatAccepted: { + type: 'object', + description: + 'Fired when a user accepts a chat convo, either explicitly or by sending a message.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'method', + 'rev', + ], + properties: { + actorDid: { + description: 'The DID of the person accepting the convo.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the convo was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: + 'Current member count at the time of the event. Only present for group convos.', + type: 'integer', + }, + groupName: { + description: + 'The name of the group chat. Only present for group convos.', + type: 'string', + }, + method: { + description: 'How the convo was accepted.', + type: 'string', + knownValues: ['explicit', 'message'], + }, + ownerDid: { + description: + 'The DID of the group chat owner. Only present for group convos.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + }, + }, + eventGroupChatMemberLeft: { + type: 'object', + description: + 'Fired when a member leaves or is removed from a group chat.', + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'leaveMethod', + 'ownerDid', + 'rev', + 'subjectDid', + ], + properties: { + actorDid: { + description: + 'The DID of the actor. For voluntary: the person leaving. For kicked: the owner.', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + type: 'string', + }, + leaveMethod: { + description: 'How the member left.', + type: 'string', + knownValues: ['voluntary', 'kicked'], + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + subjectDid: { + description: 'The DID of the member who left or was removed.', + type: 'string', + format: 'did', + }, + }, + }, + eventGroupChatUpdated: { + type: 'object', + description: "Fired when a group chat's metadata or status changes.", + required: [ + 'actorDid', + 'convoCreatedAt', + 'convoId', + 'createdAt', + 'groupMemberCount', + 'groupName', + 'ownerDid', + 'rev', + 'updateType', + ], + properties: { + actorDid: { + description: + 'The DID of the actor performing the action (the owner).', + type: 'string', + format: 'did', + }, + convoCreatedAt: { + description: 'When the group was originally created.', + type: 'string', + format: 'datetime', + }, + convoId: { + type: 'string', + }, + createdAt: { + type: 'string', + format: 'datetime', + }, + groupMemberCount: { + description: 'Current member count at the time of the event.', + type: 'integer', + }, + groupName: { + description: 'Current group name.', + type: 'string', + }, + joinLinkCode: { + description: + 'The code of the join link. Only present when updateType is join-link-related.', + type: 'string', + }, + joinLinkFollowersOnly: { + description: + 'Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related.', + type: 'boolean', + }, + joinLinkRequiresApproval: { + description: + 'Whether the join link requires owner approval to join. Only present when updateType is join-link-related.', + type: 'boolean', + }, + lockReason: { + description: + "Why the group was locked. Only present when updateType is 'locked'.", + type: 'string', + knownValues: [ + 'owner_action', + 'owner_left', + 'owner_deactivated', + 'owner_deleted', + 'owner_taken_down', + 'label_applied', + ], + }, + newName: { + description: + "The new group name. Only present when updateType is 'name_changed'.", + type: 'string', + }, + oldName: { + description: + "The previous group name. Only present when updateType is 'name_changed'.", + type: 'string', + }, + ownerDid: { + description: 'The DID of the group chat owner.', + type: 'string', + format: 'did', + }, + rev: { + type: 'string', + }, + updateType: { + description: 'What changed.', + type: 'string', + knownValues: [ + 'name_changed', + 'locked', + 'locked_permanently', + 'unlocked', + 'join_link_created', + 'join_link_disabled', + 'join_link_settings_changed', + ], + }, + }, + }, }, }, ChatBskyModerationUpdateActorAccess: { diff --git a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts index 2c41f591620..92c4cec5939 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts @@ -482,7 +482,7 @@ export interface ConvoView { $type?: 'chat.bsky.convo.defs#convoView' id: string rev: string - /** Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who invited the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members. */ + /** Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members. */ members: ChatBskyActorDefs.ProfileViewBasic[] lastMessage?: | $Typed diff --git a/packages/ozone/src/lexicon/types/chat/bsky/group/addMembers.ts b/packages/ozone/src/lexicon/types/chat/bsky/group/addMembers.ts index b52ff6fe2d7..3b302cb7601 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/group/addMembers.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/group/addMembers.ts @@ -45,7 +45,7 @@ export interface HandlerError { error?: | 'AccountSuspended' | 'BlockedActor' - | 'GroupInvitesDisabled' + | 'UserForbidsGroups' | 'ConvoLocked' | 'InsufficientRole' | 'InvalidConvo' diff --git a/packages/ozone/src/lexicon/types/chat/bsky/group/createGroup.ts b/packages/ozone/src/lexicon/types/chat/bsky/group/createGroup.ts index 10092ea1794..aa11850848d 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/group/createGroup.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/group/createGroup.ts @@ -43,7 +43,7 @@ export interface HandlerError { error?: | 'AccountSuspended' | 'BlockedActor' - | 'GroupInvitesDisabled' + | 'UserForbidsGroups' | 'NotFollowedBySender' | 'RecipientNotFound' } diff --git a/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts b/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts index 2390c0588df..b53215da915 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts @@ -20,10 +20,22 @@ export type QueryParams = { /** The last known event seq number to backfill from. Use '2222222222222' to backfill from the beginning. Don't specify a cursor to listen only for new events. */ cursor?: string } -export type OutputSchema = $Typed | { $type: string } +export type OutputSchema = + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | $Typed + | { $type: string } export type HandlerError = ErrorFrame<'FutureCursor' | 'ConsumerTooSlow'> export type HandlerOutput = HandlerError | OutputSchema +/** Fired when the first message was sent on a convo. */ export interface EventConvoFirstMessage { $type?: 'chat.bsky.moderation.subscribeModEvents#eventConvoFirstMessage' convoId: string @@ -45,3 +57,330 @@ export function isEventConvoFirstMessage(v: V) { export function validateEventConvoFirstMessage(v: V) { return validate(v, id, hashEventConvoFirstMessage) } + +/** Fire when a group chat is created. */ +export interface EventGroupChatCreated { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatCreated' + /** The DID of the actor performing the action. For this event, same as ownerDid. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + /** The name set at creation time. */ + groupName: string + /** DIDs of everyone added at creation time. */ + initialMemberDids: string[] + /** The DID of the group chat owner. */ + ownerDid: string + rev: string +} + +const hashEventGroupChatCreated = 'eventGroupChatCreated' + +export function isEventGroupChatCreated(v: V) { + return is$typed(v, id, hashEventGroupChatCreated) +} + +export function validateEventGroupChatCreated(v: V) { + return validate(v, id, hashEventGroupChatCreated) +} + +/** Fired when a member is added to a group chat. Note that members are added in the 'request' state. */ +export interface EventGroupChatMemberAdded { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberAdded' + /** The DID of the actor performing the action. For this event, same as ownerDid. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The DID of the group chat owner. */ + ownerDid: string + /** The number of members who have not yet accepted the convo. */ + requestMembersCount: number + rev: string + /** The DID of the member who was added. */ + subjectDid: string + /** Whether the added member follows the group owner. */ + subjectFollowsOwner: boolean +} + +const hashEventGroupChatMemberAdded = 'eventGroupChatMemberAdded' + +export function isEventGroupChatMemberAdded(v: V) { + return is$typed(v, id, hashEventGroupChatMemberAdded) +} + +export function validateEventGroupChatMemberAdded(v: V) { + return validate( + v, + id, + hashEventGroupChatMemberAdded, + ) +} + +/** Fired when a member joins a group chat via an join link that does not require approval. */ +export interface EventGroupChatMemberJoined { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberJoined' + /** The DID of the person joining. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The code of the join link used to join. */ + joinLinkCode: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** Whether the joining member follows the group owner. */ + subjectFollowsOwner: boolean +} + +const hashEventGroupChatMemberJoined = 'eventGroupChatMemberJoined' + +export function isEventGroupChatMemberJoined(v: V) { + return is$typed(v, id, hashEventGroupChatMemberJoined) +} + +export function validateEventGroupChatMemberJoined(v: V) { + return validate( + v, + id, + hashEventGroupChatMemberJoined, + ) +} + +/** Fired when a user requests to join a group chat via an join link that requires approval. */ +export interface EventGroupChatJoinRequest { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequest' + /** The DID of the person requesting to join. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The code of the join link used to request joining. */ + joinLinkCode: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** Whether the requesting member follows the group owner. */ + subjectFollowsOwner: boolean +} + +const hashEventGroupChatJoinRequest = 'eventGroupChatJoinRequest' + +export function isEventGroupChatJoinRequest(v: V) { + return is$typed(v, id, hashEventGroupChatJoinRequest) +} + +export function validateEventGroupChatJoinRequest(v: V) { + return validate( + v, + id, + hashEventGroupChatJoinRequest, + ) +} + +/** Fired when a join request is approved by the group owner. */ +export interface EventGroupChatJoinRequestApproved { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestApproved' + /** The DID of the owner approving the request. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** The DID of the member whose request was approved. */ + subjectDid: string +} + +const hashEventGroupChatJoinRequestApproved = + 'eventGroupChatJoinRequestApproved' + +export function isEventGroupChatJoinRequestApproved(v: V) { + return is$typed(v, id, hashEventGroupChatJoinRequestApproved) +} + +export function validateEventGroupChatJoinRequestApproved(v: V) { + return validate( + v, + id, + hashEventGroupChatJoinRequestApproved, + ) +} + +/** Fired when a join request is rejected by the group owner. */ +export interface EventGroupChatJoinRequestRejected { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestRejected' + /** The DID of the owner rejecting the request. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** The DID of the member whose request was rejected. */ + subjectDid: string +} + +const hashEventGroupChatJoinRequestRejected = + 'eventGroupChatJoinRequestRejected' + +export function isEventGroupChatJoinRequestRejected(v: V) { + return is$typed(v, id, hashEventGroupChatJoinRequestRejected) +} + +export function validateEventGroupChatJoinRequestRejected(v: V) { + return validate( + v, + id, + hashEventGroupChatJoinRequestRejected, + ) +} + +/** Fired when a user accepts a chat convo, either explicitly or by sending a message. */ +export interface EventChatAccepted { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventChatAccepted' + /** The DID of the person accepting the convo. */ + actorDid: string + /** When the convo was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. Only present for group convos. */ + groupMemberCount?: number + /** The name of the group chat. Only present for group convos. */ + groupName?: string + /** How the convo was accepted. */ + method: 'explicit' | 'message' | (string & {}) + /** The DID of the group chat owner. Only present for group convos. */ + ownerDid?: string + rev: string +} + +const hashEventChatAccepted = 'eventChatAccepted' + +export function isEventChatAccepted(v: V) { + return is$typed(v, id, hashEventChatAccepted) +} + +export function validateEventChatAccepted(v: V) { + return validate(v, id, hashEventChatAccepted) +} + +/** Fired when a member leaves or is removed from a group chat. */ +export interface EventGroupChatMemberLeft { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberLeft' + /** The DID of the actor. For voluntary: the person leaving. For kicked: the owner. */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + groupName: string + /** How the member left. */ + leaveMethod: 'voluntary' | 'kicked' | (string & {}) + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** The DID of the member who left or was removed. */ + subjectDid: string +} + +const hashEventGroupChatMemberLeft = 'eventGroupChatMemberLeft' + +export function isEventGroupChatMemberLeft(v: V) { + return is$typed(v, id, hashEventGroupChatMemberLeft) +} + +export function validateEventGroupChatMemberLeft(v: V) { + return validate( + v, + id, + hashEventGroupChatMemberLeft, + ) +} + +/** Fired when a group chat's metadata or status changes. */ +export interface EventGroupChatUpdated { + $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatUpdated' + /** The DID of the actor performing the action (the owner). */ + actorDid: string + /** When the group was originally created. */ + convoCreatedAt: string + convoId: string + createdAt: string + /** Current member count at the time of the event. */ + groupMemberCount: number + /** Current group name. */ + groupName: string + /** The code of the join link. Only present when updateType is join-link-related. */ + joinLinkCode?: string + /** Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related. */ + joinLinkFollowersOnly?: boolean + /** Whether the join link requires owner approval to join. Only present when updateType is join-link-related. */ + joinLinkRequiresApproval?: boolean + /** Why the group was locked. Only present when updateType is 'locked'. */ + lockReason?: + | 'owner_action' + | 'owner_left' + | 'owner_deactivated' + | 'owner_deleted' + | 'owner_taken_down' + | 'label_applied' + | (string & {}) + /** The new group name. Only present when updateType is 'name_changed'. */ + newName?: string + /** The previous group name. Only present when updateType is 'name_changed'. */ + oldName?: string + /** The DID of the group chat owner. */ + ownerDid: string + rev: string + /** What changed. */ + updateType: + | 'name_changed' + | 'locked' + | 'locked_permanently' + | 'unlocked' + | 'join_link_created' + | 'join_link_disabled' + | 'join_link_settings_changed' + | (string & {}) +} + +const hashEventGroupChatUpdated = 'eventGroupChatUpdated' + +export function isEventGroupChatUpdated(v: V) { + return is$typed(v, id, hashEventGroupChatUpdated) +} + +export function validateEventGroupChatUpdated(v: V) { + return validate(v, id, hashEventGroupChatUpdated) +} From 38bc2faa142d42f95c5b89b5a10bf8ed607fe39f Mon Sep 17 00:00:00 2001 From: rafael Date: Fri, 15 May 2026 18:34:50 -0300 Subject: [PATCH 36/87] update chat lexicons (#4946) --- .changeset/swift-otter-hops.md | 5 +++++ .../bsky/moderation/getMessageContext.json | 20 ++++++++++++++++--- packages/api/src/client/lexicons.ts | 13 +++++++++++- .../chat/bsky/moderation/getMessageContext.ts | 5 ++++- packages/ozone/src/lexicon/lexicons.ts | 13 +++++++++++- .../chat/bsky/moderation/getMessageContext.ts | 5 ++++- 6 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 .changeset/swift-otter-hops.md diff --git a/.changeset/swift-otter-hops.md b/.changeset/swift-otter-hops.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/swift-otter-hops.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/moderation/getMessageContext.json b/lexicons/chat/bsky/moderation/getMessageContext.json index 93b9d9a0181..b267dcd251a 100644 --- a/lexicons/chat/bsky/moderation/getMessageContext.json +++ b/lexicons/chat/bsky/moderation/getMessageContext.json @@ -13,8 +13,23 @@ "description": "Conversation that the message is from. NOTE: this field will eventually be required." }, "messageId": { "type": "string" }, - "before": { "type": "integer", "default": 5 }, - "after": { "type": "integer", "default": 5 } + "before": { + "type": "integer", + "default": 5, + "description": "Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead." + }, + "after": { + "type": "integer", + "default": 5, + "description": "Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead." + }, + "maxInterleavedSystemMessages": { + "type": "integer", + "default": 10, + "minimum": 0, + "maximum": 1000, + "description": "Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept." + } } }, "output": { @@ -29,7 +44,6 @@ "type": "union", "refs": [ "chat.bsky.convo.defs#messageView", - "chat.bsky.convo.defs#deletedMessageView", "chat.bsky.convo.defs#systemMessageView" ] } diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 644c9a0fc0b..35379e4c3ac 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -12824,10 +12824,22 @@ export const schemaDict = { before: { type: 'integer', default: 5, + description: + 'Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead.', }, after: { type: 'integer', default: 5, + description: + 'Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead.', + }, + maxInterleavedSystemMessages: { + type: 'integer', + default: 10, + minimum: 0, + maximum: 1000, + description: + 'Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept.', }, }, }, @@ -12843,7 +12855,6 @@ export const schemaDict = { type: 'union', refs: [ 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', 'lex:chat.bsky.convo.defs#systemMessageView', ], }, diff --git a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts index 1101469b950..c17bffb3ab8 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts @@ -20,15 +20,18 @@ export type QueryParams = { /** Conversation that the message is from. NOTE: this field will eventually be required. */ convoId?: string messageId: string + /** Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead. */ before?: number + /** Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead. */ after?: number + /** Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept. */ + maxInterleavedSystemMessages?: number } export type InputSchema = undefined export interface OutputSchema { messages: ( | $Typed - | $Typed | $Typed | { $type: string } )[] diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 4d8223a74a2..e16b1c66e8b 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -12824,10 +12824,22 @@ export const schemaDict = { before: { type: 'integer', default: 5, + description: + 'Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead.', }, after: { type: 'integer', default: 5, + description: + 'Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead.', + }, + maxInterleavedSystemMessages: { + type: 'integer', + default: 10, + minimum: 0, + maximum: 1000, + description: + 'Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept.', }, }, }, @@ -12843,7 +12855,6 @@ export const schemaDict = { type: 'union', refs: [ 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', 'lex:chat.bsky.convo.defs#systemMessageView', ], }, diff --git a/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts b/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts index e991d53c8ea..876b3fd49b3 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts @@ -19,15 +19,18 @@ export type QueryParams = { /** Conversation that the message is from. NOTE: this field will eventually be required. */ convoId?: string messageId: string + /** Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead. */ before: number + /** Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead. */ after: number + /** Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept. */ + maxInterleavedSystemMessages: number } export type InputSchema = undefined export interface OutputSchema { messages: ( | $Typed - | $Typed | $Typed | { $type: string } )[] From ea4184b9beb9821d806a9540223dab55c2628184 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 17 May 2026 15:47:14 -0500 Subject: [PATCH 37/87] Replace associatedRecord with associatedRecords on external embed (#4947) --- .changeset/eleven-dragons-behave.md | 5 +++++ lexicons/app/bsky/embed/external.json | 9 ++++++--- packages/api/src/client/lexicons.ts | 9 ++++++--- packages/api/src/client/types/app/bsky/embed/external.ts | 3 ++- packages/ozone/src/lexicon/lexicons.ts | 9 ++++++--- .../ozone/src/lexicon/types/app/bsky/embed/external.ts | 3 ++- 6 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 .changeset/eleven-dragons-behave.md diff --git a/.changeset/eleven-dragons-behave.md b/.changeset/eleven-dragons-behave.md new file mode 100644 index 00000000000..43885a87926 --- /dev/null +++ b/.changeset/eleven-dragons-behave.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +Updates contract defined in #4912 to replace `associatedRecord: string` with `associatedRecords: StrongRef[]` diff --git a/lexicons/app/bsky/embed/external.json b/lexicons/app/bsky/embed/external.json index 775d2d498cd..dc4866c9d5e 100644 --- a/lexicons/app/bsky/embed/external.json +++ b/lexicons/app/bsky/embed/external.json @@ -25,9 +25,12 @@ "accept": ["image/*"], "maxSize": 1000000 }, - "associatedRecord": { - "type": "string", - "format": "at-uri", + "associatedRecords": { + "type": "array", + "items": { + "type": "ref", + "ref": "com.atproto.repo.strongRef" + }, "description": "The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record." } } diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 35379e4c3ac..8094304d1b8 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -2710,9 +2710,12 @@ export const schemaDict = { accept: ['image/*'], maxSize: 1000000, }, - associatedRecord: { - type: 'string', - format: 'at-uri', + associatedRecords: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:com.atproto.repo.strongRef', + }, description: 'The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record.', }, diff --git a/packages/api/src/client/types/app/bsky/embed/external.ts b/packages/api/src/client/types/app/bsky/embed/external.ts index d1a7a1e2ee2..bf839eb9983 100644 --- a/packages/api/src/client/types/app/bsky/embed/external.ts +++ b/packages/api/src/client/types/app/bsky/embed/external.ts @@ -9,6 +9,7 @@ import { is$typed as _is$typed, type OmitKey, } from '../../../../util' +import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' const is$typed = _is$typed, validate = _validate @@ -37,7 +38,7 @@ export interface External { description: string thumb?: BlobRef /** The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record. */ - associatedRecord?: string + associatedRecords?: ComAtprotoRepoStrongRef.Main[] } const hashExternal = 'external' diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index e16b1c66e8b..9fc04b30095 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -2710,9 +2710,12 @@ export const schemaDict = { accept: ['image/*'], maxSize: 1000000, }, - associatedRecord: { - type: 'string', - format: 'at-uri', + associatedRecords: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:com.atproto.repo.strongRef', + }, description: 'The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record.', }, diff --git a/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts b/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts index d1a7a1e2ee2..bf839eb9983 100644 --- a/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts +++ b/packages/ozone/src/lexicon/types/app/bsky/embed/external.ts @@ -9,6 +9,7 @@ import { is$typed as _is$typed, type OmitKey, } from '../../../../util' +import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' const is$typed = _is$typed, validate = _validate @@ -37,7 +38,7 @@ export interface External { description: string thumb?: BlobRef /** The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record. */ - associatedRecord?: string + associatedRecords?: ComAtprotoRepoStrongRef.Main[] } const hashExternal = 'external' From d8b2374e1592d1dec65a33439791bc141f02397a Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Mon, 18 May 2026 15:32:15 +0200 Subject: [PATCH 38/87] Make `options` required for `Client.get` (#4948) Make `options` required for `Client.get` when the schema expects a `rkey` to fetch a record --- .changeset/grumpy-memes-nail.md | 5 +++++ packages/lex/lex-client/src/client.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/grumpy-memes-nail.md diff --git a/.changeset/grumpy-memes-nail.md b/.changeset/grumpy-memes-nail.md new file mode 100644 index 00000000000..ad4c70b53ae --- /dev/null +++ b/.changeset/grumpy-memes-nail.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-client': patch +--- + +Make `options` required for `Client.get` when the schema expects a `rkey` to fetch a record diff --git a/packages/lex/lex-client/src/client.ts b/packages/lex/lex-client/src/client.ts index 71f44017707..3da12cbe442 100644 --- a/packages/lex/lex-client/src/client.ts +++ b/packages/lex/lex-client/src/client.ts @@ -919,7 +919,7 @@ export class Client implements Agent { ): Promise> public async get( ns: Main, - options?: GetOptions, + options: GetOptions, ): Promise> public async get( ns: Main, From e60137c8752f7df4e64524df2e24c7ff73f3b8a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 11:23:15 -0400 Subject: [PATCH 39/87] Version packages (#4939) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/bright-foxes-swim.md | 5 ----- .changeset/eleven-dragons-behave.md | 5 ----- .changeset/grumpy-memes-nail.md | 5 ----- .changeset/shaky-clocks-buy.md | 5 ----- .changeset/swift-otter-hops.md | 5 ----- packages/api/CHANGELOG.md | 10 ++++++++++ packages/api/package.json | 2 +- packages/bsky/CHANGELOG.md | 10 ++++++++++ packages/bsky/package.json | 2 +- packages/dev-env/CHANGELOG.md | 12 ++++++++++++ packages/dev-env/package.json | 2 +- packages/lex/lex-client/CHANGELOG.md | 6 ++++++ packages/lex/lex-client/package.json | 2 +- packages/lex/lex-installer/CHANGELOG.md | 7 +++++++ packages/lex/lex-installer/package.json | 2 +- packages/lex/lex-password-session/CHANGELOG.md | 7 +++++++ packages/lex/lex-password-session/package.json | 2 +- packages/lex/lex-resolver/CHANGELOG.md | 7 +++++++ packages/lex/lex-resolver/package.json | 2 +- packages/lex/lex-server/CHANGELOG.md | 7 +++++++ packages/lex/lex-server/package.json | 2 +- packages/lex/lex/CHANGELOG.md | 8 ++++++++ packages/lex/lex/package.json | 2 +- packages/lexicon-resolver/CHANGELOG.md | 7 +++++++ packages/lexicon-resolver/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 7 +++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/pds/CHANGELOG.md | 11 +++++++++++ packages/pds/package.json | 2 +- packages/sync/CHANGELOG.md | 8 ++++++++ packages/sync/package.json | 2 +- packages/tap/CHANGELOG.md | 7 +++++++ packages/tap/package.json | 2 +- packages/xrpc-server/CHANGELOG.md | 7 +++++++ packages/xrpc-server/package.json | 2 +- 35 files changed, 136 insertions(+), 40 deletions(-) delete mode 100644 .changeset/bright-foxes-swim.md delete mode 100644 .changeset/eleven-dragons-behave.md delete mode 100644 .changeset/grumpy-memes-nail.md delete mode 100644 .changeset/shaky-clocks-buy.md delete mode 100644 .changeset/swift-otter-hops.md diff --git a/.changeset/bright-foxes-swim.md b/.changeset/bright-foxes-swim.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/bright-foxes-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/.changeset/eleven-dragons-behave.md b/.changeset/eleven-dragons-behave.md deleted file mode 100644 index 43885a87926..00000000000 --- a/.changeset/eleven-dragons-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -Updates contract defined in #4912 to replace `associatedRecord: string` with `associatedRecords: StrongRef[]` diff --git a/.changeset/grumpy-memes-nail.md b/.changeset/grumpy-memes-nail.md deleted file mode 100644 index ad4c70b53ae..00000000000 --- a/.changeset/grumpy-memes-nail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lex-client': patch ---- - -Make `options` required for `Client.get` when the schema expects a `rkey` to fetch a record diff --git a/.changeset/shaky-clocks-buy.md b/.changeset/shaky-clocks-buy.md deleted file mode 100644 index 589c76bed62..00000000000 --- a/.changeset/shaky-clocks-buy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/pds': patch ---- - -Add account manager tests diff --git a/.changeset/swift-otter-hops.md b/.changeset/swift-otter-hops.md deleted file mode 100644 index 612bcecb8ce..00000000000 --- a/.changeset/swift-otter-hops.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/api': patch ---- - -update chat lexicons diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index d1ac4a039c2..5b1ad4abb49 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/api +## 0.19.19 + +### Patch Changes + +- [#4945](https://github.com/bluesky-social/atproto/pull/4945) [`cb13878`](https://github.com/bluesky-social/atproto/commit/cb1387899f0b296759ebdf5b8985b6b573091a9a) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + +- [#4947](https://github.com/bluesky-social/atproto/pull/4947) [`ea4184b`](https://github.com/bluesky-social/atproto/commit/ea4184b9beb9821d806a9540223dab55c2628184) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Updates contract defined in #4912 to replace `associatedRecord: string` with `associatedRecords: StrongRef[]` + +- [#4946](https://github.com/bluesky-social/atproto/pull/4946) [`38bc2fa`](https://github.com/bluesky-social/atproto/commit/38bc2faa142d42f95c5b89b5a10bf8ed607fe39f) Thanks [@rafaeleyng](https://github.com/rafaeleyng)! - update chat lexicons + ## 0.19.18 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index 701791c5cc5..d4a90dcbe43 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.18", + "version": "0.19.19", "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index 9f353299fe6..c1e46e91f42 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,15 @@ # @atproto/bsky +## 0.0.230 + +### Patch Changes + +- Updated dependencies [[`cb13878`](https://github.com/bluesky-social/atproto/commit/cb1387899f0b296759ebdf5b8985b6b573091a9a), [`ea4184b`](https://github.com/bluesky-social/atproto/commit/ea4184b9beb9821d806a9540223dab55c2628184), [`38bc2fa`](https://github.com/bluesky-social/atproto/commit/38bc2faa142d42f95c5b89b5a10bf8ed607fe39f)]: + - @atproto/api@0.19.19 + - @atproto/lex@0.0.27 + - @atproto/xrpc-server@0.10.22 + - @atproto/sync@0.2.4 + ## 0.0.229 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 6b434251bb9..6fc7cac78fd 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.229", + "version": "0.0.230", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 490dc3217c2..8d2fc68fe82 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/dev-env +## 0.4.9 + +### Patch Changes + +- Updated dependencies [[`cb13878`](https://github.com/bluesky-social/atproto/commit/cb1387899f0b296759ebdf5b8985b6b573091a9a), [`ea4184b`](https://github.com/bluesky-social/atproto/commit/ea4184b9beb9821d806a9540223dab55c2628184), [`04d727c`](https://github.com/bluesky-social/atproto/commit/04d727c69a2683ea15eff70d9d0bb6aa25452778), [`38bc2fa`](https://github.com/bluesky-social/atproto/commit/38bc2faa142d42f95c5b89b5a10bf8ed607fe39f)]: + - @atproto/api@0.19.19 + - @atproto/pds@0.4.223 + - @atproto/lex@0.0.27 + - @atproto/xrpc-server@0.10.22 + - @atproto/bsky@0.0.230 + - @atproto/sync@0.2.4 + ## 0.4.8 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index c4d5c1244e0..95bb92c9d82 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.4.8", + "version": "0.4.9", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/lex/lex-client/CHANGELOG.md b/packages/lex/lex-client/CHANGELOG.md index cdb04741cf0..f6cca2b8d22 100644 --- a/packages/lex/lex-client/CHANGELOG.md +++ b/packages/lex/lex-client/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/lex-client +## 0.0.22 + +### Patch Changes + +- [#4948](https://github.com/bluesky-social/atproto/pull/4948) [`d8b2374`](https://github.com/bluesky-social/atproto/commit/d8b2374e1592d1dec65a33439791bc141f02397a) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Make `options` required for `Client.get` when the schema expects a `rkey` to fetch a record + ## 0.0.21 ### Patch Changes diff --git a/packages/lex/lex-client/package.json b/packages/lex/lex-client/package.json index b0e0183532c..9aa6ea857cd 100644 --- a/packages/lex/lex-client/package.json +++ b/packages/lex/lex-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-client", - "version": "0.0.21", + "version": "0.0.22", "license": "MIT", "description": "HTTP client for interacting with Lexicon based APIs", "keywords": [ diff --git a/packages/lex/lex-installer/CHANGELOG.md b/packages/lex/lex-installer/CHANGELOG.md index 4d8df19e370..55fb49cf166 100644 --- a/packages/lex/lex-installer/CHANGELOG.md +++ b/packages/lex/lex-installer/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/lex-installer +## 0.0.27 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex-resolver@0.0.24 + ## 0.0.26 ### Patch Changes diff --git a/packages/lex/lex-installer/package.json b/packages/lex/lex-installer/package.json index 1231de7e56f..9aaf18df89f 100644 --- a/packages/lex/lex-installer/package.json +++ b/packages/lex/lex-installer/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-installer", - "version": "0.0.26", + "version": "0.0.27", "license": "MIT", "description": "Lexicon document packet manager for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-password-session/CHANGELOG.md b/packages/lex/lex-password-session/CHANGELOG.md index 20b8822587d..f09b0f30fed 100644 --- a/packages/lex/lex-password-session/CHANGELOG.md +++ b/packages/lex/lex-password-session/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/lex-password-session +## 0.0.15 + +### Patch Changes + +- Updated dependencies [[`d8b2374`](https://github.com/bluesky-social/atproto/commit/d8b2374e1592d1dec65a33439791bc141f02397a)]: + - @atproto/lex-client@0.0.22 + ## 0.0.14 ### Patch Changes diff --git a/packages/lex/lex-password-session/package.json b/packages/lex/lex-password-session/package.json index 9d04ac12e45..9049db1422b 100644 --- a/packages/lex/lex-password-session/package.json +++ b/packages/lex/lex-password-session/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-password-session", - "version": "0.0.14", + "version": "0.0.15", "license": "MIT", "description": "Password based client authentication for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-resolver/CHANGELOG.md b/packages/lex/lex-resolver/CHANGELOG.md index 5933a30952f..c063ece233c 100644 --- a/packages/lex/lex-resolver/CHANGELOG.md +++ b/packages/lex/lex-resolver/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/lex-resolver +## 0.0.24 + +### Patch Changes + +- Updated dependencies [[`d8b2374`](https://github.com/bluesky-social/atproto/commit/d8b2374e1592d1dec65a33439791bc141f02397a)]: + - @atproto/lex-client@0.0.22 + ## 0.0.23 ### Patch Changes diff --git a/packages/lex/lex-resolver/package.json b/packages/lex/lex-resolver/package.json index dd0a692f1c5..0353c23c1d7 100644 --- a/packages/lex/lex-resolver/package.json +++ b/packages/lex/lex-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-resolver", - "version": "0.0.23", + "version": "0.0.24", "license": "MIT", "description": "Lexicon document resolver utility for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-server/CHANGELOG.md b/packages/lex/lex-server/CHANGELOG.md index d9b33582f28..4690fbe1201 100644 --- a/packages/lex/lex-server/CHANGELOG.md +++ b/packages/lex/lex-server/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/lex-server +## 0.0.19 + +### Patch Changes + +- Updated dependencies [[`d8b2374`](https://github.com/bluesky-social/atproto/commit/d8b2374e1592d1dec65a33439791bc141f02397a)]: + - @atproto/lex-client@0.0.22 + ## 0.0.18 ### Patch Changes diff --git a/packages/lex/lex-server/package.json b/packages/lex/lex-server/package.json index 635d1cc3bff..2c3fdf80a4a 100644 --- a/packages/lex/lex-server/package.json +++ b/packages/lex/lex-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-server", - "version": "0.0.18", + "version": "0.0.19", "license": "MIT", "description": "Request router for Atproto Lexicon protocols and schemas", "keywords": [ diff --git a/packages/lex/lex/CHANGELOG.md b/packages/lex/lex/CHANGELOG.md index 2270b29b60d..8e8883ecac2 100644 --- a/packages/lex/lex/CHANGELOG.md +++ b/packages/lex/lex/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/lex +## 0.0.27 + +### Patch Changes + +- Updated dependencies [[`d8b2374`](https://github.com/bluesky-social/atproto/commit/d8b2374e1592d1dec65a33439791bc141f02397a)]: + - @atproto/lex-client@0.0.22 + - @atproto/lex-installer@0.0.27 + ## 0.0.26 ### Patch Changes diff --git a/packages/lex/lex/package.json b/packages/lex/lex/package.json index 114fb4f4c85..dd39ad77968 100644 --- a/packages/lex/lex/package.json +++ b/packages/lex/lex/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex", - "version": "0.0.26", + "version": "0.0.27", "license": "MIT", "description": "Lexicon tooling for AT", "keywords": [ diff --git a/packages/lexicon-resolver/CHANGELOG.md b/packages/lexicon-resolver/CHANGELOG.md index 13491c58370..0e681a46712 100644 --- a/packages/lexicon-resolver/CHANGELOG.md +++ b/packages/lexicon-resolver/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/lexicon-resolver +## 0.3.7 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.27 + ## 0.3.6 ### Patch Changes diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 1be72c5337e..239cb28b24e 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lexicon-resolver", - "version": "0.3.6", + "version": "0.3.7", "type": "commonjs", "license": "MIT", "description": "ATProto Lexicon resolution", diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 3ef0e7434ef..802f243364e 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/oauth-provider +## 0.16.5 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex-resolver@0.0.24 + ## 0.16.4 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index cf45d65973c..1596b5cf972 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.16.4", + "version": "0.16.5", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index 6cb0c2ce116..9c3dc621e6b 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,16 @@ # @atproto/pds +## 0.4.223 + +### Patch Changes + +- [#4844](https://github.com/bluesky-social/atproto/pull/4844) [`04d727c`](https://github.com/bluesky-social/atproto/commit/04d727c69a2683ea15eff70d9d0bb6aa25452778) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add account manager tests + +- Updated dependencies []: + - @atproto/lex@0.0.27 + - @atproto/xrpc-server@0.10.22 + - @atproto/oauth-provider@0.16.5 + ## 0.4.222 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 667af66bd5d..ebdbd751b86 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.222", + "version": "0.4.223", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index c2ccbe14d51..bf39f96ca6e 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -1,5 +1,13 @@ # @atproto/sync +## 0.2.4 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.27 + - @atproto/xrpc-server@0.10.22 + ## 0.2.3 ### Patch Changes diff --git a/packages/sync/package.json b/packages/sync/package.json index 6ed8fb10a95..a4ad8ae9ff9 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/sync", - "version": "0.2.3", + "version": "0.2.4", "license": "MIT", "description": "atproto sync library", "keywords": [ diff --git a/packages/tap/CHANGELOG.md b/packages/tap/CHANGELOG.md index c0d74901d0e..a42333c749c 100644 --- a/packages/tap/CHANGELOG.md +++ b/packages/tap/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/tap +## 0.2.15 + +### Patch Changes + +- Updated dependencies []: + - @atproto/lex@0.0.27 + ## 0.2.14 ### Patch Changes diff --git a/packages/tap/package.json b/packages/tap/package.json index 3bef6221df4..b791717c6f5 100644 --- a/packages/tap/package.json +++ b/packages/tap/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/tap", - "version": "0.2.14", + "version": "0.2.15", "license": "MIT", "description": "atproto tap client", "keywords": [ diff --git a/packages/xrpc-server/CHANGELOG.md b/packages/xrpc-server/CHANGELOG.md index 2831db6717d..5a39394de17 100644 --- a/packages/xrpc-server/CHANGELOG.md +++ b/packages/xrpc-server/CHANGELOG.md @@ -1,5 +1,12 @@ # @atproto/xrpc-server +## 0.10.22 + +### Patch Changes + +- Updated dependencies [[`d8b2374`](https://github.com/bluesky-social/atproto/commit/d8b2374e1592d1dec65a33439791bc141f02397a)]: + - @atproto/lex-client@0.0.22 + ## 0.10.21 ### Patch Changes diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index ebee7025ad4..524e6b47084 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc-server", - "version": "0.10.21", + "version": "0.10.22", "license": "MIT", "description": "atproto HTTP API (XRPC) server library", "keywords": [ From f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c Mon Sep 17 00:00:00 2001 From: devin ivy Date: Mon, 18 May 2026 22:05:31 -0400 Subject: [PATCH 40/87] Upgrade packages to node v22+ (#4929) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Drop Node 18/20 support, require Node >=22 - Bump engines.node to >=22 in every package.json (workspace root + all published packages). Adds the field to 38 packages that didn't previously declare it, so consumers installing any @atproto or @atproto-labs package on Node 18/20 now see the standard npm engines warning. - Bump devDependency @types/node to ^22.0.0 (resolves to 22.19.17). - Add explicit AbortSignal return type on two getters in ozone's BackgroundQueue / PeriodicBackgroundTask to satisfy TS4041 under the new @types/node (AbortSignal moved into an internal web-globals module that TS won't reference in emitted declarations). - Bump better-sqlite3 (pds) from ^10.0.0 to ^12.0.0 for Node 22/24 prebuilt binaries. Previously, v10 shipped no Node 24 prebuilt, and the node-gyp fallback fails on Python 3.12+ (distutils removed). - Bump opentelemetry-plugin-better-sqlite3 (services/pds) from ^1.1.0 to ^1.13.0 to widen its peer range to accept better-sqlite3@12. - Add a scoped pnpm override so opentelemetry-plugin-better-sqlite3's transitive @opentelemetry/core resolves to ^1.30.0, which accepts @opentelemetry/api@1.9.0 (core@1.18.1 capped the peer at <1.8.0). dd-trace's pinned core@1.18.1 subtree is untouched. Co-Authored-By: Claude Opus 4.7 (1M context) * services: bump Docker base to node:22-alpine3.23 Unifies the four service Dockerfiles — pds and bsky were on node:20.20-alpine3.23 / node:20.20-alpine, bsync and ozone on node:18-alpine — onto the same node:22-alpine3.23 image. Co-Authored-By: Claude Opus 4.7 (1M context) * @atproto-labs/fetch-node: drop Node <20 compat branch Now that the Node floor is 22, the SUPPORTS_REQUEST_INIT_DISPATCHER flag in unicastFetchWrap is always true. Removes the flag, the always-false else branch, and the unused undici Client import. Also removes the dangerouslyForceKeepAliveAgent option from UnicastFetchWrapOptions and SafeFetchWrapOptions — it was a no-op on Node 20+ per its own docs, and is now a no-op on every supported version. Removes the corresponding option (and its stale Node<=20 comment) from the PDS's safeFetchWrap configuration in context.ts. Co-Authored-By: Claude Opus 4.7 (1M context) * services: replace deprecated 'corepack prepare --activate' The --activate flag on 'corepack prepare' is deprecated as of corepack 0.31+. 'corepack install' is the modern equivalent — it reads the packageManager field from package.json and installs that exact pnpm version, without the deprecated flag. Functionally identical for the build, just stops emitting deprecation warnings on Node 22+. Co-Authored-By: Claude Opus 4.7 (1M context) * ci * Fix WithImplicitCoercion type for @types/node@22 @types/node@22 moved WithImplicitCoercion into a module-scoped declaration within the buffer module. Add a local type alias so this file compiles without depending on @types/node's internal structure. Co-Authored-By: Claude Opus 4.6 (1M context) * Update README Node version + bump Dockerfiles to node 24 - README: clarify Node.js 22 or later is required - Dockerfiles: bump from node:22-alpine3.23 to node:24-alpine3.23 Co-Authored-By: Claude Opus 4.6 (1M context) * Address PR feedback - unicast.ts: re-introduce SUPPORTS_REQUEST_INIT_DISPATCHER as a runtime guard that throws if the platform doesn't support the dispatcher init option (safety net for older Node) - nodejs-buffer.ts: reference tsconfig/isomorphic.json in comment - Changeset: add BREAKING prefix, split fetch-node option removal into its own changeset to avoid polluting every package's changelog Co-Authored-By: Claude Opus 4.6 (1M context) * remove repo workflow on push --------- Co-authored-by: Claude Opus 4.7 (1M context) --- .changeset/drop-node-18-20.md | 63 ++++ .../fetch-node-drop-keepalive-option.md | 5 + README.md | 4 +- package.json | 9 +- packages/api/package.json | 3 + packages/aws/package.json | 2 +- packages/bsky/package.json | 2 +- packages/bsync/package.json | 2 +- packages/common-web/package.json | 3 + packages/common/package.json | 2 +- packages/crypto/package.json | 2 +- packages/dev-env/package.json | 2 +- packages/did/package.json | 3 + packages/identity/package.json | 2 +- packages/internal/did-resolver/package.json | 3 + packages/internal/fetch-node/package.json | 2 +- packages/internal/fetch-node/src/safe.ts | 5 +- packages/internal/fetch-node/src/unicast.ts | 186 ++-------- packages/internal/fetch/package.json | 3 + .../handle-resolver-node/package.json | 2 +- .../internal/handle-resolver/package.json | 3 + .../internal/identity-resolver/package.json | 3 + packages/internal/pipe/package.json | 3 + .../package.json | 2 +- .../internal/simple-store-memory/package.json | 3 + .../internal/simple-store-redis/package.json | 3 + packages/internal/simple-store/package.json | 3 + packages/internal/xrpc-utils/package.json | 3 + packages/lex-cli/package.json | 2 +- packages/lex/lex-builder/package.json | 3 + packages/lex/lex-cbor/package.json | 3 + packages/lex/lex-client/package.json | 3 + packages/lex/lex-data/package.json | 3 + .../lex/lex-data/src/lib/nodejs-buffer.ts | 5 + packages/lex/lex-document/package.json | 3 + packages/lex/lex-installer/package.json | 3 + packages/lex/lex-json/package.json | 3 + .../lex/lex-password-session/package.json | 3 + packages/lex/lex-resolver/package.json | 3 + packages/lex/lex-schema/package.json | 3 + packages/lex/lex-server/package.json | 3 + packages/lex/lex/package.json | 3 + packages/lexicon-resolver/package.json | 3 + packages/lexicon/package.json | 3 + packages/oauth/jwk-jose/package.json | 3 + packages/oauth/jwk-webcrypto/package.json | 3 + packages/oauth/jwk/package.json | 3 + .../oauth-client-browser-example/package.json | 3 + .../oauth/oauth-client-browser/package.json | 3 + packages/oauth/oauth-client-expo/package.json | 3 + packages/oauth/oauth-client-node/package.json | 2 +- packages/oauth/oauth-client/package.json | 3 + .../oauth/oauth-provider-api/package.json | 3 + packages/oauth/oauth-provider-ui/package.json | 2 +- packages/oauth/oauth-provider/package.json | 2 +- packages/oauth/oauth-scopes/package.json | 3 + packages/oauth/oauth-types/package.json | 3 + packages/ozone/package.json | 2 +- packages/ozone/src/background.ts | 4 +- packages/pds/package.json | 4 +- packages/pds/src/context.ts | 9 - packages/repo/package.json | 2 +- packages/sync/package.json | 2 +- packages/syntax/package.json | 3 + packages/tap/package.json | 2 +- packages/ws-client/package.json | 2 +- packages/xrpc-server/package.json | 2 +- packages/xrpc/package.json | 3 + pnpm-lock.yaml | 329 +++++++++++------- services/bsky/Dockerfile | 6 +- services/bsync/Dockerfile | 6 +- services/ozone/Dockerfile | 6 +- services/pds/Dockerfile | 6 +- services/pds/package.json | 2 +- 74 files changed, 455 insertions(+), 348 deletions(-) create mode 100644 .changeset/drop-node-18-20.md create mode 100644 .changeset/fetch-node-drop-keepalive-option.md diff --git a/.changeset/drop-node-18-20.md b/.changeset/drop-node-18-20.md new file mode 100644 index 00000000000..ab2d96024ba --- /dev/null +++ b/.changeset/drop-node-18-20.md @@ -0,0 +1,63 @@ +--- +'@atproto/bsky': patch +'@atproto/bsync': patch +'@atproto/ozone': patch +'@atproto/pds': patch +'@atproto/api': minor +'@atproto/aws': minor +'@atproto/common': minor +'@atproto/common-web': minor +'@atproto/crypto': minor +'@atproto/dev-env': minor +'@atproto/did': minor +'@atproto/identity': minor +'@atproto/jwk': minor +'@atproto/jwk-jose': minor +'@atproto/jwk-webcrypto': minor +'@atproto/lex': minor +'@atproto/lex-builder': minor +'@atproto/lex-cbor': minor +'@atproto/lex-cli': minor +'@atproto/lex-client': minor +'@atproto/lex-data': minor +'@atproto/lex-document': minor +'@atproto/lex-installer': minor +'@atproto/lex-json': minor +'@atproto/lex-password-session': minor +'@atproto/lex-resolver': minor +'@atproto/lex-schema': minor +'@atproto/lex-server': minor +'@atproto/lexicon': minor +'@atproto/lexicon-resolver': minor +'@atproto/oauth-client': minor +'@atproto/oauth-client-browser': minor +'@atproto/oauth-client-browser-example': minor +'@atproto/oauth-client-expo': minor +'@atproto/oauth-client-node': minor +'@atproto/oauth-provider': minor +'@atproto/oauth-provider-api': minor +'@atproto/oauth-provider-ui': minor +'@atproto/oauth-scopes': minor +'@atproto/oauth-types': minor +'@atproto/repo': minor +'@atproto/sync': minor +'@atproto/syntax': minor +'@atproto/tap': minor +'@atproto/ws-client': minor +'@atproto/xrpc': minor +'@atproto/xrpc-server': minor +'@atproto-labs/did-resolver': minor +'@atproto-labs/fetch': minor +'@atproto-labs/fetch-node': minor +'@atproto-labs/handle-resolver': minor +'@atproto-labs/handle-resolver-node': minor +'@atproto-labs/identity-resolver': minor +'@atproto-labs/pipe': minor +'@atproto-labs/rollup-plugin-bundle-manifest': minor +'@atproto-labs/simple-store': minor +'@atproto-labs/simple-store-memory': minor +'@atproto-labs/simple-store-redis': minor +'@atproto-labs/xrpc-utils': minor +--- + +**BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. diff --git a/.changeset/fetch-node-drop-keepalive-option.md b/.changeset/fetch-node-drop-keepalive-option.md new file mode 100644 index 00000000000..d73fb0ec5de --- /dev/null +++ b/.changeset/fetch-node-drop-keepalive-option.md @@ -0,0 +1,5 @@ +--- +'@atproto-labs/fetch-node': minor +--- + +**BREAKING:** `unicastFetchWrap` and `safeFetchWrap` no longer accept `dangerouslyForceKeepAliveAgent` — on Node.js 22+ the keep-alive dispatcher is always used via `new Request(input, { dispatcher })`, so the option was a no-op. diff --git a/README.md b/README.md index da08d1bd011..d75aa2c3ad6 100644 --- a/README.md +++ b/README.md @@ -36,12 +36,12 @@ Go programming language source code is in [bluesky-social/indigo](https://github ## Developer Quickstart -We recommend [`nvm`](https://github.com/nvm-sh/nvm) for managing Node.js installs. This project requires Node.js version 18. `pnpm` is used to manage the workspace of multiple packages. You can install it with `npm install --global pnpm`. +We recommend [`nvm`](https://github.com/nvm-sh/nvm) for managing Node.js installs. This project requires Node.js version 22 or later. `pnpm` is used to manage the workspace of multiple packages. You can install it with `npm install --global pnpm`. There is a Makefile which can help with basic development tasks: ```shell -# use existing nvm to install node 18 and pnpm +# use existing nvm to install node 22 and pnpm make nvm-setup # pull dependencies and build all local packages diff --git a/package.json b/package.json index 5037395a01c..126c2638977 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "license": "MIT", "private": true, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "packageManager": "pnpm@8.15.9+sha512.499434c9d8fdd1a2794ebf4552b3b25c0a633abcee5bb15e7b5de90f32f47b513aca98cd5cfd001c31f0db454bc3804edccd578501e4ca293a6816166bbd9f81", "devEngines": { @@ -17,10 +17,11 @@ }, "pnpm": { "executionEnv": { - "nodeVersion": ">=18.7.0" + "nodeVersion": ">=22" }, "overrides": { - "cookie": "^0.7.2" + "cookie": "^0.7.2", + "opentelemetry-plugin-better-sqlite3>@opentelemetry/core": "^1.30.0" } }, "scripts": { @@ -53,7 +54,7 @@ "@swc/core": "^1.3.42", "@swc/jest": "^0.2.24", "@types/jest": "^28.1.4", - "@types/node": "^18.19.67", + "@types/node": "^22.0.0", "@typescript-eslint/eslint-plugin": "^7.4.0", "@typescript-eslint/parser": "^7.4.0", "@vitest/coverage-v8": "4.0.16", diff --git a/packages/api/package.json b/packages/api/package.json index d4a90dcbe43..207b08ec069 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/api", "version": "0.19.19", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Client library for atproto and Bluesky", "keywords": [ diff --git a/packages/aws/package.json b/packages/aws/package.json index 67634ef5bba..495c1d6a6e9 100644 --- a/packages/aws/package.json +++ b/packages/aws/package.json @@ -19,7 +19,7 @@ "build": "tsc --build tsconfig.build.json" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/common": "workspace:^", diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 6fc7cac78fd..85b51fc305e 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -27,7 +27,7 @@ "buf:gen": "buf generate ../bsync/proto && buf generate ./proto" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto-labs/fetch-node": "workspace:^", diff --git a/packages/bsync/package.json b/packages/bsync/package.json index 132a046f2fb..cb50622a35c 100644 --- a/packages/bsync/package.json +++ b/packages/bsync/package.json @@ -25,7 +25,7 @@ "buf:gen": "buf generate proto" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/common": "workspace:^", diff --git a/packages/common-web/package.json b/packages/common-web/package.json index 3871c712bab..d3b5560ea69 100644 --- a/packages/common-web/package.json +++ b/packages/common-web/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/common-web", "version": "0.4.21", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Shared web-platform-friendly code for atproto libraries", "keywords": [ diff --git a/packages/common/package.json b/packages/common/package.json index de11ed0b46e..31908406701 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -19,7 +19,7 @@ "build": "tsc --build tsconfig.build.json" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/common-web": "workspace:^", diff --git a/packages/crypto/package.json b/packages/crypto/package.json index 899c23175dd..63ba6b31383 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -20,7 +20,7 @@ "build": "tsc --build tsconfig.build.json" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@noble/curves": "^1.7.0", diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 95bb92c9d82..83fb9b07ad3 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -21,7 +21,7 @@ "dev": "../dev-infra/with-test-redis-and-db.sh node --enable-source-maps --watch dist/bin.js" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/api": "workspace:^", diff --git a/packages/did/package.json b/packages/did/package.json index 1e3e2853555..54ee1f1e93c 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/did", "version": "0.3.0", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "DID resolution and verification library", "keywords": [ diff --git a/packages/identity/package.json b/packages/identity/package.json index d6ab1fd1a9f..4de1092e856 100644 --- a/packages/identity/package.json +++ b/packages/identity/package.json @@ -22,7 +22,7 @@ "build": "tsc --build tsconfig.build.json" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/common-web": "workspace:^", diff --git a/packages/internal/did-resolver/package.json b/packages/internal/did-resolver/package.json index f154975cfef..fefb08e7592 100644 --- a/packages/internal/did-resolver/package.json +++ b/packages/internal/did-resolver/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/did-resolver", "version": "0.2.6", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "DID resolution and verification library", "keywords": [ diff --git a/packages/internal/fetch-node/package.json b/packages/internal/fetch-node/package.json index c564b48078e..bfef324315d 100644 --- a/packages/internal/fetch-node/package.json +++ b/packages/internal/fetch-node/package.json @@ -24,7 +24,7 @@ } }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto-labs/fetch": "workspace:^", diff --git a/packages/internal/fetch-node/src/safe.ts b/packages/internal/fetch-node/src/safe.ts index 413b14919c8..43cc5b07358 100644 --- a/packages/internal/fetch-node/src/safe.ts +++ b/packages/internal/fetch-node/src/safe.ts @@ -52,7 +52,6 @@ export type SafeFetchWrapOptions = UnicastFetchWrapOptions & { */ export function safeFetchWrap({ fetch = globalThis.fetch as Fetch, - dangerouslyForceKeepAliveAgent = false, responseMaxSize = 512 * 1024, // 512kB ssrfProtection = true, allowCustomPort = !ssrfProtection, @@ -106,9 +105,7 @@ export function safeFetchWrap({ * input, we need to make sure that the request is not vulnerable to SSRF * attacks. */ - allowPrivateIps - ? fetch - : unicastFetchWrap({ fetch, dangerouslyForceKeepAliveAgent }), + allowPrivateIps ? fetch : unicastFetchWrap({ fetch }), ), /** diff --git a/packages/internal/fetch-node/src/unicast.ts b/packages/internal/fetch-node/src/unicast.ts index 2f80c96b0f2..fdafe7766fc 100644 --- a/packages/internal/fetch-node/src/unicast.ts +++ b/packages/internal/fetch-node/src/unicast.ts @@ -1,7 +1,7 @@ import dns, { LookupAddress } from 'node:dns' import { LookupFunction } from 'node:net' import ipaddr from 'ipaddr.js' -import { Agent, Client } from 'undici' +import { Agent } from 'undici' import { Fetch, FetchContext, @@ -15,38 +15,8 @@ const { IPv4, IPv6 } = ipaddr export type UnicastFetchWrapOptions = { fetch?: Fetch - - /** - * ## ‼️ important security feature use with care - * - * On older NodeJS version, the `dispatcher` init option is ignored when - * creating a new Request instance. It can only be passed through the fetch - * function directly. - * - * Since this is a security feature, we need to ensure that the unicastLookup - * function is called to resolve the hostname to a unicast IP address. - * - * However, in the case a custom "fetch" function is passed here (fetch !== - * globalThis.fetch), we have no guarantee that the dispatcher will be used to - * make the request. Because of this, in such a case, we will use a one-time - * use dispatcher that checks that the provided fetch function indeed made use - * of the "unicastLookup" when a custom dispatch init function is used. - * - * Sadly, this means that we cannot use "keepAlive" connections, as the method - * used to ensure that "unicastLookup" gets called requires to create a new - * dispatcher for each request. - * - * If you can guarantee that the provided fetch function will make use of the - * "dispatcher" init option, you can set this flag to true, which will enable - * the use of a single agent (with keep-alive) for all requests. - * - * @default false - * @note This option has no effect on Node.js versions >= 20 - */ - dangerouslyForceKeepAliveAgent?: boolean } -// @TODO support other runtimes ? const SUPPORTS_REQUEST_INIT_DISPATCHER = Number(process.versions.node.split('.')[0]) >= 20 @@ -55,141 +25,39 @@ const SUPPORTS_REQUEST_INIT_DISPATCHER = */ export function unicastFetchWrap({ fetch = globalThis.fetch, - dangerouslyForceKeepAliveAgent = false, }: UnicastFetchWrapOptions): Fetch { - if ( - SUPPORTS_REQUEST_INIT_DISPATCHER || - dangerouslyForceKeepAliveAgent || - fetch === globalThis.fetch - ) { - const dispatcher = new Agent({ - connect: { lookup: unicastLookup }, - }) - - return async function (input, init): Promise { - if (init?.dispatcher) { - throw new FetchRequestError( - asRequest(input, init), - 500, - 'SSRF protection cannot be used with a custom request dispatcher', - ) - } - - const url = extractUrl(input) + if (!SUPPORTS_REQUEST_INIT_DISPATCHER) { + throw new Error( + 'Unicast SSRF protection unavailable on your platform. Update to Node.js 22+.', + ) + } - if (url.hostname && isUnicastIp(url.hostname) === false) { - throw new FetchRequestError( - asRequest(input, init), - 400, - 'Hostname is a non-unicast address', - ) - } + const dispatcher = new Agent({ + connect: { lookup: unicastLookup }, + }) - if (SUPPORTS_REQUEST_INIT_DISPATCHER) { - // @ts-expect-error non-standard option - const request = new Request(input, { ...init, dispatcher }) - return fetch.call(this, request) - } else { - // @ts-expect-error non-standard option - return fetch.call(this, input, { ...init, dispatcher }) - } + return async function (input, init): Promise { + if (init?.dispatcher) { + throw new FetchRequestError( + asRequest(input, init), + 500, + 'SSRF protection cannot be used with a custom request dispatcher', + ) } - } else { - return async function (input, init): Promise { - if (init?.dispatcher) { - throw new FetchRequestError( - asRequest(input, init), - 500, - 'SSRF protection cannot be used with a custom request dispatcher', - ) - } - const url = extractUrl(input) + const url = extractUrl(input) - if (!url.hostname) { - return fetch.call(this, input, init) - } - - switch (isUnicastIp(url.hostname)) { - case true: { - // hostname is a unicast address, safe to proceed. - return fetch.call(this, input, init) - } - - case false: { - throw new FetchRequestError( - asRequest(input, init), - 400, - 'Hostname is a non-unicast address', - ) - } - - case undefined: { - // hostname is a domain name, let's create a new dispatcher that - // will 1) use the unicastLookup function to resolve the hostname - // and 2) allow us to check that the lookup function was indeed - // called. - - let didLookup = false - const dispatcher = new Client(url.origin, { - // Do *not* enable H2 here, as it will cause an error (the - // client will terminate the connection before the response is - // consumed). - // https://github.com/nodejs/undici/issues/3671 - connect: { - keepAlive: false, // Client will be used once - lookup(...args) { - didLookup = true - unicastLookup(...args) - }, - }, - }) - - try { - const headers = new Headers(init?.headers) - headers.set('connection', 'close') // Proactively close the connection - - const response = await fetch.call(this, input, { - ...init, - headers, - // @ts-expect-error non-standard option - dispatcher, - }) - - if (!didLookup) { - // We need to ensure that the body is discarded. We can either - // consume the whole body (for await loop) in order to keep the - // socket alive, or cancel the request. Since we sent "connection: - // close", there is no point in consuming the whole response - // (which would cause un-necessary bandwidth). - // - // https://undici.nodejs.org/#/?id=garbage-collection - await response.body?.cancel() - - // If you encounter this error, either upgrade to Node.js >=21 or - // make sure that the dispatcher passed through the requestInit - // object ends up being used to make the request. - - // eslint-disable-next-line no-unsafe-finally - throw new FetchRequestError( - asRequest(input, init), - 500, - 'Unable to enforce SSRF protection', - ) - } - - return response - } finally { - // Free resources (we cannot await here since the response was not - // consumed yet). - void dispatcher.close().catch((err) => { - // No biggie, but let's still log it - console.warn('Failed to close dispatcher', err) - }) - } - } - } + if (url.hostname && isUnicastIp(url.hostname) === false) { + throw new FetchRequestError( + asRequest(input, init), + 400, + 'Hostname is a non-unicast address', + ) } + + // @ts-expect-error non-standard option + const request = new Request(input, { ...init, dispatcher }) + return fetch.call(this, request) } } diff --git a/packages/internal/fetch/package.json b/packages/internal/fetch/package.json index a5859efc734..7a5e25d91d5 100644 --- a/packages/internal/fetch/package.json +++ b/packages/internal/fetch/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/fetch", "version": "0.2.3", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Isomorphic wrapper utilities for fetch API", "keywords": [ diff --git a/packages/internal/handle-resolver-node/package.json b/packages/internal/handle-resolver-node/package.json index 0aebc9d5d13..884146fed9e 100644 --- a/packages/internal/handle-resolver-node/package.json +++ b/packages/internal/handle-resolver-node/package.json @@ -26,7 +26,7 @@ } }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto-labs/fetch-node": "workspace:^", diff --git a/packages/internal/handle-resolver/package.json b/packages/internal/handle-resolver/package.json index 59e53222dc5..450a96856b6 100644 --- a/packages/internal/handle-resolver/package.json +++ b/packages/internal/handle-resolver/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/handle-resolver", "version": "0.3.6", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Isomorphic ATProto handle to DID resolver", "keywords": [ diff --git a/packages/internal/identity-resolver/package.json b/packages/internal/identity-resolver/package.json index 02268f18a78..ad0d85acf08 100644 --- a/packages/internal/identity-resolver/package.json +++ b/packages/internal/identity-resolver/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/identity-resolver", "version": "0.3.6", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "A library resolving ATPROTO identities", "keywords": [ diff --git a/packages/internal/pipe/package.json b/packages/internal/pipe/package.json index 3ccd26d6066..f134005446a 100644 --- a/packages/internal/pipe/package.json +++ b/packages/internal/pipe/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/pipe", "version": "0.1.1", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Library for combining multiple functions into a single function.", "keywords": [ diff --git a/packages/internal/rollup-plugin-bundle-manifest/package.json b/packages/internal/rollup-plugin-bundle-manifest/package.json index b56a71b8ff7..9594034eaeb 100644 --- a/packages/internal/rollup-plugin-bundle-manifest/package.json +++ b/packages/internal/rollup-plugin-bundle-manifest/package.json @@ -24,7 +24,7 @@ } }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "files": [ "dist" diff --git a/packages/internal/simple-store-memory/package.json b/packages/internal/simple-store-memory/package.json index 5de3d5d462e..23c7fb13e71 100644 --- a/packages/internal/simple-store-memory/package.json +++ b/packages/internal/simple-store-memory/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/simple-store-memory", "version": "0.1.4", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Memory based simple-store implementation", "keywords": [ diff --git a/packages/internal/simple-store-redis/package.json b/packages/internal/simple-store-redis/package.json index 1a8e7b4871c..50f2ef792ee 100644 --- a/packages/internal/simple-store-redis/package.json +++ b/packages/internal/simple-store-redis/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/simple-store-redis", "version": "0.0.1", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Redis based simple-store implementation", "keywords": [ diff --git a/packages/internal/simple-store/package.json b/packages/internal/simple-store/package.json index bca80c8ebec..2c309039b55 100644 --- a/packages/internal/simple-store/package.json +++ b/packages/internal/simple-store/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/simple-store", "version": "0.3.0", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Simple store interfaces & utilities", "keywords": [ diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index f094dc4cfd4..ece43f80c00 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -1,6 +1,9 @@ { "name": "@atproto-labs/xrpc-utils", "version": "0.0.24", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "XRPC server utilities for Node.JS", "keywords": [ diff --git a/packages/lex-cli/package.json b/packages/lex-cli/package.json index 77f168a6097..2f855e2bdf6 100644 --- a/packages/lex-cli/package.json +++ b/packages/lex-cli/package.json @@ -22,7 +22,7 @@ "build": "tsc --build tsconfig.build.json" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/lexicon": "workspace:^", diff --git a/packages/lex/lex-builder/package.json b/packages/lex/lex-builder/package.json index 8d55fd2882e..007467578ed 100644 --- a/packages/lex/lex-builder/package.json +++ b/packages/lex/lex-builder/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-builder", "version": "0.0.23", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "TypeScript schema builder for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-cbor/package.json b/packages/lex/lex-cbor/package.json index 054a27c2e3a..c8cca57e853 100644 --- a/packages/lex/lex-cbor/package.json +++ b/packages/lex/lex-cbor/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-cbor", "version": "0.0.16", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon encoding utilities for AT Lexicon data in CBOR format", "keywords": [ diff --git a/packages/lex/lex-client/package.json b/packages/lex/lex-client/package.json index 9aa6ea857cd..b5be3bff5fd 100644 --- a/packages/lex/lex-client/package.json +++ b/packages/lex/lex-client/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-client", "version": "0.0.22", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "HTTP client for interacting with Lexicon based APIs", "keywords": [ diff --git a/packages/lex/lex-data/package.json b/packages/lex/lex-data/package.json index 1f3049a7095..ee9e4489199 100644 --- a/packages/lex/lex-data/package.json +++ b/packages/lex/lex-data/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-data", "version": "0.0.15", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Core utilities for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-data/src/lib/nodejs-buffer.ts b/packages/lex/lex-data/src/lib/nodejs-buffer.ts index 30828166f97..bbf3107fb67 100644 --- a/packages/lex/lex-data/src/lib/nodejs-buffer.ts +++ b/packages/lex/lex-data/src/lib/nodejs-buffer.ts @@ -1,5 +1,10 @@ type Encoding = 'utf8' | 'base64' | 'base64url' +// Node's buffer module declares this type internally, but referencing it here +// would couple this file to @types/node. Local copy keeps this module +// standalone so it compiles in any environment (see tsconfig/isomorphic.json). +type WithImplicitCoercion = T | { valueOf(): T } + interface NodeJSBuffer extends Uint8Array { byteLength: number diff --git a/packages/lex/lex-document/package.json b/packages/lex/lex-document/package.json index f14b19b6b02..e3e76006ab1 100644 --- a/packages/lex/lex-document/package.json +++ b/packages/lex/lex-document/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-document", "version": "0.0.21", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon document validation tools for AT", "keywords": [ diff --git a/packages/lex/lex-installer/package.json b/packages/lex/lex-installer/package.json index 9aaf18df89f..372bb97b102 100644 --- a/packages/lex/lex-installer/package.json +++ b/packages/lex/lex-installer/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-installer", "version": "0.0.27", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon document packet manager for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-json/package.json b/packages/lex/lex-json/package.json index b97cc3b223c..e6290371f08 100644 --- a/packages/lex/lex-json/package.json +++ b/packages/lex/lex-json/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-json", "version": "0.0.16", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon encoding utilities for AT Lexicon data in JSON format", "keywords": [ diff --git a/packages/lex/lex-password-session/package.json b/packages/lex/lex-password-session/package.json index 9049db1422b..d0a9a25f308 100644 --- a/packages/lex/lex-password-session/package.json +++ b/packages/lex/lex-password-session/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-password-session", "version": "0.0.15", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Password based client authentication for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-resolver/package.json b/packages/lex/lex-resolver/package.json index 0353c23c1d7..f0090ca8df2 100644 --- a/packages/lex/lex-resolver/package.json +++ b/packages/lex/lex-resolver/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-resolver", "version": "0.0.24", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon document resolver utility for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-schema/package.json b/packages/lex/lex-schema/package.json index 0c55eb85190..6506012a1ce 100644 --- a/packages/lex/lex-schema/package.json +++ b/packages/lex/lex-schema/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-schema", "version": "0.0.20", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon schema system for AT Lexicons", "keywords": [ diff --git a/packages/lex/lex-server/package.json b/packages/lex/lex-server/package.json index 2c3fdf80a4a..137bdf26684 100644 --- a/packages/lex/lex-server/package.json +++ b/packages/lex/lex-server/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex-server", "version": "0.0.19", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Request router for Atproto Lexicon protocols and schemas", "keywords": [ diff --git a/packages/lex/lex/package.json b/packages/lex/lex/package.json index dd39ad77968..dcd9d72a848 100644 --- a/packages/lex/lex/package.json +++ b/packages/lex/lex/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lex", "version": "0.0.27", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Lexicon tooling for AT", "keywords": [ diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 239cb28b24e..395cad459e9 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lexicon-resolver", "version": "0.3.7", + "engines": { + "node": ">=22" + }, "type": "commonjs", "license": "MIT", "description": "ATProto Lexicon resolution", diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index 4dbf0188492..4c43765b7e0 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/lexicon", "version": "0.6.2", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "atproto Lexicon schema language library", "keywords": [ diff --git a/packages/oauth/jwk-jose/package.json b/packages/oauth/jwk-jose/package.json index 99f14b8db98..662e225f8b7 100644 --- a/packages/oauth/jwk-jose/package.json +++ b/packages/oauth/jwk-jose/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/jwk-jose", "version": "0.1.11", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "`jose` based implementation of @atproto/jwk Key's", "keywords": [ diff --git a/packages/oauth/jwk-webcrypto/package.json b/packages/oauth/jwk-webcrypto/package.json index 048db06dc19..dec8fedf4d8 100644 --- a/packages/oauth/jwk-webcrypto/package.json +++ b/packages/oauth/jwk-webcrypto/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/jwk-webcrypto", "version": "0.2.0", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Webcrypto based implementation of @atproto/jwk Key's", "keywords": [ diff --git a/packages/oauth/jwk/package.json b/packages/oauth/jwk/package.json index f2282726c30..1c3f0b8d354 100644 --- a/packages/oauth/jwk/package.json +++ b/packages/oauth/jwk/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/jwk", "version": "0.6.0", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "A library for working with JSON Web Keys (JWKs) in TypeScript. This is meant to be extended by environment-specific libraries like @atproto/jwk-jose.", "keywords": [ diff --git a/packages/oauth/oauth-client-browser-example/package.json b/packages/oauth/oauth-client-browser-example/package.json index 330eaf15a5d..2343f38a7c2 100644 --- a/packages/oauth/oauth-client-browser-example/package.json +++ b/packages/oauth/oauth-client-browser-example/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-client-browser-example", "version": "0.0.10", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Example single page application app using ATPROTO OAuth", "keywords": [ diff --git a/packages/oauth/oauth-client-browser/package.json b/packages/oauth/oauth-client-browser/package.json index a041b23c8dd..3c5ab22d732 100644 --- a/packages/oauth/oauth-client-browser/package.json +++ b/packages/oauth/oauth-client-browser/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-client-browser", "version": "0.3.42", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "ATPROTO OAuth client for the browser (relies on WebCrypto & Indexed DB)", "keywords": [ diff --git a/packages/oauth/oauth-client-expo/package.json b/packages/oauth/oauth-client-expo/package.json index 31063cebdd0..bd44a0050b9 100755 --- a/packages/oauth/oauth-client-expo/package.json +++ b/packages/oauth/oauth-client-expo/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-client-expo", "version": "0.0.10", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "ATPROTO OAuth client for Expo applications", "authors": [ diff --git a/packages/oauth/oauth-client-node/package.json b/packages/oauth/oauth-client-node/package.json index b439bf599d5..4d7216ff966 100644 --- a/packages/oauth/oauth-client-node/package.json +++ b/packages/oauth/oauth-client-node/package.json @@ -25,7 +25,7 @@ } }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "files": [ "dist" diff --git a/packages/oauth/oauth-client/package.json b/packages/oauth/oauth-client/package.json index 44798abe8ab..6ee61f9940b 100644 --- a/packages/oauth/oauth-client/package.json +++ b/packages/oauth/oauth-client/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-client", "version": "0.6.1", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "OAuth client for ATPROTO PDS. This package serves as common base for environment-specific implementations (NodeJS, Browser, React-Native).", "keywords": [ diff --git a/packages/oauth/oauth-provider-api/package.json b/packages/oauth/oauth-provider-api/package.json index 4eb116471d6..1dd349544de 100644 --- a/packages/oauth/oauth-provider-api/package.json +++ b/packages/oauth/oauth-provider-api/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-provider-api", "version": "0.4.0", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Shared data types for the @atproto/oauth-provider and @atproto/oauth-provider-ui packages", "keywords": [ diff --git a/packages/oauth/oauth-provider-ui/package.json b/packages/oauth/oauth-provider-ui/package.json index 86bb1e23bc1..10392016fe3 100644 --- a/packages/oauth/oauth-provider-ui/package.json +++ b/packages/oauth/oauth-provider-ui/package.json @@ -10,7 +10,7 @@ "directory": "packages/oauth/oauth-provider-ui" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "type": "commonjs", "exports": { diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 1596b5cf972..12da5422632 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -28,7 +28,7 @@ } }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto-labs/fetch": "workspace:^", diff --git a/packages/oauth/oauth-scopes/package.json b/packages/oauth/oauth-scopes/package.json index e790e14a650..65aa92ae726 100644 --- a/packages/oauth/oauth-scopes/package.json +++ b/packages/oauth/oauth-scopes/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-scopes", "version": "0.3.2", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "A library for manipulating and validating ATproto OAuth scopes in TypeScript.", "keywords": [ diff --git a/packages/oauth/oauth-types/package.json b/packages/oauth/oauth-types/package.json index 1e7a291efb1..25c99dd0311 100644 --- a/packages/oauth/oauth-types/package.json +++ b/packages/oauth/oauth-types/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/oauth-types", "version": "0.6.3", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "OAuth typing & validation library", "keywords": [ diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 113f1539e5d..6bb401eedb2 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -25,7 +25,7 @@ "migration:create": "ts-node ./bin/migration-create.ts" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "dependencies": { "@atproto/api": "workspace:^", diff --git a/packages/ozone/src/background.ts b/packages/ozone/src/background.ts index bbf6a84649b..731978df40b 100644 --- a/packages/ozone/src/background.ts +++ b/packages/ozone/src/background.ts @@ -12,7 +12,7 @@ export class BackgroundQueue { private abortController = new AbortController() private queue: PQueue - public get signal() { + public get signal(): AbortSignal { return this.abortController.signal } @@ -99,7 +99,7 @@ export class PeriodicBackgroundTask { private intervalPromise?: Promise private runningPromise?: Promise - public get signal() { + public get signal(): AbortSignal { return this.abortController.signal } diff --git a/packages/pds/package.json b/packages/pds/package.json index ebdbd751b86..6db5acce787 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -16,7 +16,7 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "scripts": { "codegen": "lex build --clear --indexFile --lexicons ../../lexicons", @@ -54,7 +54,7 @@ "@atproto/xrpc-server": "workspace:^", "@did-plc/lib": "^0.0.4", "@hapi/address": "^5.1.1", - "better-sqlite3": "^10.0.0", + "better-sqlite3": "^12.0.0", "compression": "^1.7.4", "cors": "^2.8.5", "disposable-email-domains-js": "^1.5.0", diff --git a/packages/pds/src/context.ts b/packages/pds/src/context.ts index d4b54e6ca47..aaafe0ddcfc 100644 --- a/packages/pds/src/context.ts +++ b/packages/pds/src/context.ts @@ -338,15 +338,6 @@ export class AppContext { responseMaxSize: cfg.fetch.maxResponseSize, ssrfProtection: !cfg.fetch.disableSsrfProtection, - // @NOTE Since we are using NodeJS <= 20, unicastFetchWrap would normally - // *not* be using a keep-alive agent if it we are providing a fetch - // function that is different from `globalThis.fetch`. However, since the - // fetch function below is indeed calling `globalThis.fetch` without - // altering any argument, we can safely force the use of the keep-alive - // agent. This would not be the case if we used "loggedFetch" as that - // function does wrap the input & init arguments into a Request object, - // which, on NodeJS<=20, results in init.dispatcher *not* being used. - dangerouslyForceKeepAliveAgent: true, fetch: function (input, init) { const method = init?.method ?? (input instanceof Request ? input.method : 'GET') diff --git a/packages/repo/package.json b/packages/repo/package.json index 2ac4d01353c..73bcc258ba4 100644 --- a/packages/repo/package.json +++ b/packages/repo/package.json @@ -8,7 +8,7 @@ "mst" ], "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "homepage": "https://atproto.com", "repository": { diff --git a/packages/sync/package.json b/packages/sync/package.json index a4ad8ae9ff9..31ff2f4f3ce 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -16,7 +16,7 @@ "directory": "packages/sync" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/syntax/package.json b/packages/syntax/package.json index ad5419b5161..0d69c7806f3 100644 --- a/packages/syntax/package.json +++ b/packages/syntax/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/syntax", "version": "0.5.4", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "Validation for atproto identifiers and formats: DID, handle, NSID, AT URI, etc", "keywords": [ diff --git a/packages/tap/package.json b/packages/tap/package.json index b791717c6f5..12c09a1ec5b 100644 --- a/packages/tap/package.json +++ b/packages/tap/package.json @@ -17,7 +17,7 @@ "directory": "packages/tap" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/ws-client/package.json b/packages/ws-client/package.json index c4867e739c4..dfee1419486 100644 --- a/packages/ws-client/package.json +++ b/packages/ws-client/package.json @@ -14,7 +14,7 @@ "directory": "packages/ws-client" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index 524e6b47084..cc2663dd5a9 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -14,7 +14,7 @@ "directory": "packages/xrpc-server" }, "engines": { - "node": ">=18.7.0" + "node": ">=22" }, "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/xrpc/package.json b/packages/xrpc/package.json index 1a9c6e6755b..5f37beeba58 100644 --- a/packages/xrpc/package.json +++ b/packages/xrpc/package.json @@ -1,6 +1,9 @@ { "name": "@atproto/xrpc", "version": "0.7.7", + "engines": { + "node": ">=22" + }, "license": "MIT", "description": "atproto HTTP API (XRPC) client library", "keywords": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2439cb63da..a0770bb56be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ settings: overrides: cookie: ^0.7.2 + opentelemetry-plugin-better-sqlite3>@opentelemetry/core: ^1.30.0 importers: @@ -19,7 +20,7 @@ importers: version: 0.5.1 '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@18.19.67) + version: 2.29.7(@types/node@22.19.17) '@swc/core': specifier: ^1.3.42 version: 1.11.18 @@ -30,8 +31,8 @@ importers: specifier: ^28.1.4 version: 28.1.4 '@types/node': - specifier: ^18.19.67 - version: 18.19.67 + specifier: ^22.0.0 + version: 22.19.17 '@typescript-eslint/eslint-plugin': specifier: ^7.4.0 version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.8.3) @@ -64,7 +65,7 @@ importers: version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) node-gyp: specifier: ^9.3.1 version: 9.3.1 @@ -85,7 +86,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/api: dependencies: @@ -122,7 +123,7 @@ importers: version: 28.1.3 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -340,10 +341,10 @@ importers: version: 6.9.7 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@18.19.67)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -398,10 +399,10 @@ importers: version: 5.1.1 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@18.19.67)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -426,7 +427,7 @@ importers: devDependencies: jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -451,7 +452,7 @@ importers: devDependencies: jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -473,7 +474,7 @@ importers: version: link:../common jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -562,7 +563,7 @@ importers: version: 0.2.24(@swc/core@1.13.3) jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -593,7 +594,7 @@ importers: version: 6.1.2 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -827,7 +828,7 @@ importers: version: 17.0.35 vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-builder: dependencies: @@ -852,7 +853,7 @@ importers: version: 0.28.1 vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-cbor: dependencies: @@ -871,10 +872,10 @@ importers: version: 4.5.8 vite: specifier: ^6.2.0 - version: 6.2.0(@types/node@18.19.67) + version: 6.2.0(@types/node@22.19.17) vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-client: dependencies: @@ -899,7 +900,7 @@ importers: version: link:../lex-cbor vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-data: dependencies: @@ -921,7 +922,7 @@ importers: version: 3.45.1 vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-document: dependencies: @@ -940,7 +941,7 @@ importers: version: link:../lex-data vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-installer: dependencies: @@ -971,7 +972,7 @@ importers: devDependencies: vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-json: dependencies: @@ -984,7 +985,7 @@ importers: devDependencies: vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-password-session: dependencies: @@ -1006,7 +1007,7 @@ importers: version: link:../lex-server vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-resolver: dependencies: @@ -1043,7 +1044,7 @@ importers: version: link:../lex-builder vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-schema: dependencies: @@ -1065,7 +1066,7 @@ importers: devDependencies: vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lex/lex-server: dependencies: @@ -1114,7 +1115,7 @@ importers: version: 4.0.16(vitest@4.0.16) vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/lexicon: dependencies: @@ -1136,7 +1137,7 @@ importers: devDependencies: jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -1167,7 +1168,7 @@ importers: version: link:../lex/lex-cbor jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.3 @@ -1334,7 +1335,7 @@ importers: version: 4.1.3 vite: specifier: ^6.2.0 - version: 6.2.0(@types/node@18.19.67) + version: 6.2.0(@types/node@22.19.17) packages/oauth/oauth-client-expo: dependencies: @@ -1608,7 +1609,7 @@ importers: version: 2.0.3 vite: specifier: ^6.2.0 - version: 6.2.0(@types/node@18.19.67) + version: 6.2.0(@types/node@22.19.17) zod: specifier: ^3.24.2 version: 3.25.76 @@ -1624,7 +1625,7 @@ importers: devDependencies: jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.3 @@ -1749,10 +1750,10 @@ importers: version: 6.9.7 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@18.19.67)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -1823,8 +1824,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 better-sqlite3: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^12.0.0 + version: 12.9.0 compression: specifier: ^1.7.4 version: 1.7.4 @@ -1933,13 +1934,13 @@ importers: version: 6.1.2 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) puppeteer: specifier: ^23.11.1 version: 23.11.1(typescript@5.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@18.19.67)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -1976,7 +1977,7 @@ importers: devDependencies: jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -2013,7 +2014,7 @@ importers: version: 8.5.4 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.2 @@ -2029,7 +2030,7 @@ importers: version: 5.8.2 vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/tap: dependencies: @@ -2066,7 +2067,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.0.16 - version: 4.0.16(@types/node@18.19.67) + version: 4.0.16(@types/node@22.19.17) packages/ws-client: dependencies: @@ -2085,7 +2086,7 @@ importers: version: 6.1.2 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^5.6.3 version: 5.8.3 @@ -2177,7 +2178,7 @@ importers: version: 6.1.2 jest: specifier: ^28.1.2 - version: 28.1.2(@types/node@18.19.67)(ts-node@10.8.2) + version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) jose: specifier: ^4.15.4 version: 4.15.4 @@ -2236,8 +2237,8 @@ importers: specifier: ^4.18.0 version: 4.20.0 opentelemetry-plugin-better-sqlite3: - specifier: ^1.1.0 - version: 1.1.0(better-sqlite3@9.6.0) + specifier: ^1.13.0 + version: 1.13.0(better-sqlite3@12.9.0) packages: @@ -4343,7 +4344,7 @@ packages: - encoding dev: true - /@changesets/cli@2.29.7(@types/node@18.19.67): + /@changesets/cli@2.29.7(@types/node@22.19.17): resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} hasBin: true dependencies: @@ -4361,7 +4362,7 @@ packages: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@18.19.67) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.17) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.8.0 @@ -5889,7 +5890,7 @@ packages: dev: false optional: true - /@inquirer/external-editor@1.0.3(@types/node@18.19.67): + /@inquirer/external-editor@1.0.3(@types/node@22.19.17): resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: @@ -5898,7 +5899,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 chardet: 2.1.1 iconv-lite: 0.7.0 dev: true @@ -5955,7 +5956,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -5976,14 +5977,14 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@18.19.67)(ts-node@10.8.2) + jest-config: 28.1.3(@types/node@22.19.17)(ts-node@10.8.2) jest-haste-map: 28.1.3 jest-message-util: 28.1.3 jest-regex-util: 28.0.2 @@ -6025,7 +6026,7 @@ packages: dependencies: '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-mock: 28.1.3 dev: true @@ -6035,7 +6036,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-mock: 29.7.0 dev: false @@ -6062,7 +6063,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@sinonjs/fake-timers': 9.1.2 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-message-util: 28.1.3 jest-mock: 28.1.3 jest-util: 28.1.3 @@ -6074,7 +6075,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6106,7 +6107,7 @@ packages: '@jest/transform': 28.1.3 '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 18.19.67 + '@types/node': 22.19.17 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -6223,7 +6224,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.19.67 + '@types/node': 22.19.17 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: true @@ -6235,7 +6236,7 @@ packages: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.19.67 + '@types/node': 22.19.17 '@types/yargs': 17.0.35 chalk: 4.1.2 dev: true @@ -6247,7 +6248,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.19.67 + '@types/node': 22.19.17 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -6492,7 +6493,7 @@ packages: dependencies: '@lingui/cli': 5.2.0(typescript@5.8.2) '@lingui/conf': 5.2.0(typescript@5.8.2) - vite: 6.2.0(@types/node@18.19.67) + vite: 6.2.0(@types/node@22.19.17) transitivePeerDependencies: - supports-color - typescript @@ -6582,6 +6583,13 @@ packages: rimraf: 3.0.2 dev: true + /@opentelemetry/api-logs@0.208.0: + resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} + engines: {node: '>=8.0.0'} + dependencies: + '@opentelemetry/api': 1.9.0 + dev: false + /@opentelemetry/api@1.7.0: resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} engines: {node: '>=8.0.0'} @@ -6602,18 +6610,26 @@ packages: '@opentelemetry/semantic-conventions': 1.18.1 dev: false - /@opentelemetry/instrumentation@0.44.0(@opentelemetry/api@1.7.0): - resolution: {integrity: sha512-B6OxJTRRCceAhhnPDBshyQO7K07/ltX3quOLu0icEvPK9QZ7r9P1y0RQX8O5DxB4vTv4URRkxkg+aFU/plNtQw==} + /@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + dev: false + + /@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0): + resolution: {integrity: sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 dependencies: - '@opentelemetry/api': 1.7.0 - '@types/shimmer': 1.0.5 - import-in-the-middle: 1.4.2 - require-in-the-middle: 7.2.0 - semver: 7.5.4 - shimmer: 1.2.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.208.0 + import-in-the-middle: 2.0.6 + require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color dev: false @@ -6639,6 +6655,16 @@ packages: engines: {node: '>=14'} dev: false + /@opentelemetry/semantic-conventions@1.28.0: + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + dev: false + + /@opentelemetry/semantic-conventions@1.40.0: + resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} + engines: {node: '>=14'} + dev: false + /@phosphor-icons/react@2.1.10(react-dom@19.0.0)(react@19.0.0): resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} engines: {node: '>=10'} @@ -8457,7 +8483,7 @@ packages: '@tailwindcss/node': 4.1.3 '@tailwindcss/oxide': 4.1.3 tailwindcss: 4.1.3 - vite: 6.2.0(@types/node@18.19.67) + vite: 6.2.0(@types/node@22.19.17) dev: true /@tanstack/history@1.115.0: @@ -8596,13 +8622,13 @@ packages: /@types/bn.js@5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 /@types/body-parser@1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.19.67 + '@types/node': 22.19.17 /@types/chai@5.2.3: resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -8614,7 +8640,7 @@ packages: /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 /@types/cookie@0.6.0: resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -8671,7 +8697,7 @@ packages: /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -8717,7 +8743,7 @@ packages: /@types/node-fetch@2.6.12: resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 form-data: 4.0.0 dev: true @@ -8734,6 +8760,12 @@ packages: resolution: {integrity: sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==} dependencies: undici-types: 5.26.5 + dev: true + + /@types/node@22.19.17: + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + dependencies: + undici-types: 6.21.0 /@types/nodemailer@6.4.6: resolution: {integrity: sha512-pD6fL5GQtUKvD2WnPmg5bC2e8kWCAPDwMPmHe/ohQbW+Dy0EcHgZ2oCSuPlWNqk74LS5BVMig1SymQbFMPPK3w==} @@ -8785,7 +8817,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 18.19.67 + '@types/node': 22.19.17 /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -8799,7 +8831,7 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.1 - '@types/node': 18.19.67 + '@types/node': 22.19.17 /@types/shimmer@1.0.5: resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} @@ -8842,7 +8874,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 dev: true optional: true @@ -9018,7 +9050,7 @@ packages: vite: ^4 || ^5 || ^6 dependencies: '@swc/core': 1.13.3 - vite: 6.2.0(@types/node@18.19.67) + vite: 6.2.0(@types/node@22.19.17) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -9043,7 +9075,7 @@ packages: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.16(@types/node@18.19.67) + vitest: 4.0.16(@types/node@22.19.17) transitivePeerDependencies: - supports-color dev: true @@ -9073,7 +9105,7 @@ packages: '@vitest/spy': 4.0.16 estree-walker: 3.0.3 magic-string: 0.30.21 - vite: 6.2.0(@types/node@18.19.67) + vite: 6.2.0(@types/node@22.19.17) dev: true /@vitest/pretty-format@4.0.16: @@ -9138,6 +9170,14 @@ packages: acorn: 8.10.0 dev: false + /acorn-import-attributes@1.9.5(acorn@8.15.0): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.15.0 + dev: false + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -9833,16 +9873,9 @@ packages: is-windows: 1.0.2 dev: true - /better-sqlite3@10.0.0: - resolution: {integrity: sha512-rOz0JY8bt9oMgrFssP7GnvA5R3yln73y/NizzWqy3WlFth8Ux8+g4r/N9fjX97nn4X1YX6MTER2doNpTu5pqiA==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 - dev: false - - /better-sqlite3@9.6.0: - resolution: {integrity: sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==} + /better-sqlite3@12.9.0: + resolution: {integrity: sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} requiresBuild: true dependencies: bindings: 1.5.0 @@ -10186,7 +10219,7 @@ packages: engines: {node: '>=12.13.0'} hasBin: true dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -10207,7 +10240,7 @@ packages: /chromium-edge-launcher@0.2.0: resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -10228,6 +10261,10 @@ packages: /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + /cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + dev: false + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -13122,6 +13159,15 @@ packages: module-details-from-path: 1.0.3 dev: false + /import-in-the-middle@2.0.6: + resolution: {integrity: sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==} + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + dev: false + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} @@ -13651,7 +13697,7 @@ packages: '@jest/expect': 28.1.3 '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -13670,7 +13716,7 @@ packages: - supports-color dev: true - /jest-cli@28.1.3(@types/node@18.19.67)(ts-node@10.8.2): + /jest-cli@28.1.3(@types/node@22.19.17)(ts-node@10.8.2): resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -13687,7 +13733,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 28.1.3(@types/node@18.19.67)(ts-node@10.8.2) + jest-config: 28.1.3(@types/node@22.19.17)(ts-node@10.8.2) jest-util: 28.1.3 jest-validate: 28.1.3 prompts: 2.4.2 @@ -13698,7 +13744,7 @@ packages: - ts-node dev: true - /jest-config@28.1.3(@types/node@18.19.67)(ts-node@10.8.2): + /jest-config@28.1.3(@types/node@22.19.17)(ts-node@10.8.2): resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} peerDependencies: @@ -13713,7 +13759,7 @@ packages: '@babel/core': 7.18.6 '@jest/test-sequencer': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 babel-jest: 28.1.3(@babel/core@7.18.6) chalk: 4.1.2 ci-info: 3.8.0 @@ -13733,7 +13779,7 @@ packages: pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@swc/core@1.11.18)(@types/node@18.19.67)(typescript@5.8.2) + ts-node: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) transitivePeerDependencies: - supports-color dev: true @@ -13780,7 +13826,7 @@ packages: '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-mock: 28.1.3 jest-util: 28.1.3 dev: true @@ -13792,7 +13838,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-mock: 29.7.0 jest-util: 29.7.0 dev: false @@ -13812,7 +13858,7 @@ packages: dependencies: '@jest/types': 28.1.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.19.67 + '@types/node': 22.19.17 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13831,7 +13877,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 18.19.67 + '@types/node': 22.19.17 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13897,7 +13943,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 dev: true /jest-mock@29.7.0: @@ -13905,7 +13951,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-util: 29.7.0 dev: false @@ -13965,7 +14011,7 @@ packages: '@jest/test-result': 28.1.3 '@jest/transform': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 chalk: 4.1.2 emittery: 0.10.2 graceful-fs: 4.2.11 @@ -14051,7 +14097,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -14063,7 +14109,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -14099,7 +14145,7 @@ packages: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.67 + '@types/node': 22.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -14111,7 +14157,7 @@ packages: resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -14120,13 +14166,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false - /jest@28.1.2(@types/node@18.19.67)(ts-node@10.8.2): + /jest@28.1.2(@types/node@22.19.17)(ts-node@10.8.2): resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true @@ -14139,7 +14185,7 @@ packages: '@jest/core': 28.1.3(ts-node@10.8.2) '@jest/types': 28.1.3 import-local: 3.1.0 - jest-cli: 28.1.3(@types/node@18.19.67)(ts-node@10.8.2) + jest-cli: 28.1.3(@types/node@22.19.17)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' - supports-color @@ -15391,6 +15437,10 @@ packages: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} dev: false + /module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + dev: false + /moo@0.5.2: resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} dev: true @@ -15478,7 +15528,7 @@ packages: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} engines: {node: '>=10'} dependencies: - semver: 7.6.3 + semver: 7.7.4 dev: false /node-abort-controller@3.1.1: @@ -15742,16 +15792,16 @@ packages: is-wsl: 2.2.0 dev: false - /opentelemetry-plugin-better-sqlite3@1.1.0(better-sqlite3@9.6.0): - resolution: {integrity: sha512-yd+mgaB5W5JxzcQt9TvX1VIrusqtbbeuxSoZ6KQe4Ra0J/Kqkp6kz7dg0VQUU5+cenOWkza6xtvsT0KGXI03HA==} + /opentelemetry-plugin-better-sqlite3@1.13.0(better-sqlite3@12.9.0): + resolution: {integrity: sha512-JHRGpq1KyTdlt50XmWCZ6P7nxEMGmn/EvdJKFPkZAnVtk9pQDnDwYobX/L/xeRkriihRKwHQ3UWoeIGUeolNtQ==} peerDependencies: - better-sqlite3: ^7.1.1 || ^8.0.0 || ^9.0.0 + better-sqlite3: ^7.1.1 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.18.1(@opentelemetry/api@1.7.0) - '@opentelemetry/instrumentation': 0.44.0(@opentelemetry/api@1.7.0) - '@opentelemetry/semantic-conventions': 1.18.1 - better-sqlite3: 9.6.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.40.0 + better-sqlite3: 12.9.0 transitivePeerDependencies: - supports-color dev: false @@ -16267,6 +16317,7 @@ packages: /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. hasBin: true dependencies: detect-libc: 2.0.3 @@ -16468,7 +16519,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.19.67 + '@types/node': 22.19.17 long: 5.2.3 dev: false @@ -16985,6 +17036,16 @@ packages: - supports-color dev: false + /require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /requireg@0.2.2: resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} engines: {node: '>= 4.0.0'} @@ -17278,7 +17339,6 @@ packages: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true - dev: true /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -18181,7 +18241,7 @@ packages: code-block-writer: 13.0.3 dev: false - /ts-node@10.8.2(@swc/core@1.11.18)(@types/node@18.19.67)(typescript@5.8.2): + /ts-node@10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2): resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -18201,7 +18261,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.67 + '@types/node': 22.19.17 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -18435,6 +18495,9 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + /undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -18660,7 +18723,7 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite@6.2.0(@types/node@18.19.67): + /vite@6.2.0(@types/node@22.19.17): resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -18700,7 +18763,7 @@ packages: yaml: optional: true dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 esbuild: 0.25.0 postcss: 8.5.3 rollup: 4.34.9 @@ -18708,7 +18771,7 @@ packages: fsevents: 2.3.3 dev: true - /vitest@4.0.16(@types/node@18.19.67): + /vitest@4.0.16(@types/node@22.19.17): resolution: {integrity: sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true @@ -18742,7 +18805,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 18.19.67 + '@types/node': 22.19.17 '@vitest/expect': 4.0.16 '@vitest/mocker': 4.0.16(vite@6.2.0) '@vitest/pretty-format': 4.0.16 @@ -18761,7 +18824,7 @@ packages: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.2.0(@types/node@18.19.67) + vite: 6.2.0(@types/node@22.19.17) why-is-node-running: 2.3.0 transitivePeerDependencies: - jiti diff --git a/services/bsky/Dockerfile b/services/bsky/Dockerfile index 67472ad0f12..2c528e5b9b5 100644 --- a/services/bsky/Dockerfile +++ b/services/bsky/Dockerfile @@ -1,11 +1,11 @@ -FROM node:20.20-alpine AS build +FROM node:24.15-alpine3.23 AS build RUN corepack enable WORKDIR /app COPY ./package.json ./ -RUN corepack prepare --activate +RUN corepack install # Move files into the image and install COPY ./*.* ./ @@ -58,7 +58,7 @@ RUN pnpm install --prod --shamefully-hoist --frozen-lockfile --prefer-offline -- WORKDIR services/bsky # Uses assets from build stage to reduce build size -FROM node:20.20-alpine +FROM node:24.15-alpine3.23 # dumb-init is used to handle signals properly. # runit is installed so it can be (optionally) used for logging via svlogd. diff --git a/services/bsync/Dockerfile b/services/bsync/Dockerfile index 7d15137a9ec..be48637db8a 100644 --- a/services/bsync/Dockerfile +++ b/services/bsync/Dockerfile @@ -1,11 +1,11 @@ -FROM node:18-alpine AS build +FROM node:24.15-alpine3.23 AS build RUN corepack enable WORKDIR /app COPY ./package.json ./ -RUN corepack prepare --activate +RUN corepack install # Move files into the image and install COPY ./*.* ./ @@ -33,7 +33,7 @@ RUN pnpm install --prod --shamefully-hoist --frozen-lockfile --prefer-offline -- WORKDIR services/bsync # Uses assets from build stage to reduce build size -FROM node:18-alpine +FROM node:24.15-alpine3.23 RUN apk add --update dumb-init diff --git a/services/ozone/Dockerfile b/services/ozone/Dockerfile index 6eb134aff87..b26777d8c78 100644 --- a/services/ozone/Dockerfile +++ b/services/ozone/Dockerfile @@ -1,11 +1,11 @@ -FROM node:18-alpine AS build +FROM node:24.15-alpine3.23 AS build RUN corepack enable WORKDIR /app COPY ./package.json ./ -RUN corepack prepare --activate +RUN corepack install # Move files into the image and install COPY ./*.* ./ @@ -58,7 +58,7 @@ RUN pnpm install --prod --shamefully-hoist --frozen-lockfile --prefer-offline -- WORKDIR services/ozone # Uses assets from build stage to reduce build size -FROM node:18-alpine +FROM node:24.15-alpine3.23 RUN apk add --update dumb-init diff --git a/services/pds/Dockerfile b/services/pds/Dockerfile index 9d5be1cabb5..ceb403306f7 100644 --- a/services/pds/Dockerfile +++ b/services/pds/Dockerfile @@ -1,12 +1,12 @@ # NOTE there is an additional build stage below that should match -FROM node:20.20-alpine3.23 AS build +FROM node:24.15-alpine3.23 AS build RUN corepack enable WORKDIR /app COPY ./package.json ./ -RUN corepack prepare --activate +RUN corepack install # Move files into the image and install COPY ./*.* ./ @@ -58,7 +58,7 @@ RUN pnpm install --prod --shamefully-hoist --frozen-lockfile --prefer-offline -- WORKDIR services/pds # Uses assets from build stage to reduce build size -FROM node:20.20-alpine3.23 +FROM node:24.15-alpine3.23 RUN apk add --update dumb-init diff --git a/services/pds/package.json b/services/pds/package.json index a25dc76e390..dffd569c2ca 100644 --- a/services/pds/package.json +++ b/services/pds/package.json @@ -6,6 +6,6 @@ "@atproto/pds": "workspace:^", "@opentelemetry/instrumentation": "^0.45.0", "dd-trace": "^4.18.0", - "opentelemetry-plugin-better-sqlite3": "^1.1.0" + "opentelemetry-plugin-better-sqlite3": "^1.13.0" } } From 908bece169258bff5ad121e5eec157d6ded6f705 Mon Sep 17 00:00:00 2001 From: devin ivy Date: Mon, 18 May 2026 22:25:40 -0400 Subject: [PATCH 41/87] Upgrade packages to TypeScript 6 (#4930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Drop Node 18/20 support, require Node >=22 - Bump engines.node to >=22 in every package.json (workspace root + all published packages). Adds the field to 38 packages that didn't previously declare it, so consumers installing any @atproto or @atproto-labs package on Node 18/20 now see the standard npm engines warning. - Bump devDependency @types/node to ^22.0.0 (resolves to 22.19.17). - Add explicit AbortSignal return type on two getters in ozone's BackgroundQueue / PeriodicBackgroundTask to satisfy TS4041 under the new @types/node (AbortSignal moved into an internal web-globals module that TS won't reference in emitted declarations). - Bump better-sqlite3 (pds) from ^10.0.0 to ^12.0.0 for Node 22/24 prebuilt binaries. Previously, v10 shipped no Node 24 prebuilt, and the node-gyp fallback fails on Python 3.12+ (distutils removed). - Bump opentelemetry-plugin-better-sqlite3 (services/pds) from ^1.1.0 to ^1.13.0 to widen its peer range to accept better-sqlite3@12. - Add a scoped pnpm override so opentelemetry-plugin-better-sqlite3's transitive @opentelemetry/core resolves to ^1.30.0, which accepts @opentelemetry/api@1.9.0 (core@1.18.1 capped the peer at <1.8.0). dd-trace's pinned core@1.18.1 subtree is untouched. Co-Authored-By: Claude Opus 4.7 (1M context) * services: bump Docker base to node:22-alpine3.23 Unifies the four service Dockerfiles — pds and bsky were on node:20.20-alpine3.23 / node:20.20-alpine, bsync and ozone on node:18-alpine — onto the same node:22-alpine3.23 image. Co-Authored-By: Claude Opus 4.7 (1M context) * @atproto-labs/fetch-node: drop Node <20 compat branch Now that the Node floor is 22, the SUPPORTS_REQUEST_INIT_DISPATCHER flag in unicastFetchWrap is always true. Removes the flag, the always-false else branch, and the unused undici Client import. Also removes the dangerouslyForceKeepAliveAgent option from UnicastFetchWrapOptions and SafeFetchWrapOptions — it was a no-op on Node 20+ per its own docs, and is now a no-op on every supported version. Removes the corresponding option (and its stale Node<=20 comment) from the PDS's safeFetchWrap configuration in context.ts. Co-Authored-By: Claude Opus 4.7 (1M context) * services: replace deprecated 'corepack prepare --activate' The --activate flag on 'corepack prepare' is deprecated as of corepack 0.31+. 'corepack install' is the modern equivalent — it reads the packageManager field from package.json and installs that exact pnpm version, without the deprecated flag. Functionally identical for the build, just stops emitting deprecation warnings on Node 22+. Co-Authored-By: Claude Opus 4.7 (1M context) * ci * Fix WithImplicitCoercion type for @types/node@22 @types/node@22 moved WithImplicitCoercion into a module-scoped declaration within the buffer module. Add a local type alias so this file compiles without depending on @types/node's internal structure. Co-Authored-By: Claude Opus 4.6 (1M context) * Update README Node version + bump Dockerfiles to node 24 - README: clarify Node.js 22 or later is required - Dockerfiles: bump from node:22-alpine3.23 to node:24-alpine3.23 Co-Authored-By: Claude Opus 4.6 (1M context) * Build with TypeScript 6.0 - Bump typescript devDep from ^5.6.3 to ^6.0.3 across all 44 workspace packages plus root. - Add 'ignoreDeprecations: "6.0"' to base tsconfig to silence the moduleResolution=node10 deprecation. The proper migration to node16/bundler is deferred to its own initiative. Co-Authored-By: Claude Opus 4.7 (1M context) * Address TypeScript 6 stricter Uint8Array typing TypeScript 6 (paired with @types/node@22) makes 'Uint8Array' generic and defaults to '' (ArrayBuffer | SharedArrayBuffer) when no parameter is given. Web APIs (crypto.subtle, fetch BodyInit, WebSocket.send) and protobuf-generated types now strictly require the '' form, so spots that previously relied on the wider default need narrowing. Fixes: - Narrow return type of ui8Concat (lex-data) to Uint8Array - Narrow interface types at producers where feasible (repo/types, common-web/types, lex-client/types, oauth-client/runtime-implementation, bsync/db/schema, oauth-provider/dpop-nonce) - Cast at consumer sites where the producer is a third-party dep (uint8arrays, @bufbuild/protobuf) or DOM API (crypto.subtle) - Add local WithImplicitCoercion alias in lex-data/nodejs-buffer.ts to decouple from @types/node's module-scoped buffer type - Bump @typescript-eslint/eslint-plugin and @typescript-eslint/parser from ^7.4.0 to ^8.59.2 for TypeScript 6 compatibility (v7's typescript-estree does not officially support TS >=6) Co-Authored-By: Claude Opus 4.6 (1M context) * Adapt eslint config for @typescript-eslint v8 @typescript-eslint v8 enables several rules by default that v7 did not, and removes the deprecated `ban-types` rule. Adapt the eslint config to preserve the prior linting behavior: - Disable `no-unused-expressions`, `no-require-imports`, and `no-empty-object-type` (all newly enabled by default in v8's recommended config, but not enforced in this codebase previously). - Add `caughtErrorsIgnorePattern` to `no-unused-vars` so catch params like `catch (err)` that are intentionally unused don't fire. - Remove stale `eslint-disable @typescript-eslint/ban-types` comments (rule no longer exists in v8). - Remove stale `@typescript-eslint/no-var-requires: off` override for .js files (rule renamed to `no-require-imports` in v8, now disabled globally). - Prefix vars used only in type position (via typeof) with underscore in test files and non-test source. Updates both the declaration and all typeof references. - Add inline suppression for ozone/jetstream `record` destructuring (used via `typeof record` at runtime in a generic type position — cannot be prefixed without breaking the code). - Fix oauth-client-expo digest() return type for narrowed RuntimeDigest interface. - Update eslint node version setting from >=18.7.0 to >=22. Co-Authored-By: Claude Opus 4.6 (1M context) * ci * Address PR feedback - unicast.ts: re-introduce SUPPORTS_REQUEST_INIT_DISPATCHER as a runtime guard that throws if the platform doesn't support the dispatcher init option (safety net for older Node) - nodejs-buffer.ts: reference tsconfig/isomorphic.json in comment - Changeset: add BREAKING prefix, split fetch-node option removal into its own changeset to avoid polluting every package's changelog Co-Authored-By: Claude Opus 4.6 (1M context) * Address PR feedback from review eslint config: - caughtErrorsIgnorePattern: use "^_|^err$|^error$" (explicit anchors) - Remove reportUsedIgnorePattern (not supported in v8) - Keep no-unused-expressions, no-require-imports, no-empty-object-type enabled (don't disable globally) - Allow no-require-imports in .cjs/.cts files only - Add inline no-empty-object-type suppression where {} is intentional Code fixes: - Fix actual bugs caught by no-unused-expressions: missing return in hydration/feed.ts, missing () on .toBeTruthy in crypto test - Convert short-circuit expressions to if statements - Use void for intentional no-op expressions (type assertions, drains) - Remove dead code (leftover property accesses) - admonition.tsx: replace runtime const with plain type - lex-client/types.ts: move comment to @note in JSDoc - jwk-jose + oauth utils: add inline suppression for {} type (well-known Simplify pattern) - Remove unused catch params (use bare catch {}) Co-Authored-By: Claude Opus 4.6 (1M context) * remove repo workflow on push * Fix verification test optional chaining for TypeScript 6 Co-Authored-By: Claude Opus 4.6 (1M context) * Fix crypto did.test.ts: assertion was a no-op due to missing parens The test used .toBeTruthy (property access) instead of .toBeTruthy() (function call), so it never actually asserted anything. The underlying comparison was also wrong: parseDidKey returns decompressed bytes (65) while publicKeyBytes() returns compressed (33). Fix by verifying the round-trip through formatDidKey instead. Co-Authored-By: Claude Opus 4.6 (1M context) * chore: repo workflow on all prs --------- Co-authored-by: Claude Opus 4.7 (1M context) --- .changeset/typescript-6.md | 65 +++ .eslintrc | 16 +- .github/workflows/repo.yaml | 2 - package.json | 6 +- packages/api/package.json | 2 +- packages/aws/package.json | 2 +- packages/bsky/package.json | 2 +- .../src/data-plane/server/routes/records.ts | 2 +- packages/bsky/src/data-plane/server/util.ts | 4 +- packages/bsky/src/hydration/feed.ts | 2 +- packages/bsky/src/views/threads-v2.ts | 2 +- .../bsky/tests/views/verification.test.ts | 8 +- packages/bsync/package.json | 2 +- packages/bsync/src/db/schema/operation.ts | 2 +- packages/bsync/src/routes/put-operation.ts | 2 +- packages/common-web/package.json | 2 +- packages/common-web/src/async.ts | 2 +- packages/common-web/src/types.ts | 2 +- packages/common/package.json | 2 +- packages/common/src/buffers.ts | 2 +- packages/crypto/package.json | 2 +- packages/crypto/src/random.ts | 4 +- packages/crypto/tests/did.test.ts | 13 +- packages/dev-env/package.json | 2 +- packages/dev-env/src/seed/thread-v2.ts | 16 +- packages/did/package.json | 2 +- packages/identity/package.json | 2 +- packages/internal/did-resolver/package.json | 2 +- packages/internal/fetch-node/package.json | 2 +- packages/internal/fetch/package.json | 2 +- .../handle-resolver-node/package.json | 2 +- .../internal/handle-resolver/package.json | 2 +- .../internal/identity-resolver/package.json | 2 +- packages/internal/pipe/package.json | 2 +- .../package.json | 2 +- .../internal/simple-store-memory/package.json | 2 +- .../internal/simple-store-redis/package.json | 2 +- packages/internal/simple-store/package.json | 2 +- packages/internal/xrpc-utils/package.json | 2 +- packages/lex-cli/package.json | 2 +- packages/lex-cli/src/mdgen/index.ts | 2 +- packages/lex-cli/src/util.ts | 2 +- packages/lex/lex-cbor/tests/dag-cbor.test.ts | 3 +- packages/lex/lex-client/src/types.ts | 12 +- packages/lex/lex-client/src/xrpc.ts | 9 +- packages/lex/lex-data/src/cid.ts | 1 + .../lex/lex-data/src/uint8array-concat.ts | 10 +- packages/lex/lex-json/src/link.ts | 2 +- packages/lex/lex-schema/src/helpers.test.ts | 104 ++-- .../lex/lex-schema/src/schema/record.test.ts | 4 +- .../lex/lex-schema/src/schema/ref.test.ts | 2 +- .../lex/lex-schema/src/schema/string.test.ts | 12 +- .../src/schema/subscription.test.ts | 8 +- .../src/schema/typed-object.test.ts | 4 +- packages/lex/lex-server/src/lex-router.ts | 7 +- packages/lexicon-resolver/package.json | 2 +- packages/lexicon/package.json | 2 +- packages/oauth/jwk-jose/package.json | 2 +- packages/oauth/jwk-jose/src/util.ts | 2 +- packages/oauth/jwk-webcrypto/package.json | 2 +- packages/oauth/jwk/package.json | 2 +- packages/oauth/jwk/src/util.ts | 4 +- .../src/components/ProfileInfo.tsx | 4 +- .../oauth/oauth-client-browser/package.json | 2 +- .../src/browser-runtime-implementation.ts | 4 +- .../src/ExpoAtprotoOAuthClientModule.types.ts | 2 +- .../src/expo-oauth-client.native.ts | 3 +- packages/oauth/oauth-client-node/package.json | 2 +- packages/oauth/oauth-client-node/src/util.ts | 2 +- packages/oauth/oauth-client/package.json | 2 +- .../src/runtime-implementation.ts | 4 +- .../oauth/oauth-provider-api/package.json | 2 +- packages/oauth/oauth-provider-ui/package.json | 2 +- .../src/components/utils/admonition.tsx | 3 +- .../account/(authenticated)/apps/page.tsx | 5 +- .../account/(authenticated)/devices/page.tsx | 2 +- .../oauth/oauth-provider-ui/tsconfig.src.json | 1 + .../oauth-provider/src/dpop/dpop-nonce.ts | 2 +- .../oauth/oauth-provider/src/lib/util/type.ts | 2 +- packages/oauth/oauth-scopes/package.json | 2 +- packages/oauth/oauth-types/package.json | 2 +- packages/ozone/package.json | 2 +- packages/ozone/src/jetstream/service.ts | 1 + packages/pds/package.json | 2 +- packages/pds/tests/file-uploads.test.ts | 4 +- packages/pds/tests/proxied/notif.test.ts | 1 - packages/repo/package.json | 2 +- packages/repo/src/mst/util.ts | 2 +- packages/repo/src/types.ts | 10 +- packages/sync/package.json | 2 +- packages/syntax/package.json | 2 +- packages/tap/package.json | 2 +- packages/ws-client/package.json | 2 +- packages/xrpc-server/package.json | 2 +- .../xrpc-server/tests/subscriptions.test.ts | 4 +- packages/xrpc/package.json | 2 +- pnpm-lock.yaml | 523 ++++++++++-------- tsconfig/base.json | 1 + 98 files changed, 577 insertions(+), 429 deletions(-) create mode 100644 .changeset/typescript-6.md diff --git a/.changeset/typescript-6.md b/.changeset/typescript-6.md new file mode 100644 index 00000000000..81397876d50 --- /dev/null +++ b/.changeset/typescript-6.md @@ -0,0 +1,65 @@ +--- +'@atproto/bsky': patch +'@atproto/bsync': patch +'@atproto/ozone': patch +'@atproto/pds': patch +'@atproto/api': minor +'@atproto/aws': minor +'@atproto/common': minor +'@atproto/common-web': minor +'@atproto/crypto': minor +'@atproto/dev-env': minor +'@atproto/did': minor +'@atproto/identity': minor +'@atproto/jwk': minor +'@atproto/jwk-jose': minor +'@atproto/jwk-webcrypto': minor +'@atproto/lex': minor +'@atproto/lex-builder': minor +'@atproto/lex-cbor': minor +'@atproto/lex-cli': minor +'@atproto/lex-client': minor +'@atproto/lex-data': minor +'@atproto/lex-document': minor +'@atproto/lex-installer': minor +'@atproto/lex-json': minor +'@atproto/lex-password-session': minor +'@atproto/lex-resolver': minor +'@atproto/lex-schema': minor +'@atproto/lex-server': minor +'@atproto/lexicon': minor +'@atproto/lexicon-resolver': minor +'@atproto/oauth-client': minor +'@atproto/oauth-client-browser': minor +'@atproto/oauth-client-browser-example': minor +'@atproto/oauth-client-expo': minor +'@atproto/oauth-client-node': minor +'@atproto/oauth-provider': minor +'@atproto/oauth-provider-api': minor +'@atproto/oauth-provider-ui': minor +'@atproto/oauth-scopes': minor +'@atproto/oauth-types': minor +'@atproto/repo': minor +'@atproto/sync': minor +'@atproto/syntax': minor +'@atproto/tap': minor +'@atproto/ws-client': minor +'@atproto/xrpc': minor +'@atproto/xrpc-server': minor +'@atproto-labs/did-resolver': minor +'@atproto-labs/fetch': minor +'@atproto-labs/fetch-node': minor +'@atproto-labs/handle-resolver': minor +'@atproto-labs/handle-resolver-node': minor +'@atproto-labs/identity-resolver': minor +'@atproto-labs/pipe': minor +'@atproto-labs/rollup-plugin-bundle-manifest': minor +'@atproto-labs/simple-store': minor +'@atproto-labs/simple-store-memory': minor +'@atproto-labs/simple-store-redis': minor +'@atproto-labs/xrpc-utils': minor +--- + +Build with TypeScript 6.0. Emitted `.d.ts` files now use TypeScript 6's stricter `Uint8Array` typing in places where Web/Node APIs require buffer-backed (not shared-memory) byte arrays. Consumers compiling against these types on older TypeScript should see no runtime impact, but may need to widen or cast in spots that previously relied on `Uint8Array` defaulting to ``. + +Internal: tsconfig `moduleResolution: "node"` is silenced via `ignoreDeprecations: "6.0"` for now; the proper migration to `node16`/`bundler` resolution is deferred. diff --git a/.eslintrc b/.eslintrc index 3f5f750aeda..97c197847e8 100644 --- a/.eslintrc +++ b/.eslintrc @@ -51,6 +51,7 @@ { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_|^err$|^error$", "ignoreRestSiblings": true } ], @@ -74,9 +75,9 @@ "env": { "jest": true } }, { - "files": ["*.js", "*.cjs"], + "files": ["*.js", "*.cjs", "*.cts"], "rules": { - "@typescript-eslint/no-var-requires": "off" + "@typescript-eslint/no-require-imports": "off" } }, { @@ -85,12 +86,21 @@ "n/no-extraneous-import": [ "error", { "allowModules": ["@atproto/dev-env"] } + ], + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_|^err$|^error$", + "ignoreRestSiblings": true + } ] } } ], "settings": { - "node": { "version": ">=18.7.0" }, + "node": { "version": ">=22" }, "import/internal-regex": "^@atproto(?:-labs)?/", "import/parsers": { "@typescript-eslint/parser": [".ts", ".tsx"] }, "import/resolver": { diff --git a/.github/workflows/repo.yaml b/.github/workflows/repo.yaml index 9108e8ec716..440f208adbf 100644 --- a/.github/workflows/repo.yaml +++ b/.github/workflows/repo.yaml @@ -2,8 +2,6 @@ name: Repository CI on: pull_request: - branches: - - '*' concurrency: group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}' diff --git a/package.json b/package.json index 126c2638977..fed59c78762 100644 --- a/package.json +++ b/package.json @@ -55,8 +55,8 @@ "@swc/jest": "^0.2.24", "@types/jest": "^28.1.4", "@types/node": "^22.0.0", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^8.59.2", + "@typescript-eslint/parser": "^8.59.2", "@vitest/coverage-v8": "4.0.16", "dotenv": "^16.0.3", "eslint": "^8.57.0", @@ -71,7 +71,7 @@ "prettier": "^3.2.5", "prettier-config-standard": "^7.0.0", "prettier-plugin-tailwindcss": "^0.6.11", - "typescript": "^5.8.3", + "typescript": "^6.0.3", "vitest": "^4.0.16" }, "workspace": [ diff --git a/packages/api/package.json b/packages/api/package.json index 207b08ec069..47310625453 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -40,6 +40,6 @@ "@jest/globals": "^28.1.3", "jest": "^28.1.2", "prettier": "^3.2.5", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/aws/package.json b/packages/aws/package.json index 495c1d6a6e9..1e44286aeee 100644 --- a/packages/aws/package.json +++ b/packages/aws/package.json @@ -36,6 +36,6 @@ "uint8arrays": "3.0.0" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 85b51fc305e..b75f8c8594c 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -88,6 +88,6 @@ "@types/qs": "^6.9.7", "jest": "^28.1.2", "ts-node": "^10.8.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/bsky/src/data-plane/server/routes/records.ts b/packages/bsky/src/data-plane/server/routes/records.ts index b988cc9c919..7918545a31b 100644 --- a/packages/bsky/src/data-plane/server/routes/records.ts +++ b/packages/bsky/src/data-plane/server/routes/records.ts @@ -61,7 +61,7 @@ export const getRecords = (db: Database, ns?: l.Main) => { : undefined const recordBytes = ui8.fromString(json, 'utf8') return new Record({ - record: recordBytes, + record: recordBytes as Uint8Array, cid: row?.cid, createdAt, indexedAt, diff --git a/packages/bsky/src/data-plane/server/util.ts b/packages/bsky/src/data-plane/server/util.ts index 5d4a84107af..5fe2d1128f8 100644 --- a/packages/bsky/src/data-plane/server/util.ts +++ b/packages/bsky/src/data-plane/server/util.ts @@ -171,7 +171,7 @@ export const parsePostSearchQuery = ( let quoted = false for (const c of qParam) { if (c === ' ' && !quoted) { - curr.trim() && parts.push(curr) + if (curr.trim()) parts.push(curr) curr = '' continue } @@ -181,7 +181,7 @@ export const parsePostSearchQuery = ( } curr += c } - curr.trim() && parts.push(curr) + if (curr.trim()) parts.push(curr) const qParts: string[] = [] for (const p of parts) { diff --git a/packages/bsky/src/hydration/feed.ts b/packages/bsky/src/hydration/feed.ts index 153f9806af3..fd0ae3d8767 100644 --- a/packages/bsky/src/hydration/feed.ts +++ b/packages/bsky/src/hydration/feed.ts @@ -280,7 +280,7 @@ export class FeedHydrator { viewer: DidString | null, ): Promise { const map: PostAggs = new HydrationMap() - if (!refs.length) map + if (!refs.length) return map const counts = await this.dataplane.getInteractionCounts({ refs, diff --git a/packages/bsky/src/views/threads-v2.ts b/packages/bsky/src/views/threads-v2.ts index 7c5c0a39835..666eb948c61 100644 --- a/packages/bsky/src/views/threads-v2.ts +++ b/packages/bsky/src/views/threads-v2.ts @@ -504,7 +504,7 @@ function parseRankFromTag(prefix: string, tag?: string) { return 0 } return rank - } catch (e) { + } catch { return 0 } } diff --git a/packages/bsky/tests/views/verification.test.ts b/packages/bsky/tests/views/verification.test.ts index 13dd42432f1..20fe251d8b8 100644 --- a/packages/bsky/tests/views/verification.test.ts +++ b/packages/bsky/tests/views/verification.test.ts @@ -252,10 +252,10 @@ describe('verification views', () => { expect(profile.verification).toStrictEqual(getExpected()) const urlPrefixes = getExpectedUrisPrefixes() - profile.verification && - expect(urlPrefixes.length).toBe( - profile.verification.verifications.length, - ) + + expect(urlPrefixes.length).toBe( + profile.verification?.verifications.length ?? 0, + ) urlPrefixes.forEach((prefix, i) => { assert(profile.verification) expect( diff --git a/packages/bsync/package.json b/packages/bsync/package.json index cb50622a35c..3b332b13bcc 100644 --- a/packages/bsync/package.json +++ b/packages/bsync/package.json @@ -47,6 +47,6 @@ "get-port": "^5.1.1", "jest": "^28.1.2", "ts-node": "^10.8.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/bsync/src/db/schema/operation.ts b/packages/bsync/src/db/schema/operation.ts index 8471618932e..5fef241e145 100644 --- a/packages/bsync/src/db/schema/operation.ts +++ b/packages/bsync/src/db/schema/operation.ts @@ -9,7 +9,7 @@ export interface Operation { namespace: string key: string method: OperationMethod - payload: Uint8Array + payload: Uint8Array createdAt: GeneratedAlways } diff --git a/packages/bsync/src/routes/put-operation.ts b/packages/bsync/src/routes/put-operation.ts index ba23ed3e2b8..a067102ba94 100644 --- a/packages/bsync/src/routes/put-operation.ts +++ b/packages/bsync/src/routes/put-operation.ts @@ -107,6 +107,6 @@ type Operation = { actorDid: string namespace: string key: string - payload: Uint8Array + payload: Uint8Array method: OperationMethod } diff --git a/packages/common-web/package.json b/packages/common-web/package.json index d3b5560ea69..4d8371aad43 100644 --- a/packages/common-web/package.json +++ b/packages/common-web/package.json @@ -29,6 +29,6 @@ }, "devDependencies": { "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/common-web/src/async.ts b/packages/common-web/src/async.ts index 0da162a8ba3..154b9a9f595 100644 --- a/packages/common-web/src/async.ts +++ b/packages/common-web/src/async.ts @@ -38,7 +38,7 @@ export const readFromGenerator = async ( } } finally { hasBroke = true - bail && bail() + if (bail) bail() } return evts } diff --git a/packages/common-web/src/types.ts b/packages/common-web/src/types.ts index 94898bbbaac..99c86c6975f 100644 --- a/packages/common-web/src/types.ts +++ b/packages/common-web/src/types.ts @@ -25,7 +25,7 @@ export type CarHeader = z.infer export const schema = { cid: cidSchema, carHeader, - bytes: z.instanceof(Uint8Array), + bytes: z.instanceof(Uint8Array), string: z.string(), array: z.array(z.unknown()), map: z.record(z.string(), z.unknown()), diff --git a/packages/common/package.json b/packages/common/package.json index 31908406701..667537c4320 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "jest": "^28.1.2", - "typescript": "^5.6.3", + "typescript": "^6.0.3", "uint8arrays": "3.0.0" } } diff --git a/packages/common/src/buffers.ts b/packages/common/src/buffers.ts index 8f03ea29845..16e6e2bc86b 100644 --- a/packages/common/src/buffers.ts +++ b/packages/common/src/buffers.ts @@ -2,7 +2,7 @@ export function ui8ToBuffer(bytes: Uint8Array): Buffer { return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength) } -export function ui8ToArrayBuffer(bytes: Uint8Array): ArrayBuffer { +export function ui8ToArrayBuffer(bytes: Uint8Array): ArrayBuffer { return bytes.buffer.slice( bytes.byteOffset, bytes.byteLength + bytes.byteOffset, diff --git a/packages/crypto/package.json b/packages/crypto/package.json index 63ba6b31383..9895cf26e3f 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -30,6 +30,6 @@ "devDependencies": { "@atproto/common": "workspace:^", "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/crypto/src/random.ts b/packages/crypto/src/random.ts index a5c9bb460eb..ead58584b0d 100644 --- a/packages/crypto/src/random.ts +++ b/packages/crypto/src/random.ts @@ -3,7 +3,9 @@ import * as uint8arrays from 'uint8arrays' import { SupportedEncodings } from 'uint8arrays/to-string' import { sha256 } from './sha' -export const randomBytes = noble.randomBytes +export const randomBytes = noble.randomBytes as ( + bytesLength?: number, +) => Uint8Array export const randomStr = ( byteLength: number, diff --git a/packages/crypto/tests/did.test.ts b/packages/crypto/tests/did.test.ts index 67e18738ba6..41cb61463ec 100644 --- a/packages/crypto/tests/did.test.ts +++ b/packages/crypto/tests/did.test.ts @@ -1,6 +1,8 @@ import * as uint8arrays from 'uint8arrays' import { P256Keypair, Secp256k1Keypair } from '../src' import * as did from '../src/did' +import { decompressPubkey as p256Decompress } from '../src/p256/encoding' +import { decompressPubkey as secp256k1Decompress } from '../src/secp256k1/encoding' describe('secp256k1 did:key', () => { it('derives the correct DID from the privatekey', async () => { @@ -18,7 +20,12 @@ describe('secp256k1 did:key', () => { expect(didKey).toEqual(vector.id) const { jwtAlg, keyBytes } = did.parseDidKey(didKey) expect(jwtAlg).toBe('ES256K') - expect(uint8arrays.equals(keyBytes, keypair.publicKeyBytes())).toBeTruthy + expect( + uint8arrays.equals( + keyBytes, + secp256k1Decompress(keypair.publicKeyBytes()), + ), + ).toBeTruthy() } }) }) @@ -41,7 +48,9 @@ describe('P-256 did:key', () => { expect(didKey).toEqual(vector.id) const { jwtAlg, keyBytes } = did.parseDidKey(didKey) expect(jwtAlg).toBe('ES256') - expect(uint8arrays.equals(keyBytes, keypair.publicKeyBytes())).toBeTruthy + expect( + uint8arrays.equals(keyBytes, p256Decompress(keypair.publicKeyBytes())), + ).toBeTruthy() } }) }) diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 83fb9b07ad3..9f3f8229be5 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -48,6 +48,6 @@ }, "devDependencies": { "@types/express": "^4.17.13", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/dev-env/src/seed/thread-v2.ts b/packages/dev-env/src/seed/thread-v2.ts index fbef0ef3686..d58b65c1b9e 100644 --- a/packages/dev-env/src/seed/thread-v2.ts +++ b/packages/dev-env/src/seed/thread-v2.ts @@ -107,8 +107,10 @@ const rootReplyFnBuilder = ( ) posts[breadcrumbs] = reply // Await for this post to be processed before replying to it. - replyCb && (await sc.network.processAll()) - await replyCb?.(rootReplyFnBuilder(sc, root, reply.ref, breadcrumbs, posts)) + if (replyCb) { + await sc.network.processAll() + await replyCb(rootReplyFnBuilder(sc, root, reply.ref, breadcrumbs, posts)) + } } } @@ -139,10 +141,12 @@ const createThread = async ( overrides, ) // Await for this post to be processed before replying to it. - replyCb && (await sc.network.processAll()) - await replyCb?.( - rootReplyFnBuilder(sc, root.ref, root.ref, breadcrumbs, replies), - ) + if (replyCb) { + await sc.network.processAll() + await replyCb( + rootReplyFnBuilder(sc, root.ref, root.ref, breadcrumbs, replies), + ) + } return { root, replies } } diff --git a/packages/did/package.json b/packages/did/package.json index 54ee1f1e93c..eec2602820f 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -33,7 +33,7 @@ "devDependencies": { "@swc/jest": "^0.2.24", "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json", diff --git a/packages/identity/package.json b/packages/identity/package.json index 4de1092e856..f971c469894 100644 --- a/packages/identity/package.json +++ b/packages/identity/package.json @@ -35,6 +35,6 @@ "express": "^4.18.2", "get-port": "^6.1.2", "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/internal/did-resolver/package.json b/packages/internal/did-resolver/package.json index fefb08e7592..bd43536c667 100644 --- a/packages/internal/did-resolver/package.json +++ b/packages/internal/did-resolver/package.json @@ -35,7 +35,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/internal/fetch-node/package.json b/packages/internal/fetch-node/package.json index bfef324315d..9ccb219062d 100644 --- a/packages/internal/fetch-node/package.json +++ b/packages/internal/fetch-node/package.json @@ -33,7 +33,7 @@ "undici": "^6.14.1" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.json" diff --git a/packages/internal/fetch/package.json b/packages/internal/fetch/package.json index 7a5e25d91d5..81b190f008e 100644 --- a/packages/internal/fetch/package.json +++ b/packages/internal/fetch/package.json @@ -29,7 +29,7 @@ "@atproto-labs/pipe": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.json" diff --git a/packages/internal/handle-resolver-node/package.json b/packages/internal/handle-resolver-node/package.json index 884146fed9e..86eba5f807b 100644 --- a/packages/internal/handle-resolver-node/package.json +++ b/packages/internal/handle-resolver-node/package.json @@ -34,7 +34,7 @@ "@atproto/did": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/internal/handle-resolver/package.json b/packages/internal/handle-resolver/package.json index 450a96856b6..41d3e5a7a5a 100644 --- a/packages/internal/handle-resolver/package.json +++ b/packages/internal/handle-resolver/package.json @@ -37,7 +37,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/internal/identity-resolver/package.json b/packages/internal/identity-resolver/package.json index ad0d85acf08..deb7d45f71f 100644 --- a/packages/internal/identity-resolver/package.json +++ b/packages/internal/identity-resolver/package.json @@ -32,7 +32,7 @@ "@atproto-labs/handle-resolver": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.json" diff --git a/packages/internal/pipe/package.json b/packages/internal/pipe/package.json index f134005446a..b97575f7ce2 100644 --- a/packages/internal/pipe/package.json +++ b/packages/internal/pipe/package.json @@ -26,7 +26,7 @@ } }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.json" diff --git a/packages/internal/rollup-plugin-bundle-manifest/package.json b/packages/internal/rollup-plugin-bundle-manifest/package.json index 9594034eaeb..07e56b6b1da 100644 --- a/packages/internal/rollup-plugin-bundle-manifest/package.json +++ b/packages/internal/rollup-plugin-bundle-manifest/package.json @@ -37,7 +37,7 @@ }, "devDependencies": { "rollup": "^4.10.0", - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.json" diff --git a/packages/internal/simple-store-memory/package.json b/packages/internal/simple-store-memory/package.json index 23c7fb13e71..641f74b4ef5 100644 --- a/packages/internal/simple-store-memory/package.json +++ b/packages/internal/simple-store-memory/package.json @@ -31,7 +31,7 @@ "lru-cache": "^10.2.0" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/internal/simple-store-redis/package.json b/packages/internal/simple-store-redis/package.json index 50f2ef792ee..7f4a6cf8ad8 100644 --- a/packages/internal/simple-store-redis/package.json +++ b/packages/internal/simple-store-redis/package.json @@ -30,7 +30,7 @@ "@atproto-labs/simple-store": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "peerDependencies": { "ioredis": "^5.3.2" diff --git a/packages/internal/simple-store/package.json b/packages/internal/simple-store/package.json index 2c309039b55..424cb918a81 100644 --- a/packages/internal/simple-store/package.json +++ b/packages/internal/simple-store/package.json @@ -26,7 +26,7 @@ } }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index ece43f80c00..9bbc073303e 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -39,7 +39,7 @@ "@atproto/xrpc-server": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/lex-cli/package.json b/packages/lex-cli/package.json index 2f855e2bdf6..ec428c6d6a4 100644 --- a/packages/lex-cli/package.json +++ b/packages/lex-cli/package.json @@ -35,6 +35,6 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/lex-cli/src/mdgen/index.ts b/packages/lex-cli/src/mdgen/index.ts index 746e73b1f13..28f80539a8f 100644 --- a/packages/lex-cli/src/mdgen/index.ts +++ b/packages/lex-cli/src/mdgen/index.ts @@ -13,7 +13,7 @@ export async function process(outFilePath: string, lexicons: LexiconDoc[]) { let existingContent = '' try { existingContent = fs.readFileSync(outFilePath, 'utf8') - } catch (e) { + } catch { // ignore - no existing content } const fileLines: StringTree = existingContent.split('\n') diff --git a/packages/lex-cli/src/util.ts b/packages/lex-cli/src/util.ts index 6a2079ef254..b61a5653cae 100644 --- a/packages/lex-cli/src/util.ts +++ b/packages/lex-cli/src/util.ts @@ -14,7 +14,7 @@ export function readAllLexicons(paths: string[]): LexiconDoc[] { } try { docs.push(readLexicon(path)) - } catch (e) { + } catch { // skip } } diff --git a/packages/lex/lex-cbor/tests/dag-cbor.test.ts b/packages/lex/lex-cbor/tests/dag-cbor.test.ts index f8442661833..16961945472 100644 --- a/packages/lex/lex-cbor/tests/dag-cbor.test.ts +++ b/packages/lex/lex-cbor/tests/dag-cbor.test.ts @@ -13,7 +13,8 @@ const bytes = { return data instanceof Uint8Array }, toHex: (data: Uint8Array | ArrayBuffer): string => { - return Buffer.from(data).toString('hex') + const bytes = data instanceof Uint8Array ? data : new Uint8Array(data) + return Buffer.from(bytes).toString('hex') }, fromHex: (hex: string): Uint8Array => { return Buffer.from(hex, 'hex') diff --git a/packages/lex/lex-client/src/types.ts b/packages/lex/lex-client/src/types.ts index aa33d3575d0..a7a5869f45e 100644 --- a/packages/lex/lex-client/src/types.ts +++ b/packages/lex/lex-client/src/types.ts @@ -46,13 +46,17 @@ export type Service = `${DidString}#${DidServiceIdentifier}` * const file: BinaryBodyInit = fileInput.files[0] * await client.xrpc(uploadMethod, { body: file }) * ``` + * + * @note Uint8Array is parameterized with ArrayBuffer (not ArrayBufferLike) + * because fetch's BodyInit requires ArrayBuffer-backed views — + * SharedArrayBuffer is not supported for network I/O. */ export type BinaryBodyInit = - | Uint8Array + | Uint8Array | ArrayBuffer | Blob - | ReadableStream - | AsyncIterable + | ReadableStream> + | AsyncIterable> | string export type EncodingString = `${string}/${string}` @@ -64,7 +68,7 @@ export function isEncodingString( } export type XrpcUnknownResponsePayload< - TBinary extends BinaryBodyInit = Uint8Array, + TBinary extends BinaryBodyInit = Uint8Array, > = { encoding: EncodingString body: LexValue | TBinary diff --git a/packages/lex/lex-client/src/xrpc.ts b/packages/lex/lex-client/src/xrpc.ts index a1a0407441d..aeb35595c52 100644 --- a/packages/lex/lex-client/src/xrpc.ts +++ b/packages/lex/lex-client/src/xrpc.ts @@ -335,8 +335,13 @@ function xrpcProcedureInput( return buildPayload(input, body, encodingHint) case 'object': { if (body === null) break - if ( - ArrayBuffer.isView(body) || + if (ArrayBuffer.isView(body)) { + return buildPayload( + input, + body as Uint8Array, + encodingHint, + ) + } else if ( body instanceof ArrayBuffer || body instanceof ReadableStream ) { diff --git a/packages/lex/lex-data/src/cid.ts b/packages/lex/lex-data/src/cid.ts index 996940132f5..2ea74213aef 100644 --- a/packages/lex/lex-data/src/cid.ts +++ b/packages/lex/lex-data/src/cid.ts @@ -87,6 +87,7 @@ declare module 'multiformats/cid' { * we update or swap out `multiformats`, `@atproto/lex-data` provides its own * stable {@link Cid} interface. */ + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface CID {} } diff --git a/packages/lex/lex-data/src/uint8array-concat.ts b/packages/lex/lex-data/src/uint8array-concat.ts index 2a6aa66c32a..478351c4c30 100644 --- a/packages/lex/lex-data/src/uint8array-concat.ts +++ b/packages/lex/lex-data/src/uint8array-concat.ts @@ -3,12 +3,16 @@ import { NodeJSBuffer } from './lib/nodejs-buffer.js' const Buffer = NodeJSBuffer export const ui8ConcatNode = Buffer - ? function ui8ConcatNode(array: readonly Uint8Array[]): Uint8Array { - return Buffer.concat(array) + ? function ui8ConcatNode( + array: readonly Uint8Array[], + ): Uint8Array { + return Buffer.concat(array) as Uint8Array } : /* v8 ignore next -- @preserve */ null -export function ui8ConcatPonyfill(array: readonly Uint8Array[]): Uint8Array { +export function ui8ConcatPonyfill( + array: readonly Uint8Array[], +): Uint8Array { let totalLength = 0 for (const arr of array) totalLength += arr.length const result = new Uint8Array(totalLength) diff --git a/packages/lex/lex-json/src/link.ts b/packages/lex/lex-json/src/link.ts index 96621050458..4b65924143d 100644 --- a/packages/lex/lex-json/src/link.ts +++ b/packages/lex/lex-json/src/link.ts @@ -74,7 +74,7 @@ export function parseLexLink( try { return parseCid($link, options) - } catch (cause) { + } catch { return undefined } } diff --git a/packages/lex/lex-schema/src/helpers.test.ts b/packages/lex/lex-schema/src/helpers.test.ts index 18972d70894..1c73c7b2aaa 100644 --- a/packages/lex/lex-schema/src/helpers.test.ts +++ b/packages/lex/lex-schema/src/helpers.test.ts @@ -11,7 +11,7 @@ const binaryValue = new BinaryValue() describe('InferMethodParams', () => { describe('query', () => { test('infers parameter types', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params({ feed: l.string({ format: 'at-uri' }), @@ -20,7 +20,7 @@ describe('InferMethodParams', () => { l.payload('application/json', undefined), ) - type Params = l.InferMethodParams + type Params = l.InferMethodParams expectType({ feed: 'at://did:plc:abc123/app.bsky.feed.post/xyz', @@ -35,14 +35,14 @@ describe('InferMethodParams', () => { describe('procedure', () => { test('infers parameter types', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.list', l.params({ limit: l.string() }), l.payload(), l.payload(), ) - type Params = l.InferMethodParams + type Params = l.InferMethodParams expectType({ limit: '10' }) // @ts-expect-error @@ -56,7 +56,7 @@ describe('InferMethodParams', () => { describe('subscription', () => { test('infers parameter types', () => { - const subscription = l.subscription( + const _subscription = l.subscription( 'com.example.subscribe', l.params({ cursor: l.optional(l.integer()), @@ -64,7 +64,7 @@ describe('InferMethodParams', () => { l.lexMap(), ) - type Params = l.InferMethodParams + type Params = l.InferMethodParams expectType({ cursor: 100 }) // @ts-expect-error @@ -78,14 +78,14 @@ describe('InferMethodParams', () => { describe('InferMethodInput', () => { describe('procedure', () => { test('with payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.create', l.params(), l.jsonPayload({ text: l.string() }), l.payload(), ) - type Input = l.InferMethodInput + type Input = l.InferMethodInput expectType({ encoding: 'application/json', body: { text: 'hi' } }) // @ts-expect-error @@ -101,14 +101,14 @@ describe('InferMethodInput', () => { }) test('without payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.create', l.params(), l.payload('*/*', undefined), l.payload(), ) - type Input = l.InferMethodInput + type Input = l.InferMethodInput expectType({ encoding: 'image/png', body: binaryValue }) // @ts-expect-error @@ -124,14 +124,14 @@ describe('InferMethodInput', () => { describe('InferMethodInputBody', () => { describe('procedure', () => { test('with payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.create', l.params(), l.jsonPayload({ text: l.string() }), l.payload(), ) - type InputBody = l.InferMethodInputBody + type InputBody = l.InferMethodInputBody expectType({ text: 'hello' }) // @ts-expect-error @@ -141,14 +141,14 @@ describe('InferMethodInputBody', () => { }) test('without payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.upload', l.params(), l.payload('*/*', undefined), l.payload(), ) - type InputBody = l.InferMethodInputBody + type InputBody = l.InferMethodInputBody expectType(binaryValue) // @ts-expect-error @@ -162,14 +162,14 @@ describe('InferMethodInputBody', () => { describe('InferMethodInputEncoding', () => { describe('procedure', () => { test('with payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.create', l.params(), l.jsonPayload({ text: l.string() }), l.payload(), ) - type InputEncoding = l.InferMethodInputEncoding + type InputEncoding = l.InferMethodInputEncoding expectType('application/json') // @ts-expect-error @@ -179,14 +179,14 @@ describe('InferMethodInputEncoding', () => { }) test('without payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.upload', l.params(), l.payload('*/*', undefined), l.payload(), ) - type InputEncoding = l.InferMethodInputEncoding + type InputEncoding = l.InferMethodInputEncoding expectType('image/png') expectType('application/octet-stream') @@ -199,7 +199,7 @@ describe('InferMethodInputEncoding', () => { describe('InferMethodOutput', () => { describe('query', () => { test('generic output', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.payload(), @@ -207,7 +207,7 @@ describe('InferMethodOutput', () => { const unknownValue = {} as unknown const lexValue = {} as l.LexValue - type Output = l.InferMethodOutput + type Output = l.InferMethodOutput expectType(undefined) expectType({ body: binaryValue, encoding: 'text/plain' }) @@ -230,13 +230,13 @@ describe('InferMethodOutput', () => { }) test('with payload schema', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.jsonPayload({ items: l.array(l.string()) }), ) - type Output = l.InferMethodOutput + type Output = l.InferMethodOutput expectType({ encoding: 'application/json', body: { items: [] } }) // @ts-expect-error @@ -246,13 +246,13 @@ describe('InferMethodOutput', () => { }) test('without payload schema', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.payload('*/*', undefined), ) - type Output = l.InferMethodOutput + type Output = l.InferMethodOutput expectType({ encoding: 'image/png', body: binaryValue }) // @ts-expect-error @@ -264,7 +264,7 @@ describe('InferMethodOutput', () => { describe('procedure', () => { test('generic output', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.procedure', l.params(), l.payload(), @@ -273,7 +273,7 @@ describe('InferMethodOutput', () => { const unknownValue = {} as unknown const lexValue = {} as l.LexValue - type Output = l.InferMethodOutput + type Output = l.InferMethodOutput expectType(undefined) expectType({ body: binaryValue, encoding: 'text/plain' }) @@ -297,7 +297,7 @@ describe('InferMethodOutput', () => { }) test('with payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.create', l.params(), l.payload(), @@ -308,7 +308,7 @@ describe('InferMethodOutput', () => { undefined, ) - type Output = l.InferMethodOutput + type Output = l.InferMethodOutput expectType({ encoding: 'application/json', @@ -323,7 +323,7 @@ describe('InferMethodOutput', () => { }) test('without payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.export', l.params(), l.payload(), @@ -331,7 +331,7 @@ describe('InferMethodOutput', () => { undefined, ) - type Output = l.InferMethodOutput + type Output = l.InferMethodOutput expectType({ encoding: 'application/zip', @@ -351,14 +351,14 @@ describe('InferMethodOutput', () => { describe('InferMethodOutputBody', () => { describe('query', () => { test('generic output', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.payload(), ) as unknown as l.Query const lexValue = {} as l.LexValue - type OutputBody = l.InferMethodOutputBody + type OutputBody = l.InferMethodOutputBody expectType(undefined) expectType(binaryValue) @@ -372,7 +372,7 @@ describe('InferMethodOutputBody', () => { }) test('with payload schema', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.payload( @@ -384,7 +384,7 @@ describe('InferMethodOutputBody', () => { ), ) - type OutputBody = l.InferMethodOutputBody + type OutputBody = l.InferMethodOutputBody expectType({ cursor: 'abc123', @@ -397,13 +397,13 @@ describe('InferMethodOutputBody', () => { }) test('without payload schema', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.payload('*/*', undefined), ) - type OutputBody = l.InferMethodOutputBody + type OutputBody = l.InferMethodOutputBody expectType(binaryValue) // @ts-expect-error @@ -415,7 +415,7 @@ describe('InferMethodOutputBody', () => { describe('procedure', () => { test('with payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.get', l.params(), l.payload(), @@ -426,7 +426,7 @@ describe('InferMethodOutputBody', () => { undefined, ) - type OutputBody = l.InferMethodOutputBody + type OutputBody = l.InferMethodOutputBody expectType({ uri: 'at://did:plc:abc/post/123' }) // @ts-expect-error @@ -436,7 +436,7 @@ describe('InferMethodOutputBody', () => { }) test('without payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.export', l.params(), l.payload(), @@ -444,7 +444,7 @@ describe('InferMethodOutputBody', () => { undefined, ) - type OutputBody = l.InferMethodOutputBody + type OutputBody = l.InferMethodOutputBody expectType(binaryValue) // @ts-expect-error @@ -458,13 +458,13 @@ describe('InferMethodOutputBody', () => { describe('InferMethodOutputEncoding', () => { describe('query', () => { test('with payload schema', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.jsonPayload({ data: l.string() }), ) - type OutputEncoding = l.InferMethodOutputEncoding + type OutputEncoding = l.InferMethodOutputEncoding expectType('application/json') // @ts-expect-error @@ -474,13 +474,13 @@ describe('InferMethodOutputEncoding', () => { }) test('without payload schema', () => { - const query = l.query( + const _query = l.query( 'com.example.query', l.params(), l.payload('*/*', undefined), ) - type OutputEncoding = l.InferMethodOutputEncoding + type OutputEncoding = l.InferMethodOutputEncoding expectType('image/png') expectType('application/octet-stream') @@ -491,7 +491,7 @@ describe('InferMethodOutputEncoding', () => { describe('procedure', () => { test('with payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.create', l.params(), l.payload(), @@ -499,7 +499,7 @@ describe('InferMethodOutputEncoding', () => { undefined, ) - type OutputEncoding = l.InferMethodOutputEncoding + type OutputEncoding = l.InferMethodOutputEncoding expectType('application/json') // @ts-expect-error @@ -509,7 +509,7 @@ describe('InferMethodOutputEncoding', () => { }) test('without payload schema', () => { - const procedure = l.procedure( + const _procedure = l.procedure( 'com.example.export', l.params(), l.payload(), @@ -517,7 +517,7 @@ describe('InferMethodOutputEncoding', () => { undefined, ) - type OutputEncoding = l.InferMethodOutputEncoding + type OutputEncoding = l.InferMethodOutputEncoding expectType('application/zip') expectType('application/octet-stream') @@ -530,7 +530,7 @@ describe('InferMethodOutputEncoding', () => { describe('InferMethodMessage', () => { describe('subscription', () => { test('with message schema', () => { - const subscription = l.subscription( + const _subscription = l.subscription( 'com.example.subscribe', l.params(), l.object({ @@ -539,7 +539,7 @@ describe('InferMethodMessage', () => { }), ) - type Message = l.InferMethodMessage + type Message = l.InferMethodMessage expectType({ seq: 1, event: 'create' }) // @ts-expect-error @@ -551,13 +551,13 @@ describe('InferMethodMessage', () => { }) test('without message schema', () => { - const subscription = l.subscription( + const _subscription = l.subscription( 'com.example.subscribe', l.params(), l.integer(), ) - type Message = l.InferMethodMessage + type Message = l.InferMethodMessage // @ts-expect-error "unknown" is turned into LexValue expectType(undefined) diff --git a/packages/lex/lex-schema/src/schema/record.test.ts b/packages/lex/lex-schema/src/schema/record.test.ts index 6cc77a54c4d..b880ab05686 100644 --- a/packages/lex/lex-schema/src/schema/record.test.ts +++ b/packages/lex/lex-schema/src/schema/record.test.ts @@ -103,10 +103,10 @@ describe('RecordSchema', () => { it('properly discriminates Unknown$TypeObject', () => { function foo(value: Unknown$TypedObject | Schema) { if (schema.isTypeOf(value)) { - value.text + void value.text } else { // @ts-expect-error - value.text + void value.text } } diff --git a/packages/lex/lex-schema/src/schema/ref.test.ts b/packages/lex/lex-schema/src/schema/ref.test.ts index e82052e2977..6b3d05b1b7d 100644 --- a/packages/lex/lex-schema/src/schema/ref.test.ts +++ b/packages/lex/lex-schema/src/schema/ref.test.ts @@ -62,7 +62,7 @@ describe('RefSchema', () => { const innerSchema = string() // Access schema property to resolve it - schema.validator + void schema.validator // Try to access the original getter again (which should throw) // This is internal behavior, but we're testing the protection mechanism diff --git a/packages/lex/lex-schema/src/schema/string.test.ts b/packages/lex/lex-schema/src/schema/string.test.ts index a7517372b3f..1a91ec05675 100644 --- a/packages/lex/lex-schema/src/schema/string.test.ts +++ b/packages/lex/lex-schema/src/schema/string.test.ts @@ -725,10 +725,10 @@ describe('StringSchema', () => { }) it('properly types knownValues in parameters', () => { - const schema = string({ + const _schema = string({ knownValues: ['active', 'inactive'], }) - type SchemaType = Infer + type SchemaType = Infer expectTypeOf<{ foo: SchemaType }>().toMatchObjectType<{ @@ -752,8 +752,8 @@ describe('StringSchema', () => { }) it('type string() as string', () => { - const schema = string() - type SchemaType = Infer + const _schema = string() + type SchemaType = Infer expectTypeOf<{ foo: SchemaType }>().toMatchObjectType<{ @@ -762,8 +762,8 @@ describe('StringSchema', () => { }) it('type string({}) as string', () => { - const schema = string({}) - type SchemaType = Infer + const _schema = string({}) + type SchemaType = Infer expectTypeOf<{ foo: SchemaType }>().toMatchObjectType<{ diff --git a/packages/lex/lex-schema/src/schema/subscription.test.ts b/packages/lex/lex-schema/src/schema/subscription.test.ts index 12f53653fe0..4b8930b3019 100644 --- a/packages/lex/lex-schema/src/schema/subscription.test.ts +++ b/packages/lex/lex-schema/src/schema/subscription.test.ts @@ -245,7 +245,7 @@ describe('Subscription', () => { describe('type inference', () => { it('InferSubscriptionParameters correctly infers parameter types', () => { - const mySub = subscription( + const _mySub = subscription( 'com.atproto.sync.subscribeRepos', params({ cursor: optional(integer()), @@ -255,7 +255,7 @@ describe('Subscription', () => { }), ) - type Params = InferSubscriptionParameters + type Params = InferSubscriptionParameters expectTypeOf({ cursor: 12345, @@ -270,9 +270,9 @@ describe('Subscription', () => { data: string(), }) - const mySub = subscription(nsid, parameters, message, undefined) + const _mySub = subscription(nsid, parameters, message, undefined) - type Message = InferSubscriptionMessage + type Message = InferSubscriptionMessage expectTypeOf({ seq: 12345, diff --git a/packages/lex/lex-schema/src/schema/typed-object.test.ts b/packages/lex/lex-schema/src/schema/typed-object.test.ts index 9f500d97b11..0eda442b057 100644 --- a/packages/lex/lex-schema/src/schema/typed-object.test.ts +++ b/packages/lex/lex-schema/src/schema/typed-object.test.ts @@ -210,10 +210,10 @@ describe('TypedObjectSchema', () => { it('properly discriminates Unknown$TypeObject', () => { function foo(value: Unknown$TypedObject | Schema) { if (schema.isTypeOf(value)) { - value.text + void value.text } else { // @ts-expect-error - value.text + void value.text } } diff --git a/packages/lex/lex-server/src/lex-router.ts b/packages/lex/lex-server/src/lex-router.ts index d6078a33fb1..6f861d99b25 100644 --- a/packages/lex/lex-server/src/lex-router.ts +++ b/packages/lex/lex-server/src/lex-router.ts @@ -1114,14 +1114,17 @@ function onMessage(this: WebSocket, _event: unknown) { // Pre-encoded frame header for error frames const ERROR_FRAME_HEADER = /*#__PURE__*/ encode({ op: -1 }) -function encodeErrorFrame(errorData: LexErrorData): Uint8Array { +function encodeErrorFrame(errorData: LexErrorData): Uint8Array { return ui8Concat([ERROR_FRAME_HEADER, encode(errorData)]) } // Pre-encoded frame header for message frames with unknown type const UNKNOWN_MESSAGE_FRAME_HEADER = /*#__PURE__*/ encode({ op: 1 }) -function encodeMessageFrame(method: Subscription, value: LexValue): Uint8Array { +function encodeMessageFrame( + method: Subscription, + value: LexValue, +): Uint8Array { if (isPlainObject(value) && typeof value.$type === 'string') { const { $type, ...rest } = value return ui8Concat([ diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 395cad459e9..dc89fba5252 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -42,6 +42,6 @@ "devDependencies": { "@atproto/lex-cbor": "workspace:^", "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index 4c43765b7e0..a0442790df8 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -31,6 +31,6 @@ }, "devDependencies": { "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/oauth/jwk-jose/package.json b/packages/oauth/jwk-jose/package.json index 662e225f8b7..ee96103e8cd 100644 --- a/packages/oauth/jwk-jose/package.json +++ b/packages/oauth/jwk-jose/package.json @@ -31,7 +31,7 @@ "jose": "^5.2.0" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/jwk-jose/src/util.ts b/packages/oauth/jwk-jose/src/util.ts index 8c6abff2100..e7472eb0f14 100644 --- a/packages/oauth/jwk-jose/src/util.ts +++ b/packages/oauth/jwk-jose/src/util.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type RequiredKey = Simplify< diff --git a/packages/oauth/jwk-webcrypto/package.json b/packages/oauth/jwk-webcrypto/package.json index dec8fedf4d8..abd0c6df689 100644 --- a/packages/oauth/jwk-webcrypto/package.json +++ b/packages/oauth/jwk-webcrypto/package.json @@ -32,7 +32,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/jwk/package.json b/packages/oauth/jwk/package.json index 1c3f0b8d354..0e0d3cea4d2 100644 --- a/packages/oauth/jwk/package.json +++ b/packages/oauth/jwk/package.json @@ -33,7 +33,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/jwk/src/util.ts b/packages/oauth/jwk/src/util.ts index b6734ad1ff6..d5744ee31e0 100644 --- a/packages/oauth/jwk/src/util.ts +++ b/packages/oauth/jwk/src/util.ts @@ -1,7 +1,7 @@ import { base64url } from 'multiformats/bases/base64' import { RefinementCtx, ZodIssueCode } from 'zod' -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type Override = Simplify> @@ -26,6 +26,7 @@ export const preferredOrderCmp = return aIdx - bIdx } +/* eslint-disable @typescript-eslint/no-unused-vars -- `v` is used at runtime in the returned type guards; v8 false-positive */ export function matchesAny( value: null | undefined | T | readonly T[], ): (v: unknown) => v is T { @@ -35,6 +36,7 @@ export function matchesAny( ? (v): v is T => value.includes(v) : (v): v is T => v === value } +/* eslint-enable @typescript-eslint/no-unused-vars */ /** * Decorator to cache the result of a getter on a class instance. diff --git a/packages/oauth/oauth-client-browser-example/src/components/ProfileInfo.tsx b/packages/oauth/oauth-client-browser-example/src/components/ProfileInfo.tsx index 76ae978f57b..2c8a26c896e 100644 --- a/packages/oauth/oauth-client-browser-example/src/components/ProfileInfo.tsx +++ b/packages/oauth/oauth-client-browser-example/src/components/ProfileInfo.tsx @@ -65,7 +65,9 @@ function useBlobRefUrl(ref: l.BlobRef | null | undefined) { ) const blob = useMemo(() => { return blobQuery.data - ? new Blob([blobQuery.data.body], { type: blobQuery.data.encoding }) + ? new Blob([blobQuery.data.body as BlobPart], { + type: blobQuery.data.encoding, + }) : null }, [blobQuery.data]) const url = useBlobUrl(blob) diff --git a/packages/oauth/oauth-client-browser/package.json b/packages/oauth/oauth-client-browser/package.json index 3c5ab22d732..5176557c7e8 100644 --- a/packages/oauth/oauth-client-browser/package.json +++ b/packages/oauth/oauth-client-browser/package.json @@ -45,7 +45,7 @@ "core-js": "^3" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts b/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts index 785210614e7..0406e876c0e 100644 --- a/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts +++ b/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts @@ -44,9 +44,9 @@ export class BrowserRuntimeImplementation implements RuntimeImplementation { } async digest( - data: Uint8Array, + data: Uint8Array, { name }: DigestAlgorithm, - ): Promise { + ): Promise> { switch (name) { case 'sha256': case 'sha384': diff --git a/packages/oauth/oauth-client-expo/src/ExpoAtprotoOAuthClientModule.types.ts b/packages/oauth/oauth-client-expo/src/ExpoAtprotoOAuthClientModule.types.ts index 97fffc01505..1548fd42e06 100644 --- a/packages/oauth/oauth-client-expo/src/ExpoAtprotoOAuthClientModule.types.ts +++ b/packages/oauth/oauth-client-expo/src/ExpoAtprotoOAuthClientModule.types.ts @@ -1,2 +1,2 @@ -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type ExpoAtprotoOAuthClientModuleEvents = {} diff --git a/packages/oauth/oauth-client-expo/src/expo-oauth-client.native.ts b/packages/oauth/oauth-client-expo/src/expo-oauth-client.native.ts index 79228b1babb..e871558bd8c 100755 --- a/packages/oauth/oauth-client-expo/src/expo-oauth-client.native.ts +++ b/packages/oauth/oauth-client-expo/src/expo-oauth-client.native.ts @@ -24,7 +24,8 @@ const isCustomUriScheme = (uri: string) => CUSTOM_URI_SCHEME_REGEX.test(uri) const runtimeImplementation: RuntimeImplementation = { createKey: async (algs) => ExpoKey.generate(algs), - digest: async (bytes, { name }) => NativeModule.digest(bytes, name), + digest: async (bytes, { name }) => + NativeModule.digest(bytes, name) as Promise>, getRandomValues: async (length) => NativeModule.getRandomValues(length), } diff --git a/packages/oauth/oauth-client-node/package.json b/packages/oauth/oauth-client-node/package.json index 4d7216ff966..3e7a0d1c98e 100644 --- a/packages/oauth/oauth-client-node/package.json +++ b/packages/oauth/oauth-client-node/package.json @@ -42,7 +42,7 @@ "@atproto/oauth-types": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/oauth-client-node/src/util.ts b/packages/oauth/oauth-client-node/src/util.ts index 695435ee7b3..318b0182b33 100644 --- a/packages/oauth/oauth-client-node/src/util.ts +++ b/packages/oauth/oauth-client-node/src/util.ts @@ -1,3 +1,3 @@ -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type Override = Simplify> diff --git a/packages/oauth/oauth-client/package.json b/packages/oauth/oauth-client/package.json index 6ee61f9940b..a6d00b010c2 100644 --- a/packages/oauth/oauth-client/package.json +++ b/packages/oauth/oauth-client/package.json @@ -43,7 +43,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/oauth-client/src/runtime-implementation.ts b/packages/oauth/oauth-client/src/runtime-implementation.ts index 8cfae7380c4..2236757653d 100644 --- a/packages/oauth/oauth-client/src/runtime-implementation.ts +++ b/packages/oauth/oauth-client/src/runtime-implementation.ts @@ -8,9 +8,9 @@ export type RuntimeRandomValues = (length: number) => Awaitable export type DigestAlgorithm = { name: 'sha256' | 'sha384' | 'sha512' } export type RuntimeDigest = ( - data: Uint8Array, + data: Uint8Array, alg: DigestAlgorithm, -) => Awaitable +) => Awaitable> export type RuntimeLock = ( name: string, diff --git a/packages/oauth/oauth-provider-api/package.json b/packages/oauth/oauth-provider-api/package.json index 1dd349544de..011e4a14fe3 100644 --- a/packages/oauth/oauth-provider-api/package.json +++ b/packages/oauth/oauth-provider-api/package.json @@ -32,7 +32,7 @@ "@atproto/oauth-types": "workspace:^" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/oauth/oauth-provider-ui/package.json b/packages/oauth/oauth-provider-ui/package.json index 10392016fe3..7e32066257c 100644 --- a/packages/oauth/oauth-provider-ui/package.json +++ b/packages/oauth/oauth-provider-ui/package.json @@ -56,7 +56,7 @@ "react-dom": "^19.0.0", "react-error-boundary": "^5.0.0", "tailwindcss": "^4.1.3", - "typescript": "^5.6.3", + "typescript": "^6.0.3", "ua-parser-js": "^2.0.3", "vite": "^6.2.0", "zod": "^3.24.2" diff --git a/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx b/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx index 290c3e7ec5a..b9551b8d9a9 100644 --- a/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx +++ b/packages/oauth/oauth-provider-ui/src/components/utils/admonition.tsx @@ -17,8 +17,7 @@ import { import { Override } from '#/lib/util.ts' import { Button, ButtonProps } from '../forms/button.tsx' -const VARIANTS = ['info', 'warning', 'error', 'success'] as const -type Variant = (typeof VARIANTS)[number] +type Variant = 'info' | 'warning' | 'error' | 'success' const ROLE_VARIANT_MAP: ReadonlyMap = new Map([ ['note', 'info'], diff --git a/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx index 040d2b5b36e..3b853229899 100644 --- a/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/apps/page.tsx @@ -81,7 +81,7 @@ function ApplicationSessionCard({ tokenId, createdAt, updatedAt, - scope = clientMetadata?.scope, + scope: _scope = clientMetadata?.scope, // @TODO Display scopes using }, sub, }: { @@ -119,9 +119,6 @@ function ApplicationSessionCard({ } } - // @TODO Display scopes using - scope - return (
diff --git a/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx index eb328be6f48..cf0b857878f 100644 --- a/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx +++ b/packages/oauth/oauth-provider-ui/src/pages/account/(authenticated)/devices/page.tsx @@ -88,7 +88,7 @@ function AccountSessionCard({ title: t`Successfully removed device`, duration: 2e3, }) - } catch (e) { + } catch { notify({ variant: 'error', title: t`Failed to remove device`, diff --git a/packages/oauth/oauth-provider-ui/tsconfig.src.json b/packages/oauth/oauth-provider-ui/tsconfig.src.json index 8dec1526eab..1aa06c501fb 100644 --- a/packages/oauth/oauth-provider-ui/tsconfig.src.json +++ b/packages/oauth/oauth-provider-ui/tsconfig.src.json @@ -5,6 +5,7 @@ ], "compilerOptions": { "rootDir": "src", + "types": ["vite/client"], "paths": { "#/*": ["./src/*"] } diff --git a/packages/oauth/oauth-provider/src/dpop/dpop-nonce.ts b/packages/oauth/oauth-provider/src/dpop/dpop-nonce.ts index c089b96adb3..01779344c40 100644 --- a/packages/oauth/oauth-provider/src/dpop/dpop-nonce.ts +++ b/packages/oauth/oauth-provider/src/dpop/dpop-nonce.ts @@ -14,7 +14,7 @@ export const rotationIntervalSchema = z const SECRET_BYTE_LENGTH = 32 export const secretBytesSchema = z - .instanceof(Uint8Array) + .instanceof(Uint8Array) .refine((secret) => secret.length === SECRET_BYTE_LENGTH, { message: `Secret must be exactly ${SECRET_BYTE_LENGTH} bytes long`, }) diff --git a/packages/oauth/oauth-provider/src/lib/util/type.ts b/packages/oauth/oauth-provider/src/lib/util/type.ts index ca1de69cc6d..c8a699a3224 100644 --- a/packages/oauth/oauth-provider/src/lib/util/type.ts +++ b/packages/oauth/oauth-provider/src/lib/util/type.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line @typescript-eslint/ban-types +// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type Override = Simplify<{ [K in keyof (V & T)]: K extends keyof V diff --git a/packages/oauth/oauth-scopes/package.json b/packages/oauth/oauth-scopes/package.json index 65aa92ae726..99ca9497b5f 100644 --- a/packages/oauth/oauth-scopes/package.json +++ b/packages/oauth/oauth-scopes/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json", diff --git a/packages/oauth/oauth-types/package.json b/packages/oauth/oauth-types/package.json index 25c99dd0311..a88954652b0 100644 --- a/packages/oauth/oauth-types/package.json +++ b/packages/oauth/oauth-types/package.json @@ -33,7 +33,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" }, "scripts": { "build": "tsc --build tsconfig.build.json" diff --git a/packages/ozone/package.json b/packages/ozone/package.json index 6bb401eedb2..6bd930131fd 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -65,6 +65,6 @@ "@types/qs": "^6.9.7", "jest": "^28.1.2", "ts-node": "^10.8.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/ozone/src/jetstream/service.ts b/packages/ozone/src/jetstream/service.ts index a0740df78b0..0216c2a4acd 100644 --- a/packages/ozone/src/jetstream/service.ts +++ b/packages/ozone/src/jetstream/service.ts @@ -82,6 +82,7 @@ export class Jetstream { for await (const message of this.ws) { const parsedMessage = JSON.parse(message.toString()) if (parsedMessage.kind === 'commit') { + // eslint-disable-next-line @typescript-eslint/no-unused-vars -- `record` is used via `typeof record` below const { collection, operation, record } = parsedMessage.commit || {} if (operation === 'create') { diff --git a/packages/pds/package.json b/packages/pds/package.json index 6db5acce787..08c1aeefdf5 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -95,7 +95,7 @@ "jest": "^28.1.2", "puppeteer": "^23.11.1", "ts-node": "^10.8.2", - "typescript": "^5.6.3", + "typescript": "^6.0.3", "ws": "^8.12.0" } } diff --git a/packages/pds/tests/file-uploads.test.ts b/packages/pds/tests/file-uploads.test.ts index dd1b9ce1786..01a63a7b0c6 100644 --- a/packages/pds/tests/file-uploads.test.ts +++ b/packages/pds/tests/file-uploads.test.ts @@ -46,7 +46,7 @@ describe('file uploads', () => { }) let smallBlob: TypedBlobRef - let smallFile: Uint8Array + let smallFile: Uint8Array it('handles client abort', async () => { const abortController = new AbortController() @@ -130,7 +130,7 @@ describe('file uploads', () => { }) let largeBlob: TypedBlobRef - let largeFile: Uint8Array + let largeFile: Uint8Array it('does not allow referencing a file that is outside blob constraints', async () => { largeFile = await fs.readFile('../dev-env/assets/hd-key.jpg') diff --git a/packages/pds/tests/proxied/notif.test.ts b/packages/pds/tests/proxied/notif.test.ts index 7e2ef94f9ae..b0394346cba 100644 --- a/packages/pds/tests/proxied/notif.test.ts +++ b/packages/pds/tests/proxied/notif.test.ts @@ -20,7 +20,6 @@ describe('notif service proxy', () => { network = await TestNetworkNoAppView.create({ dbPostgresSchema: 'proxy_notifs', }) - network.pds.server.app.get const plc = network.plc.getClient() agent = network.pds.getAgent() sc = network.getSeedClient() diff --git a/packages/repo/package.json b/packages/repo/package.json index 73bcc258ba4..718d8a8828d 100644 --- a/packages/repo/package.json +++ b/packages/repo/package.json @@ -35,6 +35,6 @@ }, "devDependencies": { "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/repo/src/mst/util.ts b/packages/repo/src/mst/util.ts index 9af1db4139a..6ee43f1c774 100644 --- a/packages/repo/src/mst/util.ts +++ b/packages/repo/src/mst/util.ts @@ -12,7 +12,7 @@ function toAscii(bytes: Uint8Array): string { return string } -function fromAscii(str: string): Uint8Array { +function fromAscii(str: string): Uint8Array { const bytes = new Uint8Array(str.length) for (let i = 0; i < str.length; i++) { bytes[i] = str.charCodeAt(i) diff --git a/packages/repo/src/types.ts b/packages/repo/src/types.ts index 4b0cd91fc1f..9bee20ad5e2 100644 --- a/packages/repo/src/types.ts +++ b/packages/repo/src/types.ts @@ -18,7 +18,7 @@ const cidSchema = z.unknown().transform((input, ctx): Cid => { return z.NEVER }) -const unsignedCommit = z.object({ +const _unsignedCommit = z.object({ did: z.string(), version: z.literal(3), data: cidSchema, @@ -26,7 +26,7 @@ const unsignedCommit = z.object({ // `prev` added for backwards compatibility with v2, no requirement of keeping around history prev: cidSchema.nullable(), }) -export type UnsignedCommit = z.infer & { sig?: never } +export type UnsignedCommit = z.infer & { sig?: never } const commit = z.object({ did: z.string(), @@ -34,7 +34,7 @@ const commit = z.object({ data: cidSchema, rev: z.string(), prev: cidSchema.nullable(), - sig: z.instanceof(Uint8Array), + sig: z.instanceof(Uint8Array), }) export type Commit = z.infer @@ -44,7 +44,7 @@ const legacyV2Commit = z.object({ data: cidSchema, rev: z.string().optional(), prev: cidSchema.nullable(), - sig: z.instanceof(Uint8Array), + sig: z.instanceof(Uint8Array), }) export type LegacyV2Commit = z.infer @@ -60,7 +60,7 @@ export const schema = { version: z.literal(1), roots: z.array(cidSchema), }), - bytes: z.instanceof(Uint8Array), + bytes: z.instanceof(Uint8Array), string: z.string(), array: z.array(z.unknown()), map: z.record(z.string(), z.unknown()), diff --git a/packages/sync/package.json b/packages/sync/package.json index 31ff2f4f3ce..bc810cd6ea7 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -39,6 +39,6 @@ "devDependencies": { "@types/ws": "^8.5.4", "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/syntax/package.json b/packages/syntax/package.json index 0d69c7806f3..6a7dfe05a54 100644 --- a/packages/syntax/package.json +++ b/packages/syntax/package.json @@ -28,7 +28,7 @@ "tslib": "^2.8.1" }, "devDependencies": { - "typescript": "^5.6.3", + "typescript": "^6.0.3", "vitest": "^4.0.16" }, "browser": { diff --git a/packages/tap/package.json b/packages/tap/package.json index 12c09a1ec5b..1a0ef655c4f 100644 --- a/packages/tap/package.json +++ b/packages/tap/package.json @@ -36,7 +36,7 @@ "@types/express": "^4.17.17", "@types/ws": "^8.5.4", "express": "^4.18.2", - "typescript": "^5.6.3", + "typescript": "^6.0.3", "@vitest/coverage-v8": "4.0.16", "vitest": "^4.0.16" } diff --git a/packages/ws-client/package.json b/packages/ws-client/package.json index dfee1419486..2cb8cc3a0b1 100644 --- a/packages/ws-client/package.json +++ b/packages/ws-client/package.json @@ -30,6 +30,6 @@ "@types/ws": "^8.5.4", "get-port": "^6.1.2", "jest": "^28.1.2", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index cc2663dd5a9..c606fcc3bde 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -53,6 +53,6 @@ "jose": "^4.15.4", "key-encoder": "^2.0.3", "multiformats": "^9.9.0", - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/packages/xrpc-server/tests/subscriptions.test.ts b/packages/xrpc-server/tests/subscriptions.test.ts index 5065e3e103f..6552e514c54 100644 --- a/packages/xrpc-server/tests/subscriptions.test.ts +++ b/packages/xrpc-server/tests/subscriptions.test.ts @@ -278,8 +278,8 @@ for (const buildServer of [buildMethodLexicons, buildAddLexicons]) { it('does not websocket upgrade at bad endpoint', async () => { const ws = new WebSocket(`ws://localhost:${port}/xrpc/does.not.exist`) const drainStream = async () => { - for await (const bytes of createWebSocketStream(ws)) { - bytes // drain + for await (const _bytes of createWebSocketStream(ws)) { + // drain } } await expect(drainStream).rejects.toHaveProperty('code', 'ECONNRESET') diff --git a/packages/xrpc/package.json b/packages/xrpc/package.json index 5f37beeba58..86e922820e3 100644 --- a/packages/xrpc/package.json +++ b/packages/xrpc/package.json @@ -26,6 +26,6 @@ "zod": "^3.23.8" }, "devDependencies": { - "typescript": "^5.6.3" + "typescript": "^6.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0770bb56be..8d3b55098ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,11 +34,11 @@ importers: specifier: ^22.0.0 version: 22.19.17 '@typescript-eslint/eslint-plugin': - specifier: ^7.4.0 - version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.8.3) + specifier: ^8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2)(eslint@8.57.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^7.4.0 - version: 7.4.0(eslint@8.57.0)(typescript@5.8.3) + specifier: ^8.59.2 + version: 8.59.2(eslint@8.57.0)(typescript@6.0.3) '@vitest/coverage-v8': specifier: 4.0.16 version: 4.0.16(vitest@4.0.16) @@ -56,7 +56,7 @@ importers: version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + version: 2.31.0(@typescript-eslint/parser@8.59.2)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) eslint-plugin-n: specifier: ^17.15.0 version: 17.15.0(eslint@8.57.0) @@ -82,8 +82,8 @@ importers: specifier: ^0.6.11 version: 0.6.11(prettier@3.2.5) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.16 version: 4.0.16(@types/node@22.19.17) @@ -128,8 +128,8 @@ importers: specifier: ^3.2.5 version: 3.2.5 typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/aws: dependencies: @@ -171,8 +171,8 @@ importers: version: 3.0.0 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/bsky: dependencies: @@ -344,10 +344,10 @@ importers: version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/bsync: dependencies: @@ -402,10 +402,10 @@ importers: version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/common: dependencies: @@ -429,8 +429,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 uint8arrays: specifier: 3.0.0 version: 3.0.0 @@ -454,8 +454,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/crypto: dependencies: @@ -476,8 +476,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/dev-env: dependencies: @@ -549,8 +549,8 @@ importers: specifier: ^4.17.13 version: 4.17.21 typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/did: dependencies: @@ -565,8 +565,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/identity: dependencies: @@ -596,8 +596,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/did-resolver: dependencies: @@ -621,8 +621,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/fetch: dependencies: @@ -631,8 +631,8 @@ importers: version: link:../pipe devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/fetch-node: dependencies: @@ -650,8 +650,8 @@ importers: version: 6.19.8 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/handle-resolver: dependencies: @@ -669,8 +669,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/handle-resolver-node: dependencies: @@ -685,8 +685,8 @@ importers: version: link:../../did devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/identity-resolver: dependencies: @@ -698,14 +698,14 @@ importers: version: link:../handle-resolver devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/pipe: devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/rollup-plugin-bundle-manifest: dependencies: @@ -717,14 +717,14 @@ importers: specifier: ^4.10.0 version: 4.34.9 typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/simple-store: devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/simple-store-memory: dependencies: @@ -736,8 +736,8 @@ importers: version: 10.2.0 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/simple-store-redis: dependencies: @@ -749,8 +749,8 @@ importers: version: 5.3.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.3 + specifier: ^6.0.3 + version: 6.0.3 packages/internal/xrpc-utils: dependencies: @@ -762,8 +762,8 @@ importers: version: link:../../xrpc-server devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/lex-cli: dependencies: @@ -793,8 +793,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/lex/lex: dependencies: @@ -1139,8 +1139,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/lexicon-resolver: dependencies: @@ -1170,8 +1170,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.3 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/jwk: dependencies: @@ -1183,8 +1183,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/jwk-jose: dependencies: @@ -1196,8 +1196,8 @@ importers: version: 5.3.0 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/jwk-webcrypto: dependencies: @@ -1212,8 +1212,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/oauth-client: dependencies: @@ -1258,8 +1258,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/oauth-client-browser: dependencies: @@ -1292,8 +1292,8 @@ importers: version: 3.45.1 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/oauth-client-browser-example: devDependencies: @@ -1398,8 +1398,8 @@ importers: version: link:../oauth-types devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/oauth-provider: dependencies: @@ -1511,8 +1511,8 @@ importers: version: link:../oauth-types devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/oauth-provider-ui: optionalDependencies: @@ -1537,7 +1537,7 @@ importers: version: 1.11.2(react-dom@19.0.0)(react@19.0.0) '@lingui/cli': specifier: ^5.2.0 - version: 5.2.0(typescript@5.8.2) + version: 5.2.0(typescript@6.0.3) '@lingui/core': specifier: ^5.2.0 version: 5.2.0(@lingui/babel-plugin-lingui-macro@5.2.0)(babel-plugin-macros@3.1.0) @@ -1549,7 +1549,7 @@ importers: version: 5.4.0(@lingui/core@5.2.0)(@swc/core@1.11.18) '@lingui/vite-plugin': specifier: ^5.2.0 - version: 5.2.0(typescript@5.8.2)(vite@6.2.0) + version: 5.2.0(typescript@6.0.3)(vite@6.2.0) '@phosphor-icons/react': specifier: ^2.1.10 version: 2.1.10(react-dom@19.0.0)(react@19.0.0) @@ -1602,8 +1602,8 @@ importers: specifier: ^4.1.3 version: 4.1.3 typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 ua-parser-js: specifier: ^2.0.3 version: 2.0.3 @@ -1627,8 +1627,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.3 + specifier: ^6.0.3 + version: 6.0.3 packages/oauth/oauth-types: dependencies: @@ -1643,8 +1643,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/ozone: dependencies: @@ -1753,10 +1753,10 @@ importers: version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/pds: dependencies: @@ -1937,13 +1937,13 @@ importers: version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) puppeteer: specifier: ^23.11.1 - version: 23.11.1(typescript@5.8.2) + version: 23.11.1(typescript@6.0.3) ts-node: specifier: ^10.8.2 - version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) + version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 ws: specifier: ^8.12.0 version: 8.12.0 @@ -1979,8 +1979,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/sync: dependencies: @@ -2016,8 +2016,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/syntax: dependencies: @@ -2026,8 +2026,8 @@ importers: version: 2.8.1 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.16 version: 4.0.16(@types/node@22.19.17) @@ -2063,8 +2063,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 typescript: - specifier: ^5.6.3 - version: 5.8.3 + specifier: ^6.0.3 + version: 6.0.3 vitest: specifier: ^4.0.16 version: 4.0.16(@types/node@22.19.17) @@ -2088,8 +2088,8 @@ importers: specifier: ^28.1.2 version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: - specifier: ^5.6.3 - version: 5.8.3 + specifier: ^6.0.3 + version: 6.0.3 packages/xrpc: dependencies: @@ -2101,8 +2101,8 @@ importers: version: 3.24.2 devDependencies: typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 packages/xrpc-server: dependencies: @@ -2189,8 +2189,8 @@ importers: specifier: ^9.9.0 version: 9.9.0 typescript: - specifier: ^5.6.3 - version: 5.8.2 + specifier: ^6.0.3 + version: 6.0.3 services/bsky: dependencies: @@ -3304,7 +3304,7 @@ packages: dependencies: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color dev: false @@ -5159,6 +5159,16 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@eslint-community/eslint-utils@4.9.1(eslint@8.57.0): + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -5169,6 +5179,11 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true + /@eslint-community/regexpp@4.12.2: + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6336,7 +6351,7 @@ packages: engines: {node: '>=20.0.0'} dev: true - /@lingui/babel-plugin-lingui-macro@5.2.0(babel-plugin-macros@3.1.0)(typescript@5.8.2): + /@lingui/babel-plugin-lingui-macro@5.2.0(babel-plugin-macros@3.1.0)(typescript@6.0.3): resolution: {integrity: sha512-IEpEfKW2WoGiK30dbovwXaPj69dKUP+GEAk00/6KUMB0sonaBWO4NO3Bj9G6NSdA6fB1lm9BtvuPqJQ2DvjF5g==} engines: {node: '>=20.0.0'} peerDependencies: @@ -6348,7 +6363,7 @@ packages: '@babel/core': 7.26.9 '@babel/runtime': 7.22.10 '@babel/types': 7.26.9 - '@lingui/conf': 5.2.0(typescript@5.8.2) + '@lingui/conf': 5.2.0(typescript@6.0.3) '@lingui/core': 5.2.0(@lingui/babel-plugin-lingui-macro@5.2.0)(babel-plugin-macros@3.1.0) '@lingui/message-utils': 5.2.0 babel-plugin-macros: 3.1.0 @@ -6357,7 +6372,7 @@ packages: - typescript dev: true - /@lingui/cli@5.2.0(typescript@5.8.2): + /@lingui/cli@5.2.0(typescript@6.0.3): resolution: {integrity: sha512-SLMPi9VMNAmhKRGt3HCGIZVHHmxfAcb7zNK9qwrEhlvcwxNmtsPtLb4iJvKy/VpdCQYm7C6D34tFjyVjUZ4ROg==} engines: {node: '>=20.0.0'} hasBin: true @@ -6368,10 +6383,10 @@ packages: '@babel/runtime': 7.22.10 '@babel/types': 7.26.9 '@lingui/babel-plugin-extract-messages': 5.2.0 - '@lingui/babel-plugin-lingui-macro': 5.2.0(babel-plugin-macros@3.1.0)(typescript@5.8.2) - '@lingui/conf': 5.2.0(typescript@5.8.2) + '@lingui/babel-plugin-lingui-macro': 5.2.0(babel-plugin-macros@3.1.0)(typescript@6.0.3) + '@lingui/conf': 5.2.0(typescript@6.0.3) '@lingui/core': 5.2.0(@lingui/babel-plugin-lingui-macro@5.2.0)(babel-plugin-macros@3.1.0) - '@lingui/format-po': 5.2.0(typescript@5.8.2) + '@lingui/format-po': 5.2.0(typescript@6.0.3) '@lingui/message-utils': 5.2.0 babel-plugin-macros: 3.1.0 chalk: 4.1.2 @@ -6396,13 +6411,13 @@ packages: - typescript dev: true - /@lingui/conf@5.2.0(typescript@5.8.2): + /@lingui/conf@5.2.0(typescript@6.0.3): resolution: {integrity: sha512-3biQJxGntCP+EnOe9jjlquGCBfk6ogq+I8ZduHwmBceY5aQ0OR7V23ItDrMz0NBy8dFNk5YoeHun3CYKYOS/Jg==} engines: {node: '>=20.0.0'} dependencies: '@babel/runtime': 7.22.10 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.8.2) + cosmiconfig: 8.3.6(typescript@6.0.3) jest-validate: 29.7.0 jiti: 1.21.0 lodash.get: 4.4.2 @@ -6423,17 +6438,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.10 - '@lingui/babel-plugin-lingui-macro': 5.2.0(babel-plugin-macros@3.1.0)(typescript@5.8.2) + '@lingui/babel-plugin-lingui-macro': 5.2.0(babel-plugin-macros@3.1.0)(typescript@6.0.3) '@lingui/message-utils': 5.2.0 babel-plugin-macros: 3.1.0 unraw: 3.0.0 dev: true - /@lingui/format-po@5.2.0(typescript@5.8.2): + /@lingui/format-po@5.2.0(typescript@6.0.3): resolution: {integrity: sha512-viUQaoRa8UxSghayTY7xjtwXbfXIVdlM8C4HsxmozQnl5TXnPVEwlaPYds3sdJ8PmQGcYCm35r8EsmuKBoWYDQ==} engines: {node: '>=20.0.0'} dependencies: - '@lingui/conf': 5.2.0(typescript@5.8.2) + '@lingui/conf': 5.2.0(typescript@6.0.3) '@lingui/message-utils': 5.2.0 date-fns: 3.6.0 pofile: 1.1.4 @@ -6485,14 +6500,14 @@ packages: '@swc/core': 1.11.18 dev: true - /@lingui/vite-plugin@5.2.0(typescript@5.8.2)(vite@6.2.0): + /@lingui/vite-plugin@5.2.0(typescript@6.0.3)(vite@6.2.0): resolution: {integrity: sha512-jMpf6JJY1s3t4eFRBseTyuQNxy6ERRwg+uLi8EZ/qcaQgQW+GK6qWX/Qg5xQ8k1mJpaP6ihanMQMrkS6d5oR/A==} engines: {node: '>=20.0.0'} peerDependencies: vite: ^3 || ^4 || ^5.0.9 || ^6 dependencies: - '@lingui/cli': 5.2.0(typescript@5.8.2) - '@lingui/conf': 5.2.0(typescript@5.8.2) + '@lingui/cli': 5.2.0(typescript@6.0.3) + '@lingui/conf': 5.2.0(typescript@6.0.3) vite: 6.2.0(@types/node@22.19.17) transitivePeerDependencies: - supports-color @@ -8722,10 +8737,6 @@ packages: pretty-format: 28.1.3 dev: true - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -8809,10 +8820,6 @@ packages: csstype: 3.1.3 dev: true - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: true - /@types/send@0.17.1: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: @@ -8878,136 +8885,144 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.8.3): - resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2)(eslint@8.57.0)(typescript@6.0.3): + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.8.3) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 7.4.0 - debug: 4.3.4 + '@typescript-eslint/parser': ^8.59.2 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.2(eslint@8.57.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@8.57.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@8.57.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 7.0.5 natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.8.3): - resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/parser@8.59.2(eslint@8.57.0)(typescript@6.0.3): + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' dependencies: - '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 7.4.0 - debug: 4.3.4 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + debug: 4.4.3 eslint: 8.57.0 - typescript: 5.8.3 + typescript: 6.0.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@7.4.0: - resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/project-service@8.59.2(typescript@6.0.3): + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' dependencies: - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/visitor-keys': 7.4.0 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color dev: true - /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.8.3): - resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/scope-manager@8.59.2: + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 + dev: true + + /@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3): + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.1.0' dependencies: - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.8.3) + typescript: 6.0.3 + dev: true + + /@typescript-eslint/type-utils@8.59.2(eslint@8.57.0)(typescript@6.0.3): + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + dependencies: + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@8.57.0)(typescript@6.0.3) debug: 4.4.3 eslint: 8.57.0 - ts-api-utils: 1.0.3(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@7.4.0: - resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/types@8.59.2: + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@7.4.0(typescript@5.8.3): - resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3): + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.1.0' dependencies: - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/visitor-keys': 7.4.0 + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.8.3) - typescript: 5.8.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.8.3): - resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/utils@8.59.2(eslint@8.57.0)(typescript@6.0.3): + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 7.4.0 - '@typescript-eslint/types': 7.4.0 - '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.8.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.0) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) eslint: 8.57.0 - semver: 7.5.4 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - - typescript dev: true - /@typescript-eslint/visitor-keys@7.4.0: - resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} - engines: {node: ^18.18.0 || >=20.0.0} + /@typescript-eslint/visitor-keys@8.59.2: + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 7.4.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.59.2 + eslint-visitor-keys: 5.0.1 dev: true /@typescript/vfs@1.5.0: @@ -9579,7 +9594,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 dev: true @@ -9769,6 +9784,11 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + dev: true + /bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} requiresBuild: true @@ -9968,6 +9988,13 @@ packages: dependencies: balanced-match: 1.0.2 + /brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + dependencies: + balanced-match: 4.0.4 + dev: true + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -10524,7 +10551,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig@8.3.6(typescript@5.8.2): + /cosmiconfig@8.3.6(typescript@6.0.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -10537,10 +10564,10 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.8.2 + typescript: 6.0.3 dev: true - /cosmiconfig@9.0.0(typescript@5.8.2): + /cosmiconfig@9.0.0(typescript@6.0.3): resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: @@ -10553,7 +10580,7 @@ packages: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - typescript: 5.8.2 + typescript: 6.0.3 dev: true /create-require@1.1.1: @@ -11633,7 +11660,7 @@ packages: debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.59.2)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.3.0 @@ -11643,7 +11670,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.12.0(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): + /eslint-module-utils@2.12.0(@typescript-eslint/parser@8.59.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: @@ -11664,7 +11691,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.59.2(eslint@8.57.0)(typescript@6.0.3) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -11685,7 +11712,7 @@ packages: eslint-compat-utils: 0.5.1(eslint@8.57.0) dev: true - /eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.59.2)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0): resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: @@ -11696,7 +11723,7 @@ packages: optional: true dependencies: '@rtsao/scc': 1.1.0 - '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.59.2(eslint@8.57.0)(typescript@6.0.3) array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 @@ -11705,7 +11732,7 @@ packages: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.59.2)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -11773,6 +11800,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + dev: true + /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13126,6 +13158,11 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + /ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + dev: true + /image-size@1.2.1: resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} engines: {node: '>=16.x'} @@ -13779,7 +13816,7 @@ packages: pretty-format: 28.1.3 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2) + ts-node: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) transitivePeerDependencies: - supports-color dev: true @@ -15324,6 +15361,13 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + dependencies: + brace-expansion: 5.0.5 + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -15341,6 +15385,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: false /minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} @@ -16585,7 +16630,7 @@ packages: - utf-8-validate dev: true - /puppeteer@23.11.1(typescript@5.8.2): + /puppeteer@23.11.1(typescript@6.0.3): resolution: {integrity: sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==} engines: {node: '>=18'} deprecated: < 24.15.0 is no longer supported @@ -16594,7 +16639,7 @@ packages: dependencies: '@puppeteer/browsers': 2.6.1 chromium-bidi: 0.11.0(devtools-protocol@0.0.1367902) - cosmiconfig: 9.0.0(typescript@5.8.2) + cosmiconfig: 9.0.0(typescript@6.0.3) devtools-protocol: 0.0.1367902 puppeteer-core: 23.11.1 typed-query-selector: 2.12.0 @@ -18214,13 +18259,13 @@ packages: punycode: 2.3.0 dev: true - /ts-api-utils@1.0.3(typescript@5.8.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} + /ts-api-utils@2.5.0(typescript@6.0.3): + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' dependencies: - typescript: 5.8.3 + typescript: 6.0.3 dev: true /ts-interface-checker@0.1.13: @@ -18241,7 +18286,7 @@ packages: code-block-writer: 13.0.3 dev: false - /ts-node@10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@5.8.2): + /ts-node@10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3): resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} hasBin: true peerDependencies: @@ -18268,7 +18313,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.2 + typescript: 6.0.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -18431,14 +18476,8 @@ packages: hasBin: true dev: true - /typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + /typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true dev: true diff --git a/tsconfig/base.json b/tsconfig/base.json index 62815c3046a..b720e5411a4 100644 --- a/tsconfig/base.json +++ b/tsconfig/base.json @@ -23,6 +23,7 @@ "lib": [], "moduleResolution": "node", + "ignoreDeprecations": "6.0", "resolveJsonModule": true, "types": [], From 6873011b2f56f6a82999462686d36c6d93ab85a5 Mon Sep 17 00:00:00 2001 From: devin ivy Date: Mon, 18 May 2026 22:47:58 -0400 Subject: [PATCH 42/87] Add .js import extensions, upgrade test suites, update test snapshots (#4942) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Drop Node 18/20 support, require Node >=22 - Bump engines.node to >=22 in every package.json (workspace root + all published packages). Adds the field to 38 packages that didn't previously declare it, so consumers installing any @atproto or @atproto-labs package on Node 18/20 now see the standard npm engines warning. - Bump devDependency @types/node to ^22.0.0 (resolves to 22.19.17). - Add explicit AbortSignal return type on two getters in ozone's BackgroundQueue / PeriodicBackgroundTask to satisfy TS4041 under the new @types/node (AbortSignal moved into an internal web-globals module that TS won't reference in emitted declarations). - Bump better-sqlite3 (pds) from ^10.0.0 to ^12.0.0 for Node 22/24 prebuilt binaries. Previously, v10 shipped no Node 24 prebuilt, and the node-gyp fallback fails on Python 3.12+ (distutils removed). - Bump opentelemetry-plugin-better-sqlite3 (services/pds) from ^1.1.0 to ^1.13.0 to widen its peer range to accept better-sqlite3@12. - Add a scoped pnpm override so opentelemetry-plugin-better-sqlite3's transitive @opentelemetry/core resolves to ^1.30.0, which accepts @opentelemetry/api@1.9.0 (core@1.18.1 capped the peer at <1.8.0). dd-trace's pinned core@1.18.1 subtree is untouched. Co-Authored-By: Claude Opus 4.7 (1M context) * services: bump Docker base to node:22-alpine3.23 Unifies the four service Dockerfiles — pds and bsky were on node:20.20-alpine3.23 / node:20.20-alpine, bsync and ozone on node:18-alpine — onto the same node:22-alpine3.23 image. Co-Authored-By: Claude Opus 4.7 (1M context) * @atproto-labs/fetch-node: drop Node <20 compat branch Now that the Node floor is 22, the SUPPORTS_REQUEST_INIT_DISPATCHER flag in unicastFetchWrap is always true. Removes the flag, the always-false else branch, and the unused undici Client import. Also removes the dangerouslyForceKeepAliveAgent option from UnicastFetchWrapOptions and SafeFetchWrapOptions — it was a no-op on Node 20+ per its own docs, and is now a no-op on every supported version. Removes the corresponding option (and its stale Node<=20 comment) from the PDS's safeFetchWrap configuration in context.ts. Co-Authored-By: Claude Opus 4.7 (1M context) * services: replace deprecated 'corepack prepare --activate' The --activate flag on 'corepack prepare' is deprecated as of corepack 0.31+. 'corepack install' is the modern equivalent — it reads the packageManager field from package.json and installs that exact pnpm version, without the deprecated flag. Functionally identical for the build, just stops emitting deprecation warnings on Node 22+. Co-Authored-By: Claude Opus 4.7 (1M context) * ci * Fix WithImplicitCoercion type for @types/node@22 @types/node@22 moved WithImplicitCoercion into a module-scoped declaration within the buffer module. Add a local type alias so this file compiles without depending on @types/node's internal structure. Co-Authored-By: Claude Opus 4.6 (1M context) * Update README Node version + bump Dockerfiles to node 24 - README: clarify Node.js 22 or later is required - Dockerfiles: bump from node:22-alpine3.23 to node:24-alpine3.23 Co-Authored-By: Claude Opus 4.6 (1M context) * Build with TypeScript 6.0 - Bump typescript devDep from ^5.6.3 to ^6.0.3 across all 44 workspace packages plus root. - Add 'ignoreDeprecations: "6.0"' to base tsconfig to silence the moduleResolution=node10 deprecation. The proper migration to node16/bundler is deferred to its own initiative. Co-Authored-By: Claude Opus 4.7 (1M context) * Address TypeScript 6 stricter Uint8Array typing TypeScript 6 (paired with @types/node@22) makes 'Uint8Array' generic and defaults to '' (ArrayBuffer | SharedArrayBuffer) when no parameter is given. Web APIs (crypto.subtle, fetch BodyInit, WebSocket.send) and protobuf-generated types now strictly require the '' form, so spots that previously relied on the wider default need narrowing. Fixes: - Narrow return type of ui8Concat (lex-data) to Uint8Array - Narrow interface types at producers where feasible (repo/types, common-web/types, lex-client/types, oauth-client/runtime-implementation, bsync/db/schema, oauth-provider/dpop-nonce) - Cast at consumer sites where the producer is a third-party dep (uint8arrays, @bufbuild/protobuf) or DOM API (crypto.subtle) - Add local WithImplicitCoercion alias in lex-data/nodejs-buffer.ts to decouple from @types/node's module-scoped buffer type - Bump @typescript-eslint/eslint-plugin and @typescript-eslint/parser from ^7.4.0 to ^8.59.2 for TypeScript 6 compatibility (v7's typescript-estree does not officially support TS >=6) Co-Authored-By: Claude Opus 4.6 (1M context) * Adapt eslint config for @typescript-eslint v8 @typescript-eslint v8 enables several rules by default that v7 did not, and removes the deprecated `ban-types` rule. Adapt the eslint config to preserve the prior linting behavior: - Disable `no-unused-expressions`, `no-require-imports`, and `no-empty-object-type` (all newly enabled by default in v8's recommended config, but not enforced in this codebase previously). - Add `caughtErrorsIgnorePattern` to `no-unused-vars` so catch params like `catch (err)` that are intentionally unused don't fire. - Remove stale `eslint-disable @typescript-eslint/ban-types` comments (rule no longer exists in v8). - Remove stale `@typescript-eslint/no-var-requires: off` override for .js files (rule renamed to `no-require-imports` in v8, now disabled globally). - Prefix vars used only in type position (via typeof) with underscore in test files and non-test source. Updates both the declaration and all typeof references. - Add inline suppression for ozone/jetstream `record` destructuring (used via `typeof record` at runtime in a generic type position — cannot be prefixed without breaking the code). - Fix oauth-client-expo digest() return type for narrowed RuntimeDigest interface. - Update eslint node version setting from >=18.7.0 to >=22. Co-Authored-By: Claude Opus 4.6 (1M context) * ci * Address PR feedback - unicast.ts: re-introduce SUPPORTS_REQUEST_INIT_DISPATCHER as a runtime guard that throws if the platform doesn't support the dispatcher init option (safety net for older Node) - nodejs-buffer.ts: reference tsconfig/isomorphic.json in comment - Changeset: add BREAKING prefix, split fetch-node option removal into its own changeset to avoid polluting every package's changelog Co-Authored-By: Claude Opus 4.6 (1M context) * Address PR feedback from review eslint config: - caughtErrorsIgnorePattern: use "^_|^err$|^error$" (explicit anchors) - Remove reportUsedIgnorePattern (not supported in v8) - Keep no-unused-expressions, no-require-imports, no-empty-object-type enabled (don't disable globally) - Allow no-require-imports in .cjs/.cts files only - Add inline no-empty-object-type suppression where {} is intentional Code fixes: - Fix actual bugs caught by no-unused-expressions: missing return in hydration/feed.ts, missing () on .toBeTruthy in crypto test - Convert short-circuit expressions to if statements - Use void for intentional no-op expressions (type assertions, drains) - Remove dead code (leftover property accesses) - admonition.tsx: replace runtime const with plain type - lex-client/types.ts: move comment to @note in JSDoc - jwk-jose + oauth utils: add inline suppression for {} type (well-known Simplify pattern) - Remove unused catch params (use bare catch {}) Co-Authored-By: Claude Opus 4.6 (1M context) * remove repo workflow on push * Fix verification test optional chaining for TypeScript 6 Co-Authored-By: Claude Opus 4.6 (1M context) * Fix crypto did.test.ts: assertion was a no-op due to missing parens The test used .toBeTruthy (property access) instead of .toBeTruthy() (function call), so it never actually asserted anything. The underlying comparison was also wrong: parseDidKey returns decompressed bytes (65) while publicKeyBytes() returns compressed (33). Fix by verifying the round-trip through formatDidKey instead. Co-Authored-By: Claude Opus 4.6 (1M context) * Add .js extensions to all relative imports Mechanical addition of explicit .js file extensions to all relative import paths across the codebase, preparing for Node16 module resolution. Directory imports use /index.js form. Bundler-built packages (oauth-provider-ui, oauth-client-browser-example) retain their .tsx/.ts extensions as-is since vite resolves them directly. Test files importing from dist/ are updated to use correct paths (dist/*/index.js or src/ where appropriate). Co-Authored-By: Claude Opus 4.6 (1M context) * Upgrade Jest 28 to 30, migrate bsky and lexicon-resolver to Vitest - Rename jest.config.js to jest.config.cjs across all packages - Configure Jest 30 ESM support (extensionsToTreatAsEsm, SWC es6 module output) - Add NODE_OPTIONS=--experimental-vm-modules to test scripts - Migrate packages/bsky and packages/lexicon-resolver from Jest to Vitest - Add @jest/globals imports where jest globals are used explicitly - Replace deprecated toThrowError() with toThrow() - Update vitest.config.ts to include bsky project - Add jest.varint-shim.cjs for varint CJS interop in tests Co-Authored-By: Claude Opus 4.6 (1M context) * Update test snapshots for Jest 30 and Vitest format Jest 30 snapshot format changes: - Object {} → {} - Array [] → [] Vitest snapshot format changes (bsky): - "Jest Snapshot v1" → "Vitest Snapshot v1" - Test names use " > " separator instead of space Co-Authored-By: Claude Opus 4.6 (1M context) * Migrate remaining bsky src-level tests from Jest to Vitest - data-plane/client/util.test.ts - feature-gates/metrics.test.ts, utils.test.ts - api/age-assurance/kws/external-payload.test.ts Co-Authored-By: Claude Opus 4.6 (1M context) * Fix verify errors: revert premature vitest tsconfig change, run prettier The module: "NodeNext" change in tsconfig/vitest.json belongs on the ESM branch since it conflicts with lex packages' tsconfig.tests.json settings. Co-Authored-By: Claude Opus 4.6 (1M context) * Fix lint errors: add @jest/globals dep, revert premature ESM changes - Add @jest/globals to ozone, pds, xrpc-server devDependencies - Revert lex-schema void removals (needed for no-unused-expressions rule) - Revert xrpc-server subscriptions _bytes rename (same rule) - Fix bsky verification test expression back to optional chaining Co-Authored-By: Claude Opus 4.6 (1M context) * Revert ESM jest config: keep Jest 30 in CJS mode The ESM jest config (extensionsToTreatAsEsm, SWC es6 module output, NODE_OPTIONS=--experimental-vm-modules) causes cascading issues with source code that hasn't been converted to ESM yet. Revert jest configs to their original CJS-mode settings — the only change from Jest 28 is the version bump and .cjs extension rename. Also reverts: @jest/globals imports/deps, jest.varint-shim.cjs, EventEmitter node:stream→node:events, and sync test import paths. Co-Authored-By: Claude Opus 4.6 (1M context) * Fix bsky vitest config: exclude dist/, node_modules/, age-assurance-v2 - Exclude dist/ and node_modules/ from vitest test discovery - Exclude age-assurance-v2.test.ts which requires vi.mock() to intercept CJS require() in dist/ — only works once bsky has "type": "module" - Keep age-assurance-v2 in its jest form with .js import extensions applied Co-Authored-By: Claude Opus 4.6 (1M context) * Fix lexicon-resolver vi.mock: provide default export for dns mock Vitest requires the mock factory to include a default property when the source uses a default import (import dns from 'node:dns/promises'). Co-Authored-By: Claude Opus 4.6 (1M context) * Rename jest.setup.ts to test.setup.ts The setup file has nothing jest-specific in it (just loads dotenv), and it's now also used by vitest configs. Co-Authored-By: Claude Opus 4.6 (1M context) * Properly type callerInterceptor test and consolidate into single case Use actual @connectrpc/connect types (UnaryRequest, StreamRequest, etc.) instead of `as any` casts, and merge redundant test cases. Co-Authored-By: Claude Opus 4.6 (1M context) * chore: repo workflow on all prs * tidy * tidy --------- Co-authored-by: Claude Opus 4.7 (1M context) --- .changeset/bumpy-kiwis-wish.md | 2 + .eslintrc | 4 +- jest.config.js => jest.config.cjs | 2 +- package.json | 2 +- .../api/{jest.config.js => jest.config.cjs} | 2 +- packages/api/jest.setup.ts | 4 +- packages/api/package.json | 2 +- packages/api/src/age-assurance.test.ts | 4 +- packages/api/src/age-assurance.ts | 4 +- packages/api/src/agent.ts | 24 +- packages/api/src/atp-agent.ts | 10 +- packages/api/src/bsky-agent.ts | 2 +- .../src/client/types/app/bsky/actor/defs.ts | 4 +- .../types/app/bsky/actor/getPreferences.ts | 4 +- .../client/types/app/bsky/actor/getProfile.ts | 4 +- .../types/app/bsky/actor/getProfiles.ts | 4 +- .../types/app/bsky/actor/getSuggestions.ts | 4 +- .../client/types/app/bsky/actor/profile.ts | 4 +- .../types/app/bsky/actor/putPreferences.ts | 4 +- .../types/app/bsky/actor/searchActors.ts | 4 +- .../app/bsky/actor/searchActorsTypeahead.ts | 4 +- .../src/client/types/app/bsky/actor/status.ts | 4 +- .../types/app/bsky/ageassurance/begin.ts | 4 +- .../types/app/bsky/ageassurance/defs.ts | 4 +- .../types/app/bsky/ageassurance/getConfig.ts | 4 +- .../types/app/bsky/ageassurance/getState.ts | 4 +- .../types/app/bsky/bookmark/createBookmark.ts | 4 +- .../client/types/app/bsky/bookmark/defs.ts | 4 +- .../types/app/bsky/bookmark/deleteBookmark.ts | 4 +- .../types/app/bsky/bookmark/getBookmarks.ts | 4 +- .../src/client/types/app/bsky/contact/defs.ts | 4 +- .../types/app/bsky/contact/dismissMatch.ts | 4 +- .../types/app/bsky/contact/getMatches.ts | 4 +- .../types/app/bsky/contact/getSyncStatus.ts | 4 +- .../types/app/bsky/contact/importContacts.ts | 4 +- .../types/app/bsky/contact/removeData.ts | 4 +- .../app/bsky/contact/sendNotification.ts | 4 +- .../bsky/contact/startPhoneVerification.ts | 4 +- .../types/app/bsky/contact/verifyPhone.ts | 4 +- .../types/app/bsky/draft/createDraft.ts | 4 +- .../src/client/types/app/bsky/draft/defs.ts | 4 +- .../types/app/bsky/draft/deleteDraft.ts | 4 +- .../client/types/app/bsky/draft/getDrafts.ts | 4 +- .../types/app/bsky/draft/updateDraft.ts | 4 +- .../src/client/types/app/bsky/embed/defs.ts | 4 +- .../client/types/app/bsky/embed/external.ts | 4 +- .../src/client/types/app/bsky/embed/images.ts | 4 +- .../src/client/types/app/bsky/embed/record.ts | 4 +- .../types/app/bsky/embed/recordWithMedia.ts | 4 +- .../src/client/types/app/bsky/embed/video.ts | 4 +- .../src/client/types/app/bsky/feed/defs.ts | 4 +- .../app/bsky/feed/describeFeedGenerator.ts | 4 +- .../client/types/app/bsky/feed/generator.ts | 4 +- .../types/app/bsky/feed/getActorFeeds.ts | 4 +- .../types/app/bsky/feed/getActorLikes.ts | 4 +- .../types/app/bsky/feed/getAuthorFeed.ts | 4 +- .../src/client/types/app/bsky/feed/getFeed.ts | 4 +- .../types/app/bsky/feed/getFeedGenerator.ts | 4 +- .../types/app/bsky/feed/getFeedGenerators.ts | 4 +- .../types/app/bsky/feed/getFeedSkeleton.ts | 4 +- .../client/types/app/bsky/feed/getLikes.ts | 4 +- .../client/types/app/bsky/feed/getListFeed.ts | 4 +- .../types/app/bsky/feed/getPostThread.ts | 4 +- .../client/types/app/bsky/feed/getPosts.ts | 4 +- .../client/types/app/bsky/feed/getQuotes.ts | 4 +- .../types/app/bsky/feed/getRepostedBy.ts | 4 +- .../types/app/bsky/feed/getSuggestedFeeds.ts | 4 +- .../client/types/app/bsky/feed/getTimeline.ts | 4 +- .../src/client/types/app/bsky/feed/like.ts | 4 +- .../src/client/types/app/bsky/feed/post.ts | 4 +- .../client/types/app/bsky/feed/postgate.ts | 4 +- .../src/client/types/app/bsky/feed/repost.ts | 4 +- .../client/types/app/bsky/feed/searchPosts.ts | 4 +- .../types/app/bsky/feed/sendInteractions.ts | 4 +- .../client/types/app/bsky/feed/threadgate.ts | 4 +- .../src/client/types/app/bsky/graph/block.ts | 4 +- .../src/client/types/app/bsky/graph/defs.ts | 4 +- .../src/client/types/app/bsky/graph/follow.ts | 4 +- .../app/bsky/graph/getActorStarterPacks.ts | 4 +- .../client/types/app/bsky/graph/getBlocks.ts | 4 +- .../types/app/bsky/graph/getFollowers.ts | 4 +- .../client/types/app/bsky/graph/getFollows.ts | 4 +- .../types/app/bsky/graph/getKnownFollowers.ts | 4 +- .../client/types/app/bsky/graph/getList.ts | 4 +- .../types/app/bsky/graph/getListBlocks.ts | 4 +- .../types/app/bsky/graph/getListMutes.ts | 4 +- .../client/types/app/bsky/graph/getLists.ts | 4 +- .../app/bsky/graph/getListsWithMembership.ts | 4 +- .../client/types/app/bsky/graph/getMutes.ts | 4 +- .../types/app/bsky/graph/getRelationships.ts | 4 +- .../types/app/bsky/graph/getStarterPack.ts | 4 +- .../types/app/bsky/graph/getStarterPacks.ts | 4 +- .../graph/getStarterPacksWithMembership.ts | 4 +- .../bsky/graph/getSuggestedFollowsByActor.ts | 4 +- .../src/client/types/app/bsky/graph/list.ts | 4 +- .../client/types/app/bsky/graph/listblock.ts | 4 +- .../client/types/app/bsky/graph/listitem.ts | 4 +- .../client/types/app/bsky/graph/muteActor.ts | 4 +- .../types/app/bsky/graph/muteActorList.ts | 4 +- .../client/types/app/bsky/graph/muteThread.ts | 4 +- .../app/bsky/graph/searchStarterPacks.ts | 4 +- .../types/app/bsky/graph/starterpack.ts | 4 +- .../types/app/bsky/graph/unmuteActor.ts | 4 +- .../types/app/bsky/graph/unmuteActorList.ts | 4 +- .../types/app/bsky/graph/unmuteThread.ts | 4 +- .../types/app/bsky/graph/verification.ts | 4 +- .../src/client/types/app/bsky/labeler/defs.ts | 4 +- .../types/app/bsky/labeler/getServices.ts | 4 +- .../client/types/app/bsky/labeler/service.ts | 4 +- .../app/bsky/notification/declaration.ts | 4 +- .../types/app/bsky/notification/defs.ts | 4 +- .../app/bsky/notification/getPreferences.ts | 4 +- .../app/bsky/notification/getUnreadCount.ts | 4 +- .../notification/listActivitySubscriptions.ts | 4 +- .../bsky/notification/listNotifications.ts | 4 +- .../notification/putActivitySubscription.ts | 4 +- .../app/bsky/notification/putPreferences.ts | 4 +- .../app/bsky/notification/putPreferencesV2.ts | 4 +- .../app/bsky/notification/registerPush.ts | 4 +- .../app/bsky/notification/unregisterPush.ts | 4 +- .../types/app/bsky/notification/updateSeen.ts | 4 +- .../client/types/app/bsky/richtext/facet.ts | 4 +- .../client/types/app/bsky/unspecced/defs.ts | 4 +- .../bsky/unspecced/getAgeAssuranceState.ts | 4 +- .../types/app/bsky/unspecced/getConfig.ts | 4 +- .../getOnboardingSuggestedStarterPacks.ts | 4 +- ...OnboardingSuggestedStarterPacksSkeleton.ts | 4 +- .../getOnboardingSuggestedUsersSkeleton.ts | 4 +- .../unspecced/getPopularFeedGenerators.ts | 4 +- .../bsky/unspecced/getPostThreadOtherV2.ts | 4 +- .../app/bsky/unspecced/getPostThreadV2.ts | 4 +- .../app/bsky/unspecced/getSuggestedFeeds.ts | 4 +- .../unspecced/getSuggestedFeedsSkeleton.ts | 4 +- .../unspecced/getSuggestedOnboardingUsers.ts | 4 +- .../unspecced/getSuggestedStarterPacks.ts | 4 +- .../getSuggestedStarterPacksSkeleton.ts | 4 +- .../app/bsky/unspecced/getSuggestedUsers.ts | 4 +- .../unspecced/getSuggestedUsersForDiscover.ts | 4 +- .../getSuggestedUsersForDiscoverSkeleton.ts | 4 +- .../unspecced/getSuggestedUsersForExplore.ts | 4 +- .../getSuggestedUsersForExploreSkeleton.ts | 4 +- .../unspecced/getSuggestedUsersForSeeMore.ts | 4 +- .../getSuggestedUsersForSeeMoreSkeleton.ts | 4 +- .../unspecced/getSuggestedUsersSkeleton.ts | 4 +- .../bsky/unspecced/getSuggestionsSkeleton.ts | 4 +- .../bsky/unspecced/getTaggedSuggestions.ts | 4 +- .../app/bsky/unspecced/getTrendingTopics.ts | 4 +- .../types/app/bsky/unspecced/getTrends.ts | 4 +- .../app/bsky/unspecced/getTrendsSkeleton.ts | 4 +- .../app/bsky/unspecced/initAgeAssurance.ts | 4 +- .../bsky/unspecced/searchActorsSkeleton.ts | 4 +- .../app/bsky/unspecced/searchPostsSkeleton.ts | 4 +- .../unspecced/searchStarterPacksSkeleton.ts | 4 +- .../src/client/types/app/bsky/video/defs.ts | 4 +- .../types/app/bsky/video/getJobStatus.ts | 4 +- .../types/app/bsky/video/getUploadLimits.ts | 4 +- .../types/app/bsky/video/uploadVideo.ts | 4 +- .../types/chat/bsky/actor/declaration.ts | 4 +- .../src/client/types/chat/bsky/actor/defs.ts | 4 +- .../types/chat/bsky/actor/deleteAccount.ts | 4 +- .../chat/bsky/actor/exportAccountData.ts | 4 +- .../types/chat/bsky/convo/acceptConvo.ts | 4 +- .../types/chat/bsky/convo/addReaction.ts | 4 +- .../src/client/types/chat/bsky/convo/defs.ts | 4 +- .../chat/bsky/convo/deleteMessageForSelf.ts | 4 +- .../client/types/chat/bsky/convo/getConvo.ts | 4 +- .../chat/bsky/convo/getConvoAvailability.ts | 4 +- .../chat/bsky/convo/getConvoForMembers.ts | 4 +- .../types/chat/bsky/convo/getConvoMembers.ts | 4 +- .../client/types/chat/bsky/convo/getLog.ts | 4 +- .../types/chat/bsky/convo/getMessages.ts | 4 +- .../types/chat/bsky/convo/leaveConvo.ts | 4 +- .../chat/bsky/convo/listConvoRequests.ts | 4 +- .../types/chat/bsky/convo/listConvos.ts | 4 +- .../client/types/chat/bsky/convo/lockConvo.ts | 4 +- .../client/types/chat/bsky/convo/muteConvo.ts | 4 +- .../types/chat/bsky/convo/removeReaction.ts | 4 +- .../types/chat/bsky/convo/sendMessage.ts | 4 +- .../types/chat/bsky/convo/sendMessageBatch.ts | 4 +- .../types/chat/bsky/convo/unlockConvo.ts | 4 +- .../types/chat/bsky/convo/unmuteConvo.ts | 4 +- .../types/chat/bsky/convo/updateAllRead.ts | 4 +- .../types/chat/bsky/convo/updateRead.ts | 4 +- .../types/chat/bsky/group/addMembers.ts | 4 +- .../chat/bsky/group/approveJoinRequest.ts | 4 +- .../types/chat/bsky/group/createGroup.ts | 4 +- .../types/chat/bsky/group/createJoinLink.ts | 4 +- .../src/client/types/chat/bsky/group/defs.ts | 4 +- .../types/chat/bsky/group/disableJoinLink.ts | 4 +- .../client/types/chat/bsky/group/editGroup.ts | 4 +- .../types/chat/bsky/group/editJoinLink.ts | 4 +- .../types/chat/bsky/group/enableJoinLink.ts | 4 +- .../chat/bsky/group/getJoinLinkPreview.ts | 4 +- .../types/chat/bsky/group/listJoinRequests.ts | 4 +- .../chat/bsky/group/rejectJoinRequest.ts | 4 +- .../types/chat/bsky/group/removeMembers.ts | 4 +- .../types/chat/bsky/group/requestJoin.ts | 4 +- .../chat/bsky/moderation/getActorMetadata.ts | 4 +- .../chat/bsky/moderation/getMessageContext.ts | 4 +- .../bsky/moderation/subscribeModEvents.ts | 4 +- .../chat/bsky/moderation/updateActorAccess.ts | 4 +- .../client/types/com/atproto/admin/defs.ts | 4 +- .../types/com/atproto/admin/deleteAccount.ts | 4 +- .../atproto/admin/disableAccountInvites.ts | 4 +- .../com/atproto/admin/disableInviteCodes.ts | 4 +- .../com/atproto/admin/enableAccountInvites.ts | 4 +- .../types/com/atproto/admin/getAccountInfo.ts | 4 +- .../com/atproto/admin/getAccountInfos.ts | 4 +- .../types/com/atproto/admin/getInviteCodes.ts | 4 +- .../com/atproto/admin/getSubjectStatus.ts | 4 +- .../types/com/atproto/admin/searchAccounts.ts | 4 +- .../types/com/atproto/admin/sendEmail.ts | 4 +- .../com/atproto/admin/updateAccountEmail.ts | 4 +- .../com/atproto/admin/updateAccountHandle.ts | 4 +- .../atproto/admin/updateAccountPassword.ts | 4 +- .../atproto/admin/updateAccountSigningKey.ts | 4 +- .../com/atproto/admin/updateSubjectStatus.ts | 4 +- .../client/types/com/atproto/identity/defs.ts | 4 +- .../identity/getRecommendedDidCredentials.ts | 4 +- .../com/atproto/identity/refreshIdentity.ts | 4 +- .../identity/requestPlcOperationSignature.ts | 4 +- .../types/com/atproto/identity/resolveDid.ts | 4 +- .../com/atproto/identity/resolveHandle.ts | 4 +- .../com/atproto/identity/resolveIdentity.ts | 4 +- .../com/atproto/identity/signPlcOperation.ts | 4 +- .../atproto/identity/submitPlcOperation.ts | 4 +- .../com/atproto/identity/updateHandle.ts | 4 +- .../client/types/com/atproto/label/defs.ts | 4 +- .../types/com/atproto/label/queryLabels.ts | 4 +- .../com/atproto/label/subscribeLabels.ts | 4 +- .../com/atproto/lexicon/resolveLexicon.ts | 4 +- .../types/com/atproto/lexicon/schema.ts | 4 +- .../com/atproto/moderation/createReport.ts | 4 +- .../types/com/atproto/moderation/defs.ts | 4 +- .../types/com/atproto/repo/applyWrites.ts | 4 +- .../types/com/atproto/repo/createRecord.ts | 4 +- .../src/client/types/com/atproto/repo/defs.ts | 4 +- .../types/com/atproto/repo/deleteRecord.ts | 4 +- .../types/com/atproto/repo/describeRepo.ts | 4 +- .../types/com/atproto/repo/getRecord.ts | 4 +- .../types/com/atproto/repo/importRepo.ts | 4 +- .../com/atproto/repo/listMissingBlobs.ts | 4 +- .../types/com/atproto/repo/listRecords.ts | 4 +- .../types/com/atproto/repo/putRecord.ts | 4 +- .../types/com/atproto/repo/strongRef.ts | 4 +- .../types/com/atproto/repo/uploadBlob.ts | 4 +- .../com/atproto/server/activateAccount.ts | 4 +- .../com/atproto/server/checkAccountStatus.ts | 4 +- .../types/com/atproto/server/confirmEmail.ts | 4 +- .../types/com/atproto/server/createAccount.ts | 4 +- .../com/atproto/server/createAppPassword.ts | 4 +- .../com/atproto/server/createInviteCode.ts | 4 +- .../com/atproto/server/createInviteCodes.ts | 4 +- .../types/com/atproto/server/createSession.ts | 4 +- .../com/atproto/server/deactivateAccount.ts | 4 +- .../client/types/com/atproto/server/defs.ts | 4 +- .../types/com/atproto/server/deleteAccount.ts | 4 +- .../types/com/atproto/server/deleteSession.ts | 4 +- .../com/atproto/server/describeServer.ts | 4 +- .../atproto/server/getAccountInviteCodes.ts | 4 +- .../com/atproto/server/getServiceAuth.ts | 4 +- .../types/com/atproto/server/getSession.ts | 4 +- .../com/atproto/server/listAppPasswords.ts | 4 +- .../com/atproto/server/refreshSession.ts | 4 +- .../atproto/server/requestAccountDelete.ts | 4 +- .../server/requestEmailConfirmation.ts | 4 +- .../com/atproto/server/requestEmailUpdate.ts | 4 +- .../atproto/server/requestPasswordReset.ts | 4 +- .../com/atproto/server/reserveSigningKey.ts | 4 +- .../types/com/atproto/server/resetPassword.ts | 4 +- .../com/atproto/server/revokeAppPassword.ts | 4 +- .../types/com/atproto/server/updateEmail.ts | 4 +- .../src/client/types/com/atproto/sync/defs.ts | 4 +- .../client/types/com/atproto/sync/getBlob.ts | 4 +- .../types/com/atproto/sync/getBlocks.ts | 4 +- .../types/com/atproto/sync/getCheckout.ts | 4 +- .../client/types/com/atproto/sync/getHead.ts | 4 +- .../types/com/atproto/sync/getHostStatus.ts | 4 +- .../types/com/atproto/sync/getLatestCommit.ts | 4 +- .../types/com/atproto/sync/getRecord.ts | 4 +- .../client/types/com/atproto/sync/getRepo.ts | 4 +- .../types/com/atproto/sync/getRepoStatus.ts | 4 +- .../types/com/atproto/sync/listBlobs.ts | 4 +- .../types/com/atproto/sync/listHosts.ts | 4 +- .../types/com/atproto/sync/listRepos.ts | 4 +- .../com/atproto/sync/listReposByCollection.ts | 4 +- .../types/com/atproto/sync/notifyOfUpdate.ts | 4 +- .../types/com/atproto/sync/requestCrawl.ts | 4 +- .../types/com/atproto/sync/subscribeRepos.ts | 4 +- .../com/atproto/temp/addReservedHandle.ts | 4 +- .../atproto/temp/checkHandleAvailability.ts | 4 +- .../com/atproto/temp/checkSignupQueue.ts | 4 +- .../com/atproto/temp/dereferenceScope.ts | 4 +- .../types/com/atproto/temp/fetchLabels.ts | 4 +- .../atproto/temp/requestPhoneVerification.ts | 4 +- .../atproto/temp/revokeAccountCredentials.ts | 4 +- .../types/com/germnetwork/declaration.ts | 4 +- .../ozone/communication/createTemplate.ts | 4 +- .../types/tools/ozone/communication/defs.ts | 4 +- .../ozone/communication/deleteTemplate.ts | 4 +- .../ozone/communication/listTemplates.ts | 4 +- .../ozone/communication/updateTemplate.ts | 4 +- .../tools/ozone/hosting/getAccountHistory.ts | 4 +- .../moderation/cancelScheduledActions.ts | 4 +- .../types/tools/ozone/moderation/defs.ts | 4 +- .../types/tools/ozone/moderation/emitEvent.ts | 4 +- .../ozone/moderation/getAccountTimeline.ts | 4 +- .../types/tools/ozone/moderation/getEvent.ts | 4 +- .../types/tools/ozone/moderation/getRecord.ts | 4 +- .../tools/ozone/moderation/getRecords.ts | 4 +- .../types/tools/ozone/moderation/getRepo.ts | 4 +- .../ozone/moderation/getReporterStats.ts | 4 +- .../types/tools/ozone/moderation/getRepos.ts | 4 +- .../tools/ozone/moderation/getSubjects.ts | 4 +- .../ozone/moderation/listScheduledActions.ts | 4 +- .../tools/ozone/moderation/queryEvents.ts | 4 +- .../tools/ozone/moderation/queryStatuses.ts | 4 +- .../tools/ozone/moderation/scheduleAction.ts | 4 +- .../tools/ozone/moderation/searchRepos.ts | 4 +- .../tools/ozone/queue/assignModerator.ts | 4 +- .../types/tools/ozone/queue/createQueue.ts | 4 +- .../client/types/tools/ozone/queue/defs.ts | 4 +- .../types/tools/ozone/queue/deleteQueue.ts | 4 +- .../types/tools/ozone/queue/getAssignments.ts | 4 +- .../types/tools/ozone/queue/listQueues.ts | 4 +- .../types/tools/ozone/queue/routeReports.ts | 4 +- .../tools/ozone/queue/unassignModerator.ts | 4 +- .../types/tools/ozone/queue/updateQueue.ts | 4 +- .../tools/ozone/report/assignModerator.ts | 4 +- .../tools/ozone/report/createActivity.ts | 4 +- .../client/types/tools/ozone/report/defs.ts | 4 +- .../tools/ozone/report/getAssignments.ts | 4 +- .../tools/ozone/report/getHistoricalStats.ts | 4 +- .../tools/ozone/report/getLatestReport.ts | 4 +- .../types/tools/ozone/report/getLiveStats.ts | 4 +- .../types/tools/ozone/report/getReport.ts | 4 +- .../tools/ozone/report/listActivities.ts | 4 +- .../types/tools/ozone/report/queryReports.ts | 4 +- .../types/tools/ozone/report/reassignQueue.ts | 4 +- .../types/tools/ozone/report/refreshStats.ts | 4 +- .../tools/ozone/report/unassignModerator.ts | 4 +- .../types/tools/ozone/safelink/addRule.ts | 4 +- .../client/types/tools/ozone/safelink/defs.ts | 4 +- .../types/tools/ozone/safelink/queryEvents.ts | 4 +- .../types/tools/ozone/safelink/queryRules.ts | 4 +- .../types/tools/ozone/safelink/removeRule.ts | 4 +- .../types/tools/ozone/safelink/updateRule.ts | 4 +- .../types/tools/ozone/server/getConfig.ts | 4 +- .../client/types/tools/ozone/set/addValues.ts | 4 +- .../src/client/types/tools/ozone/set/defs.ts | 4 +- .../client/types/tools/ozone/set/deleteSet.ts | 4 +- .../types/tools/ozone/set/deleteValues.ts | 4 +- .../client/types/tools/ozone/set/getValues.ts | 4 +- .../client/types/tools/ozone/set/querySets.ts | 4 +- .../client/types/tools/ozone/set/upsertSet.ts | 4 +- .../client/types/tools/ozone/setting/defs.ts | 4 +- .../types/tools/ozone/setting/listOptions.ts | 4 +- .../tools/ozone/setting/removeOptions.ts | 4 +- .../types/tools/ozone/setting/upsertOption.ts | 4 +- .../types/tools/ozone/signature/defs.ts | 4 +- .../tools/ozone/signature/findCorrelation.ts | 4 +- .../ozone/signature/findRelatedAccounts.ts | 4 +- .../tools/ozone/signature/searchAccounts.ts | 4 +- .../types/tools/ozone/team/addMember.ts | 4 +- .../src/client/types/tools/ozone/team/defs.ts | 4 +- .../types/tools/ozone/team/deleteMember.ts | 4 +- .../types/tools/ozone/team/listMembers.ts | 4 +- .../types/tools/ozone/team/updateMember.ts | 4 +- .../types/tools/ozone/verification/defs.ts | 4 +- .../ozone/verification/grantVerifications.ts | 4 +- .../ozone/verification/listVerifications.ts | 4 +- .../ozone/verification/revokeVerifications.ts | 4 +- packages/api/src/index.ts | 44 +- packages/api/src/mocker.ts | 4 +- packages/api/src/moderation/decision.ts | 10 +- packages/api/src/moderation/index.ts | 26 +- packages/api/src/moderation/mutewords.ts | 2 +- .../api/src/moderation/subjects/account.ts | 4 +- .../src/moderation/subjects/feed-generator.ts | 8 +- .../src/moderation/subjects/notification.ts | 8 +- packages/api/src/moderation/subjects/post.ts | 14 +- .../api/src/moderation/subjects/profile.ts | 4 +- .../api/src/moderation/subjects/status.ts | 8 +- .../api/src/moderation/subjects/user-list.ts | 10 +- packages/api/src/moderation/types.ts | 6 +- packages/api/src/moderation/ui.ts | 2 +- packages/api/src/moderation/util.ts | 6 +- packages/api/src/predicate.ts | 4 +- packages/api/src/rich-text/detection.ts | 6 +- packages/api/src/rich-text/rich-text.ts | 12 +- packages/api/src/rich-text/sanitization.ts | 4 +- packages/api/src/types.ts | 4 +- packages/api/src/util.ts | 4 +- packages/api/tests/atp-agent.test.ts | 6 +- packages/api/tests/dispatcher.test.ts | 4 +- .../api/tests/moderation-behaviors.test.ts | 4 +- .../tests/moderation-custom-labels.test.ts | 4 +- .../api/tests/moderation-mutewords.test.ts | 4 +- packages/api/tests/moderation-prefs.test.ts | 6 +- .../api/tests/moderation-quoteposts.test.ts | 4 +- packages/api/tests/moderation.test.ts | 6 +- .../api/tests/rich-text-detection.test.ts | 4 +- .../api/tests/rich-text-sanitization.test.ts | 7 +- packages/api/tests/rich-text.test.ts | 2 +- .../api/tests/util/moderation-behavior.ts | 4 +- packages/aws/src/bunny.ts | 2 +- packages/aws/src/cloudfront.ts | 2 +- packages/aws/src/index.ts | 12 +- packages/aws/src/util.ts | 2 +- packages/bsky/bin/migration-create.ts | 2 +- packages/bsky/jest.config.js | 9 - packages/bsky/package.json | 9 +- packages/bsky/src/api/age-assurance/index.ts | 10 +- .../kws/external-payload.test.ts | 4 +- .../redirects/kws-age-verified.ts | 16 +- packages/bsky/src/api/age-assurance/stash.ts | 4 +- packages/bsky/src/api/age-assurance/types.ts | 6 +- .../webhooks/kws-age-verified.ts | 14 +- .../bsky/src/api/app/bsky/actor/getProfile.ts | 10 +- .../src/api/app/bsky/actor/getProfiles.ts | 10 +- .../src/api/app/bsky/actor/getSuggestions.ts | 14 +- .../src/api/app/bsky/actor/searchActors.ts | 14 +- .../app/bsky/actor/searchActorsTypeahead.ts | 12 +- .../src/api/app/bsky/ageassurance/begin.ts | 18 +- .../api/app/bsky/ageassurance/getConfig.ts | 4 +- .../src/api/app/bsky/ageassurance/getState.ts | 4 +- .../api/app/bsky/bookmark/createBookmark.ts | 6 +- .../api/app/bsky/bookmark/deleteBookmark.ts | 6 +- .../src/api/app/bsky/bookmark/getBookmarks.ts | 15 +- .../src/api/app/bsky/contact/dismissMatch.ts | 4 +- .../src/api/app/bsky/contact/getMatches.ts | 12 +- .../src/api/app/bsky/contact/getSyncStatus.ts | 4 +- .../api/app/bsky/contact/importContacts.ts | 14 +- .../src/api/app/bsky/contact/removeData.ts | 4 +- .../api/app/bsky/contact/sendNotification.ts | 6 +- .../bsky/contact/startPhoneVerification.ts | 4 +- .../bsky/src/api/app/bsky/contact/util.ts | 4 +- .../src/api/app/bsky/contact/verifyPhone.ts | 4 +- .../src/api/app/bsky/draft/createDraft.ts | 4 +- .../src/api/app/bsky/draft/deleteDraft.ts | 6 +- .../bsky/src/api/app/bsky/draft/getDrafts.ts | 2 +- .../src/api/app/bsky/draft/updateDraft.ts | 4 +- .../src/api/app/bsky/feed/getActorFeeds.ts | 14 +- .../src/api/app/bsky/feed/getActorLikes.ts | 18 +- .../src/api/app/bsky/feed/getAuthorFeed.ts | 22 +- .../bsky/src/api/app/bsky/feed/getFeed.ts | 14 +- .../src/api/app/bsky/feed/getFeedGenerator.ts | 8 +- .../api/app/bsky/feed/getFeedGenerators.ts | 10 +- .../bsky/src/api/app/bsky/feed/getLikes.ts | 14 +- .../bsky/src/api/app/bsky/feed/getListFeed.ts | 18 +- .../src/api/app/bsky/feed/getPostThread.ts | 20 +- .../bsky/src/api/app/bsky/feed/getPosts.ts | 12 +- .../bsky/src/api/app/bsky/feed/getQuotes.ts | 14 +- .../src/api/app/bsky/feed/getRepostedBy.ts | 14 +- .../api/app/bsky/feed/getSuggestedFeeds.ts | 6 +- .../bsky/src/api/app/bsky/feed/getTimeline.ts | 16 +- .../bsky/src/api/app/bsky/feed/searchPosts.ts | 20 +- .../app/bsky/graph/getActorStarterPacks.ts | 14 +- .../bsky/src/api/app/bsky/graph/getBlocks.ts | 13 +- .../src/api/app/bsky/graph/getFollowers.ts | 12 +- .../bsky/src/api/app/bsky/graph/getFollows.ts | 10 +- .../api/app/bsky/graph/getKnownFollowers.ts | 13 +- .../bsky/src/api/app/bsky/graph/getList.ts | 14 +- .../src/api/app/bsky/graph/getListBlocks.ts | 13 +- .../src/api/app/bsky/graph/getListMutes.ts | 13 +- .../bsky/src/api/app/bsky/graph/getLists.ts | 12 +- .../app/bsky/graph/getListsWithMembership.ts | 15 +- .../bsky/src/api/app/bsky/graph/getMutes.ts | 13 +- .../api/app/bsky/graph/getRelationships.ts | 2 +- .../src/api/app/bsky/graph/getStarterPack.ts | 10 +- .../src/api/app/bsky/graph/getStarterPacks.ts | 10 +- .../graph/getStarterPacksWithMembership.ts | 10 +- .../bsky/graph/getSuggestedFollowsByActor.ts | 10 +- .../bsky/src/api/app/bsky/graph/muteActor.ts | 4 +- .../src/api/app/bsky/graph/muteActorList.ts | 4 +- .../bsky/src/api/app/bsky/graph/muteThread.ts | 4 +- .../api/app/bsky/graph/searchStarterPacks.ts | 16 +- .../src/api/app/bsky/graph/unmuteActor.ts | 4 +- .../src/api/app/bsky/graph/unmuteActorList.ts | 4 +- .../src/api/app/bsky/graph/unmuteThread.ts | 4 +- .../src/api/app/bsky/labeler/getServices.ts | 4 +- .../app/bsky/notification/getPreferences.ts | 6 +- .../app/bsky/notification/getUnreadCount.ts | 8 +- .../notification/listActivitySubscriptions.ts | 13 +- .../bsky/notification/listNotifications.ts | 21 +- .../notification/putActivitySubscription.ts | 6 +- .../app/bsky/notification/putPreferences.ts | 2 +- .../app/bsky/notification/putPreferencesV2.ts | 8 +- .../api/app/bsky/notification/registerPush.ts | 4 +- .../app/bsky/notification/unregisterPush.ts | 4 +- .../api/app/bsky/notification/updateSeen.ts | 2 +- .../src/api/app/bsky/notification/util.ts | 4 +- .../bsky/unspecced/getAgeAssuranceState.ts | 4 +- .../src/api/app/bsky/unspecced/getConfig.ts | 2 +- .../getOnboardingSuggestedStarterPacks.ts | 8 +- .../unspecced/getPopularFeedGenerators.ts | 6 +- .../bsky/unspecced/getPostThreadOtherV2.ts | 18 +- .../api/app/bsky/unspecced/getPostThreadV2.ts | 20 +- .../app/bsky/unspecced/getSuggestedFeeds.ts | 8 +- .../unspecced/getSuggestedOnboardingUsers.ts | 10 +- .../unspecced/getSuggestedStarterPacks.ts | 8 +- .../app/bsky/unspecced/getSuggestedUsers.ts | 8 +- .../unspecced/getSuggestedUsersForDiscover.ts | 8 +- .../unspecced/getSuggestedUsersForExplore.ts | 8 +- .../unspecced/getSuggestedUsersForSeeMore.ts | 8 +- .../bsky/unspecced/getTaggedSuggestions.ts | 2 +- .../app/bsky/unspecced/getTrendingTopics.ts | 8 +- .../src/api/app/bsky/unspecced/getTrends.ts | 8 +- .../app/bsky/unspecced/initAgeAssurance.ts | 12 +- packages/bsky/src/api/blob-dispatcher.ts | 4 +- packages/bsky/src/api/blob-resolver.ts | 18 +- .../api/com/atproto/admin/getAccountInfos.ts | 2 +- .../api/com/atproto/admin/getSubjectStatus.ts | 2 +- .../com/atproto/admin/updateSubjectStatus.ts | 2 +- .../api/com/atproto/identity/resolveHandle.ts | 2 +- .../src/api/com/atproto/label/queryLabels.ts | 2 +- .../src/api/com/atproto/repo/getRecord.ts | 2 +- .../src/api/com/atproto/temp/fetchLabels.ts | 2 +- packages/bsky/src/api/external.ts | 6 +- packages/bsky/src/api/health.ts | 2 +- packages/bsky/src/api/index.ts | 204 +- packages/bsky/src/api/kws/api.ts | 14 +- packages/bsky/src/api/kws/index.ts | 8 +- packages/bsky/src/api/kws/types.ts | 6 +- packages/bsky/src/api/kws/util.ts | 6 +- packages/bsky/src/api/kws/webhook.ts | 18 +- packages/bsky/src/api/sitemap.ts | 6 +- packages/bsky/src/api/util.ts | 2 +- packages/bsky/src/api/well-known.ts | 2 +- packages/bsky/src/auth-verifier.ts | 4 +- packages/bsky/src/bsync.ts | 2 +- packages/bsky/src/cache/read-through.ts | 4 +- packages/bsky/src/config.ts | 2 +- packages/bsky/src/context.ts | 26 +- packages/bsky/src/courier.ts | 2 +- packages/bsky/src/data-plane/bsync/index.ts | 12 +- packages/bsky/src/data-plane/client/hosts.ts | 4 +- packages/bsky/src/data-plane/client/index.ts | 10 +- .../bsky/src/data-plane/client/util.test.ts | 52 +- packages/bsky/src/data-plane/index.ts | 6 +- .../bsky/src/data-plane/server/background.ts | 4 +- .../data-plane/server/db/database-schema.ts | 86 +- packages/bsky/src/data-plane/server/db/db.ts | 10 +- .../bsky/src/data-plane/server/db/index.ts | 4 +- .../data-plane/server/db/migrations/index.ts | 110 +- .../src/data-plane/server/db/pagination.ts | 2 +- .../bsky/src/data-plane/server/db/util.ts | 2 +- packages/bsky/src/data-plane/server/index.ts | 6 +- .../src/data-plane/server/indexing/index.ts | 50 +- .../server/indexing/plugins/block.ts | 10 +- .../indexing/plugins/chat-declaration.ts | 10 +- .../server/indexing/plugins/feed-generator.ts | 10 +- .../server/indexing/plugins/follow.ts | 12 +- .../indexing/plugins/germ-declaration.ts | 8 +- .../server/indexing/plugins/labeler.ts | 10 +- .../server/indexing/plugins/like.ts | 14 +- .../server/indexing/plugins/list-block.ts | 10 +- .../server/indexing/plugins/list-item.ts | 10 +- .../server/indexing/plugins/list.ts | 10 +- .../indexing/plugins/notif-declaration.ts | 10 +- .../server/indexing/plugins/post-gate.ts | 10 +- .../server/indexing/plugins/post.ts | 22 +- .../server/indexing/plugins/profile.ts | 10 +- .../server/indexing/plugins/repost.ts | 14 +- .../server/indexing/plugins/starter-pack.ts | 10 +- .../server/indexing/plugins/status.ts | 10 +- .../server/indexing/plugins/thread-gate.ts | 10 +- .../server/indexing/plugins/verification.ts | 10 +- .../data-plane/server/indexing/processor.ts | 8 +- .../server/routes/activity-subscription.ts | 10 +- .../src/data-plane/server/routes/blocks.ts | 6 +- .../src/data-plane/server/routes/bookmarks.ts | 10 +- .../src/data-plane/server/routes/drafts.ts | 8 +- .../src/data-plane/server/routes/feed-gens.ts | 6 +- .../src/data-plane/server/routes/feeds.ts | 8 +- .../src/data-plane/server/routes/follows.ts | 8 +- .../src/data-plane/server/routes/identity.ts | 4 +- .../src/data-plane/server/routes/index.ts | 56 +- .../data-plane/server/routes/interactions.ts | 6 +- .../src/data-plane/server/routes/labels.ts | 6 +- .../src/data-plane/server/routes/likes.ts | 6 +- .../src/data-plane/server/routes/lists.ts | 8 +- .../data-plane/server/routes/moderation.ts | 4 +- .../src/data-plane/server/routes/mutes.ts | 12 +- .../src/data-plane/server/routes/notifs.ts | 12 +- .../src/data-plane/server/routes/profile.ts | 12 +- .../src/data-plane/server/routes/quotes.ts | 6 +- .../src/data-plane/server/routes/records.ts | 6 +- .../data-plane/server/routes/relationships.ts | 6 +- .../src/data-plane/server/routes/reposts.ts | 6 +- .../src/data-plane/server/routes/search.ts | 12 +- .../src/data-plane/server/routes/sitemap.ts | 4 +- .../data-plane/server/routes/starter-packs.ts | 6 +- .../data-plane/server/routes/suggestions.ts | 4 +- .../bsky/src/data-plane/server/routes/sync.ts | 4 +- .../src/data-plane/server/routes/threads.ts | 6 +- .../src/data-plane/server/subscription.ts | 8 +- packages/bsky/src/data-plane/server/util.ts | 8 +- packages/bsky/src/error.ts | 2 +- packages/bsky/src/feature-gates/index.ts | 12 +- .../bsky/src/feature-gates/metrics.test.ts | 32 +- packages/bsky/src/feature-gates/metrics.ts | 2 +- packages/bsky/src/feature-gates/types.ts | 2 +- packages/bsky/src/feature-gates/utils.test.ts | 4 +- packages/bsky/src/feature-gates/utils.ts | 6 +- packages/bsky/src/hydration/actor.ts | 6 +- packages/bsky/src/hydration/feed.ts | 6 +- packages/bsky/src/hydration/graph.ts | 6 +- packages/bsky/src/hydration/hydrator.ts | 25 +- packages/bsky/src/hydration/label.ts | 6 +- packages/bsky/src/hydration/util.ts | 2 +- packages/bsky/src/image/index.ts | 4 +- packages/bsky/src/image/invalidator.ts | 4 +- packages/bsky/src/image/server.ts | 14 +- packages/bsky/src/image/sharp.ts | 2 +- packages/bsky/src/image/uri.ts | 2 +- packages/bsky/src/index.ts | 64 +- packages/bsky/src/kws.ts | 10 +- packages/bsky/src/pipeline.ts | 2 +- packages/bsky/src/proto/bsky_connect.ts | 2 +- packages/bsky/src/proto/bsync_connect.ts | 2 +- packages/bsky/src/proto/courier_connect.ts | 2 +- packages/bsky/src/proto/rolodex_connect.ts | 2 +- packages/bsky/src/rolodex.ts | 2 +- packages/bsky/src/stash.ts | 4 +- packages/bsky/src/views/index.ts | 22 +- packages/bsky/src/views/threads-v2.ts | 2 +- .../feed-generation.test.ts.snap | 1168 +++--- packages/bsky/tests/_util.ts | 1 + packages/bsky/tests/admin/admin-auth.test.ts | 1 + packages/bsky/tests/admin/moderation.test.ts | 1 + packages/bsky/tests/auth.test.ts | 1 + packages/bsky/tests/blob-resolver.test.ts | 1 + .../__snapshots__/indexing.test.ts.snap | 480 +-- packages/bsky/tests/data-plane/db.test.ts | 3 +- .../data-plane/duplicate-records.test.ts | 1 + .../data-plane/handle-invalidation.test.ts | 1 + .../bsky/tests/data-plane/indexing.test.ts | 5 +- .../tests/data-plane/subscription.test.ts | 5 +- .../tests/data-plane/thread-mutes.test.ts | 1 + packages/bsky/tests/entryway-auth.test.ts | 1 + packages/bsky/tests/etcd.test.ts | 5 +- packages/bsky/tests/feed-generation.test.ts | 3 +- packages/bsky/tests/hydration/util.test.ts | 3 +- packages/bsky/tests/image/server.test.ts | 5 +- packages/bsky/tests/image/sharp.test.ts | 3 +- packages/bsky/tests/image/uri.test.ts | 3 +- packages/bsky/tests/label-hydration.test.ts | 1 + packages/bsky/tests/postgates.test.ts | 3 +- packages/bsky/tests/query-labels.test.ts | 1 + packages/bsky/tests/redis-cache.test.ts | 5 +- packages/bsky/tests/server.test.ts | 5 +- packages/bsky/tests/sitemap.test.ts | 1 + packages/bsky/tests/stash.test.ts | 3 +- packages/bsky/tests/utils.test.ts | 3 +- .../__snapshots__/actor-search.test.ts.snap | 80 +- .../__snapshots__/author-feed.test.ts.snap | 2984 +++++++------- .../__snapshots__/block-lists.test.ts.snap | 338 +- .../views/__snapshots__/blocks.test.ts.snap | 240 +- .../__snapshots__/bookmarks.test.ts.snap | 202 +- .../views/__snapshots__/follows.test.ts.snap | 414 +- .../labeler-service.test.ts.snap | 126 +- .../views/__snapshots__/likes.test.ts.snap | 76 +- .../__snapshots__/list-feed.test.ts.snap | 414 +- .../views/__snapshots__/lists.test.ts.snap | 422 +- .../__snapshots__/mute-lists.test.ts.snap | 338 +- .../views/__snapshots__/mutes.test.ts.snap | 192 +- .../__snapshots__/notifications.test.ts.snap | 1528 +++---- .../views/__snapshots__/posts.test.ts.snap | 378 +- .../views/__snapshots__/profile.test.ts.snap | 384 +- .../views/__snapshots__/quotes.test.ts.snap | 226 +- .../views/__snapshots__/reposts.test.ts.snap | 74 +- .../__snapshots__/starter-packs.test.ts.snap | 436 +- .../__snapshots__/thread-v2.test.ts.snap | 646 +-- .../views/__snapshots__/thread.test.ts.snap | 1024 ++--- .../__snapshots__/threadgating.test.ts.snap | 122 +- .../views/__snapshots__/timeline.test.ts.snap | 3502 ++++++++--------- .../tests/views/account-deactivation.test.ts | 1 + packages/bsky/tests/views/actor-likes.test.ts | 1 + .../bsky/tests/views/actor-search.test.ts | 20 +- .../bsky/tests/views/age-assurance-v2.test.ts | 6 +- .../bsky/tests/views/age-assurance.test.ts | 28 +- packages/bsky/tests/views/author-feed.test.ts | 5 +- packages/bsky/tests/views/block-lists.test.ts | 3 +- packages/bsky/tests/views/blocks.test.ts | 3 +- packages/bsky/tests/views/bookmarks.test.ts | 13 +- packages/bsky/tests/views/drafts.test.ts | 13 +- .../tests/views/feed-hidden-replies.test.ts | 3 +- .../bsky/tests/views/feed-view-post.test.ts | 1 + packages/bsky/tests/views/follows.test.ts | 3 +- packages/bsky/tests/views/get-config.test.ts | 1 + .../get-suggested-onboarding-users.test.ts | 1 + .../views/get-suggested-starter-packs.test.ts | 3 +- packages/bsky/tests/views/get-trends.test.ts | 3 +- .../bsky/tests/views/known-followers.test.ts | 3 +- .../bsky/tests/views/labeler-service.test.ts | 3 +- .../tests/views/labels-needs-review.test.ts | 1 + .../bsky/tests/views/labels-takedown.test.ts | 1 + packages/bsky/tests/views/likes.test.ts | 10 +- packages/bsky/tests/views/list-feed.test.ts | 3 +- packages/bsky/tests/views/lists.test.ts | 3 +- packages/bsky/tests/views/mute-lists.test.ts | 3 +- packages/bsky/tests/views/mutes.test.ts | 3 +- .../bsky/tests/views/notifications.test.ts | 52 +- packages/bsky/tests/views/post-search.test.ts | 3 +- packages/bsky/tests/views/posts-debug.test.ts | 1 + packages/bsky/tests/views/posts.test.ts | 3 +- .../bsky/tests/views/profile-debug.test.ts | 1 + packages/bsky/tests/views/profile.test.ts | 21 +- packages/bsky/tests/views/quotes.test.ts | 3 +- packages/bsky/tests/views/reposts.test.ts | 3 +- .../bsky/tests/views/starter-packs.test.ts | 3 +- packages/bsky/tests/views/suggestions.test.ts | 3 +- packages/bsky/tests/views/thread-v2.test.ts | 5 +- packages/bsky/tests/views/thread.test.ts | 3 +- .../bsky/tests/views/threadgating.test.ts | 3 +- packages/bsky/tests/views/timeline.test.ts | 5 +- .../bsky/tests/views/verification.test.ts | 1 + packages/bsky/vitest.config.ts | 15 + packages/bsync/bin/migration-create.ts | 2 +- .../bsync/{jest.config.js => jest.config.cjs} | 2 +- packages/bsync/package.json | 2 +- packages/bsync/src/client.ts | 2 +- packages/bsync/src/context.ts | 10 +- packages/bsync/src/db/index.ts | 10 +- packages/bsync/src/db/migrations/index.ts | 8 +- packages/bsync/src/db/schema/index.ts | 10 +- packages/bsync/src/db/schema/mute_op.ts | 2 +- packages/bsync/src/db/schema/operation.ts | 2 +- packages/bsync/src/index.ts | 24 +- packages/bsync/src/proto/bsync_connect.ts | 2 +- .../bsync/src/routes/add-mute-operation.ts | 17 +- .../bsync/src/routes/add-notif-operation.ts | 14 +- packages/bsync/src/routes/auth.ts | 2 +- .../bsync/src/routes/delete-operations.ts | 10 +- packages/bsync/src/routes/index.ts | 18 +- packages/bsync/src/routes/put-operation.ts | 17 +- .../bsync/src/routes/scan-mute-operations.ts | 12 +- .../bsync/src/routes/scan-notif-operations.ts | 12 +- packages/bsync/src/routes/scan-operations.ts | 12 +- .../bsync/tests/delete-operations.test.ts | 4 +- packages/bsync/tests/mutes.test.ts | 4 +- packages/bsync/tests/notifications.test.ts | 4 +- packages/bsync/tests/operations.test.ts | 4 +- .../{jest.config.js => jest.config.cjs} | 2 +- packages/common-web/package.json | 2 +- packages/common-web/src/async.ts | 2 +- packages/common-web/src/index.ts | 24 +- packages/common-web/src/retry.ts | 2 +- packages/common-web/src/tid.ts | 2 +- packages/common-web/src/types.ts | 2 +- packages/common-web/tests/check.test.ts | 2 +- packages/common-web/tests/retry.test.ts | 2 +- packages/common-web/tests/tid.test.ts | 2 +- packages/common-web/tests/util.test.ts | 2 +- .../{jest.config.js => jest.config.cjs} | 2 +- packages/common/package.json | 2 +- packages/common/src/index.ts | 18 +- packages/common/tests/ipld-multi.test.ts | 2 +- packages/common/tests/ipld.test.ts | 4 +- packages/common/tests/streams.test.ts | 2 +- .../{jest.config.js => jest.config.cjs} | 2 +- packages/crypto/package.json | 4 +- packages/crypto/src/did.ts | 6 +- packages/crypto/src/index.ts | 24 +- packages/crypto/src/p256/keypair.ts | 6 +- packages/crypto/src/p256/operations.ts | 6 +- packages/crypto/src/p256/plugin.ts | 8 +- packages/crypto/src/plugins.ts | 4 +- packages/crypto/src/random.ts | 2 +- packages/crypto/src/secp256k1/keypair.ts | 6 +- packages/crypto/src/secp256k1/operations.ts | 6 +- packages/crypto/src/secp256k1/plugin.ts | 8 +- packages/crypto/src/utils.ts | 2 +- packages/crypto/src/verify.ts | 6 +- packages/crypto/tests/did.test.ts | 8 +- packages/crypto/tests/key-compression.test.ts | 10 +- packages/crypto/tests/keypairs.test.ts | 10 +- packages/crypto/tests/random.test.ts | 2 +- packages/crypto/tests/signatures.test.ts | 10 +- packages/dev-env/src/bin.ts | 6 +- packages/dev-env/src/bsky.ts | 4 +- packages/dev-env/src/bsync.ts | 2 +- packages/dev-env/src/index.ts | 28 +- packages/dev-env/src/introspect.ts | 8 +- packages/dev-env/src/mock/index.ts | 10 +- packages/dev-env/src/moderator-client.ts | 2 +- packages/dev-env/src/network-no-appview.ts | 12 +- packages/dev-env/src/network.ts | 22 +- packages/dev-env/src/ozone.ts | 8 +- packages/dev-env/src/pds.ts | 4 +- packages/dev-env/src/plc.ts | 2 +- packages/dev-env/src/seed/author-feed.ts | 4 +- packages/dev-env/src/seed/basic.ts | 12 +- packages/dev-env/src/seed/client.ts | 2 +- packages/dev-env/src/seed/follows.ts | 2 +- packages/dev-env/src/seed/index.ts | 20 +- packages/dev-env/src/seed/likes.ts | 4 +- packages/dev-env/src/seed/quotes.ts | 4 +- packages/dev-env/src/seed/reposts.ts | 4 +- packages/dev-env/src/seed/thread-v2.ts | 6 +- packages/dev-env/src/seed/users-bulk.ts | 2 +- packages/dev-env/src/seed/users.ts | 2 +- packages/dev-env/src/seed/verifications.ts | 4 +- .../dev-env/src/service-profile-lexicon.ts | 4 +- packages/dev-env/src/service-profile-ozone.ts | 4 +- packages/dev-env/src/service-profile.ts | 2 +- packages/dev-env/src/util.ts | 6 +- packages/did/jest.config.cjs | 8 + packages/did/package.json | 2 +- packages/did/tests/methods/plc.test.ts | 4 +- packages/did/tests/methods/web.test.ts | 4 +- .../{jest.config.js => jest.config.cjs} | 2 +- packages/identity/package.json | 2 +- packages/identity/src/did/atproto-data.ts | 2 +- packages/identity/src/did/base-resolver.ts | 6 +- packages/identity/src/did/did-resolver.ts | 13 +- packages/identity/src/did/index.ts | 10 +- packages/identity/src/did/memory-cache.ts | 2 +- packages/identity/src/did/plc-resolver.ts | 6 +- packages/identity/src/did/web-resolver.ts | 11 +- packages/identity/src/handle/index.ts | 2 +- packages/identity/src/id-resolver.ts | 6 +- packages/identity/src/index.ts | 10 +- packages/identity/tests/did-cache.test.ts | 4 +- packages/identity/tests/did-document.test.ts | 2 +- packages/identity/tests/did-resolver.test.ts | 6 +- .../identity/tests/handle-resolver.test.ts | 2 +- packages/identity/tests/web/db.ts | 2 +- packages/identity/tests/web/server.ts | 4 +- .../internal-resolvers/dns-handle-resolver.ts | 2 +- .../src/identity-resolver.ts | 2 +- packages/lex-cli/src/codegen/client.ts | 8 +- packages/lex-cli/src/codegen/common.ts | 6 +- packages/lex-cli/src/codegen/lex-gen.ts | 4 +- packages/lex-cli/src/codegen/server.ts | 8 +- packages/lex-cli/src/index.ts | 8 +- packages/lex-cli/src/util.ts | 2 +- packages/lex/lex-builder/src/lex-builder.ts | 2 +- packages/lex/lex-builder/src/ref-resolver.ts | 4 +- .../lex-data/src/cid-implementation.test.ts | 6 +- packages/lex/lex-server/src/lex-router.ts | 2 +- packages/lexicon-resolver/jest.config.js | 7 - packages/lexicon-resolver/package.json | 6 +- .../lexicon-resolver/tests/lexicon.test.ts | 7 +- .../lexicon-resolver/tests/record.test.ts | 1 + packages/lexicon-resolver/vitest.config.ts | 5 + .../{jest.config.js => jest.config.cjs} | 2 +- packages/lexicon/package.json | 2 +- packages/lexicon/src/index.ts | 8 +- packages/lexicon/src/lexicons.ts | 8 +- packages/lexicon/src/serialize.ts | 2 +- packages/lexicon/src/types.ts | 2 +- packages/lexicon/src/validation.ts | 8 +- packages/lexicon/src/validators/blob.ts | 6 +- packages/lexicon/src/validators/complex.ts | 10 +- packages/lexicon/src/validators/formats.ts | 2 +- packages/lexicon/src/validators/primitives.ts | 6 +- packages/lexicon/src/validators/xrpc.ts | 12 +- packages/lexicon/tests/_scaffolds/lexicons.ts | 2 +- packages/lexicon/tests/general.test.ts | 4 +- packages/oauth/jwk/src/jwk.ts | 2 +- .../src/providers/OAuthProvider.tsx | 4 +- .../src/ExpoAtprotoOAuthClientModule.ts | 2 +- .../src/expo-oauth-client.d.ts | 4 +- .../src/expo-oauth-client.native.ts | 10 +- .../src/expo-oauth-client.web.ts | 4 +- packages/oauth/oauth-client-expo/src/index.ts | 6 +- .../oauth-client-expo/src/utils/expo-key.ts | 4 +- .../src/utils/mmkv-simple-store-ttl.ts | 2 +- .../oauth-client-expo/src/utils/stores.ts | 4 +- .../src/components/forms/form-field.tsx | 2 +- .../src/components/utils/account-card.tsx | 11 +- .../src/components/utils/account-name.tsx | 2 +- .../src/components/utils/help-card.tsx | 2 +- .../src/contexts/session.tsx | 2 +- .../src/cookie-error-page.tsx | 2 +- .../src/errors/invalid-invite-code-error.ts | 2 +- .../{jest.config.js => jest.config.cjs} | 0 packages/oauth/oauth-scopes/package.json | 2 +- .../src/scopes/include-scope.test.ts | 10 +- .../src/atproto-oauth-token-response.ts | 2 +- packages/ozone/bin/migration-create.ts | 2 +- .../ozone/{jest.config.js => jest.config.cjs} | 2 +- packages/ozone/package.json | 4 +- .../ozone/src/api/chat/getActorMetadata.ts | 6 +- .../ozone/src/api/chat/getMessageContext.ts | 6 +- packages/ozone/src/api/chat/index.ts | 8 +- .../src/api/communication/createTemplate.ts | 6 +- .../src/api/communication/deleteTemplate.ts | 4 +- .../src/api/communication/listTemplates.ts | 4 +- .../src/api/communication/updateTemplate.ts | 6 +- packages/ozone/src/api/health.ts | 2 +- packages/ozone/src/api/index.ts | 142 +- packages/ozone/src/api/label/fetchLabels.ts | 4 +- packages/ozone/src/api/label/queryLabels.ts | 4 +- .../ozone/src/api/label/subscribeLabels.ts | 6 +- .../api/moderation/cancelScheduledActions.ts | 8 +- .../ozone/src/api/moderation/emitEvent.ts | 30 +- .../src/api/moderation/getAccountTimeline.ts | 8 +- packages/ozone/src/api/moderation/getEvent.ts | 4 +- .../ozone/src/api/moderation/getRecord.ts | 6 +- .../ozone/src/api/moderation/getRecords.ts | 6 +- packages/ozone/src/api/moderation/getRepo.ts | 6 +- .../src/api/moderation/getReporterStats.ts | 4 +- packages/ozone/src/api/moderation/getRepos.ts | 6 +- .../ozone/src/api/moderation/getSubjects.ts | 8 +- .../api/moderation/listScheduledActions.ts | 6 +- .../ozone/src/api/moderation/queryEvents.ts | 6 +- .../ozone/src/api/moderation/queryStatuses.ts | 4 +- .../src/api/moderation/scheduleAction.ts | 12 +- .../ozone/src/api/moderation/searchRepos.ts | 6 +- packages/ozone/src/api/moderation/util.ts | 6 +- packages/ozone/src/api/proxied.ts | 6 +- .../ozone/src/api/queue/assignModerator.ts | 6 +- packages/ozone/src/api/queue/createQueue.ts | 4 +- packages/ozone/src/api/queue/deleteQueue.ts | 4 +- .../ozone/src/api/queue/getAssignments.ts | 4 +- packages/ozone/src/api/queue/listQueues.ts | 4 +- packages/ozone/src/api/queue/routeReports.ts | 4 +- .../ozone/src/api/queue/unassignModerator.ts | 6 +- packages/ozone/src/api/queue/updateQueue.ts | 4 +- .../ozone/src/api/report/assignModerator.ts | 6 +- .../ozone/src/api/report/createActivity.ts | 8 +- packages/ozone/src/api/report/createReport.ts | 16 +- .../ozone/src/api/report/getAssignments.ts | 4 +- .../src/api/report/getHistoricalStats.ts | 6 +- .../ozone/src/api/report/getLatestReport.ts | 10 +- packages/ozone/src/api/report/getLiveStats.ts | 6 +- packages/ozone/src/api/report/getReport.ts | 10 +- .../ozone/src/api/report/listActivities.ts | 9 +- packages/ozone/src/api/report/queryReports.ts | 10 +- .../ozone/src/api/report/reassignQueue.ts | 12 +- packages/ozone/src/api/report/refreshStats.ts | 4 +- .../ozone/src/api/report/unassignModerator.ts | 6 +- packages/ozone/src/api/safelink/addRule.ts | 6 +- .../ozone/src/api/safelink/queryEvents.ts | 6 +- packages/ozone/src/api/safelink/queryRules.ts | 6 +- packages/ozone/src/api/safelink/removeRule.ts | 6 +- packages/ozone/src/api/safelink/updateRule.ts | 6 +- packages/ozone/src/api/server/getConfig.ts | 4 +- packages/ozone/src/api/set/addValues.ts | 4 +- packages/ozone/src/api/set/deleteSet.ts | 4 +- packages/ozone/src/api/set/deleteValues.ts | 4 +- packages/ozone/src/api/set/getValues.ts | 4 +- packages/ozone/src/api/set/querySets.ts | 4 +- packages/ozone/src/api/set/upsertSet.ts | 4 +- packages/ozone/src/api/setting/listOptions.ts | 4 +- .../ozone/src/api/setting/removeOptions.ts | 6 +- .../ozone/src/api/setting/upsertOption.ts | 12 +- packages/ozone/src/api/team/addMember.ts | 6 +- packages/ozone/src/api/team/deleteMember.ts | 4 +- packages/ozone/src/api/team/listMembers.ts | 4 +- packages/ozone/src/api/team/updateMember.ts | 6 +- packages/ozone/src/api/util.ts | 20 +- .../api/verification/grantVerifications.ts | 8 +- .../src/api/verification/listVerifications.ts | 6 +- .../api/verification/revokeVerifications.ts | 4 +- packages/ozone/src/api/well-known.ts | 2 +- packages/ozone/src/assignment/index.ts | 18 +- packages/ozone/src/auth-verifier.ts | 2 +- packages/ozone/src/background.ts | 10 +- .../src/communication-service/template.ts | 6 +- packages/ozone/src/config/config.ts | 2 +- packages/ozone/src/config/index.ts | 6 +- packages/ozone/src/config/secrets.ts | 2 +- packages/ozone/src/context.ts | 52 +- packages/ozone/src/daemon/blob-diverter.ts | 6 +- packages/ozone/src/daemon/context.ts | 40 +- packages/ozone/src/daemon/event-pusher.ts | 14 +- packages/ozone/src/daemon/event-reverser.ts | 13 +- packages/ozone/src/daemon/index.ts | 16 +- packages/ozone/src/daemon/job-cursor.ts | 2 +- .../src/daemon/materialized-view-refresher.ts | 4 +- packages/ozone/src/daemon/queue-router.ts | 8 +- .../src/daemon/scheduled-action-processor.ts | 25 +- packages/ozone/src/daemon/stats-computer.ts | 6 +- .../src/daemon/strike-expiry-processor.ts | 8 +- .../src/daemon/team-profile-synchronizer.ts | 4 +- .../ozone/src/daemon/verification-listener.ts | 10 +- packages/ozone/src/db/index.ts | 10 +- ...220T144630860Z-stats-materialized-views.ts | 12 +- ...8T150931000Z-update-appeal-reason-stats.ts | 10 +- packages/ozone/src/db/migrations/index.ts | 76 +- packages/ozone/src/db/pagination.ts | 2 +- packages/ozone/src/db/schema/index.ts | 54 +- .../db/schema/moderation_subject_status.ts | 2 +- packages/ozone/src/db/schema/safelink.ts | 2 +- packages/ozone/src/db/schema/setting.ts | 2 +- packages/ozone/src/error.ts | 2 +- packages/ozone/src/index.ts | 28 +- .../src/lexicon/types/app/bsky/actor/defs.ts | 4 +- .../types/app/bsky/actor/getPreferences.ts | 4 +- .../types/app/bsky/actor/getProfile.ts | 4 +- .../types/app/bsky/actor/getProfiles.ts | 4 +- .../types/app/bsky/actor/getSuggestions.ts | 4 +- .../lexicon/types/app/bsky/actor/profile.ts | 4 +- .../types/app/bsky/actor/putPreferences.ts | 4 +- .../types/app/bsky/actor/searchActors.ts | 4 +- .../app/bsky/actor/searchActorsTypeahead.ts | 4 +- .../lexicon/types/app/bsky/actor/status.ts | 4 +- .../types/app/bsky/ageassurance/begin.ts | 4 +- .../types/app/bsky/ageassurance/defs.ts | 4 +- .../types/app/bsky/ageassurance/getConfig.ts | 4 +- .../types/app/bsky/ageassurance/getState.ts | 4 +- .../types/app/bsky/bookmark/createBookmark.ts | 4 +- .../lexicon/types/app/bsky/bookmark/defs.ts | 4 +- .../types/app/bsky/bookmark/deleteBookmark.ts | 4 +- .../types/app/bsky/bookmark/getBookmarks.ts | 4 +- .../lexicon/types/app/bsky/contact/defs.ts | 4 +- .../types/app/bsky/contact/dismissMatch.ts | 4 +- .../types/app/bsky/contact/getMatches.ts | 4 +- .../types/app/bsky/contact/getSyncStatus.ts | 4 +- .../types/app/bsky/contact/importContacts.ts | 4 +- .../types/app/bsky/contact/removeData.ts | 4 +- .../app/bsky/contact/sendNotification.ts | 4 +- .../bsky/contact/startPhoneVerification.ts | 4 +- .../types/app/bsky/contact/verifyPhone.ts | 4 +- .../types/app/bsky/draft/createDraft.ts | 4 +- .../src/lexicon/types/app/bsky/draft/defs.ts | 4 +- .../types/app/bsky/draft/deleteDraft.ts | 4 +- .../lexicon/types/app/bsky/draft/getDrafts.ts | 4 +- .../types/app/bsky/draft/updateDraft.ts | 4 +- .../src/lexicon/types/app/bsky/embed/defs.ts | 4 +- .../lexicon/types/app/bsky/embed/external.ts | 4 +- .../lexicon/types/app/bsky/embed/images.ts | 4 +- .../lexicon/types/app/bsky/embed/record.ts | 4 +- .../types/app/bsky/embed/recordWithMedia.ts | 4 +- .../src/lexicon/types/app/bsky/embed/video.ts | 4 +- .../src/lexicon/types/app/bsky/feed/defs.ts | 4 +- .../app/bsky/feed/describeFeedGenerator.ts | 4 +- .../lexicon/types/app/bsky/feed/generator.ts | 4 +- .../types/app/bsky/feed/getActorFeeds.ts | 4 +- .../types/app/bsky/feed/getActorLikes.ts | 4 +- .../types/app/bsky/feed/getAuthorFeed.ts | 4 +- .../lexicon/types/app/bsky/feed/getFeed.ts | 4 +- .../types/app/bsky/feed/getFeedGenerator.ts | 4 +- .../types/app/bsky/feed/getFeedGenerators.ts | 4 +- .../types/app/bsky/feed/getFeedSkeleton.ts | 4 +- .../lexicon/types/app/bsky/feed/getLikes.ts | 4 +- .../types/app/bsky/feed/getListFeed.ts | 4 +- .../types/app/bsky/feed/getPostThread.ts | 4 +- .../lexicon/types/app/bsky/feed/getPosts.ts | 4 +- .../lexicon/types/app/bsky/feed/getQuotes.ts | 4 +- .../types/app/bsky/feed/getRepostedBy.ts | 4 +- .../types/app/bsky/feed/getSuggestedFeeds.ts | 4 +- .../types/app/bsky/feed/getTimeline.ts | 4 +- .../src/lexicon/types/app/bsky/feed/like.ts | 4 +- .../src/lexicon/types/app/bsky/feed/post.ts | 4 +- .../lexicon/types/app/bsky/feed/postgate.ts | 4 +- .../src/lexicon/types/app/bsky/feed/repost.ts | 4 +- .../types/app/bsky/feed/searchPosts.ts | 4 +- .../types/app/bsky/feed/sendInteractions.ts | 4 +- .../lexicon/types/app/bsky/feed/threadgate.ts | 4 +- .../src/lexicon/types/app/bsky/graph/block.ts | 4 +- .../src/lexicon/types/app/bsky/graph/defs.ts | 4 +- .../lexicon/types/app/bsky/graph/follow.ts | 4 +- .../app/bsky/graph/getActorStarterPacks.ts | 4 +- .../lexicon/types/app/bsky/graph/getBlocks.ts | 4 +- .../types/app/bsky/graph/getFollowers.ts | 4 +- .../types/app/bsky/graph/getFollows.ts | 4 +- .../types/app/bsky/graph/getKnownFollowers.ts | 4 +- .../lexicon/types/app/bsky/graph/getList.ts | 4 +- .../types/app/bsky/graph/getListBlocks.ts | 4 +- .../types/app/bsky/graph/getListMutes.ts | 4 +- .../lexicon/types/app/bsky/graph/getLists.ts | 4 +- .../app/bsky/graph/getListsWithMembership.ts | 4 +- .../lexicon/types/app/bsky/graph/getMutes.ts | 4 +- .../types/app/bsky/graph/getRelationships.ts | 4 +- .../types/app/bsky/graph/getStarterPack.ts | 4 +- .../types/app/bsky/graph/getStarterPacks.ts | 4 +- .../graph/getStarterPacksWithMembership.ts | 4 +- .../bsky/graph/getSuggestedFollowsByActor.ts | 4 +- .../src/lexicon/types/app/bsky/graph/list.ts | 4 +- .../lexicon/types/app/bsky/graph/listblock.ts | 4 +- .../lexicon/types/app/bsky/graph/listitem.ts | 4 +- .../lexicon/types/app/bsky/graph/muteActor.ts | 4 +- .../types/app/bsky/graph/muteActorList.ts | 4 +- .../types/app/bsky/graph/muteThread.ts | 4 +- .../app/bsky/graph/searchStarterPacks.ts | 4 +- .../types/app/bsky/graph/starterpack.ts | 4 +- .../types/app/bsky/graph/unmuteActor.ts | 4 +- .../types/app/bsky/graph/unmuteActorList.ts | 4 +- .../types/app/bsky/graph/unmuteThread.ts | 4 +- .../types/app/bsky/graph/verification.ts | 4 +- .../lexicon/types/app/bsky/labeler/defs.ts | 4 +- .../types/app/bsky/labeler/getServices.ts | 4 +- .../lexicon/types/app/bsky/labeler/service.ts | 4 +- .../app/bsky/notification/declaration.ts | 4 +- .../types/app/bsky/notification/defs.ts | 4 +- .../app/bsky/notification/getPreferences.ts | 4 +- .../app/bsky/notification/getUnreadCount.ts | 4 +- .../notification/listActivitySubscriptions.ts | 4 +- .../bsky/notification/listNotifications.ts | 4 +- .../notification/putActivitySubscription.ts | 4 +- .../app/bsky/notification/putPreferences.ts | 4 +- .../app/bsky/notification/putPreferencesV2.ts | 4 +- .../app/bsky/notification/registerPush.ts | 4 +- .../app/bsky/notification/unregisterPush.ts | 4 +- .../types/app/bsky/notification/updateSeen.ts | 4 +- .../lexicon/types/app/bsky/richtext/facet.ts | 4 +- .../lexicon/types/app/bsky/unspecced/defs.ts | 4 +- .../bsky/unspecced/getAgeAssuranceState.ts | 4 +- .../types/app/bsky/unspecced/getConfig.ts | 4 +- .../getOnboardingSuggestedStarterPacks.ts | 4 +- ...OnboardingSuggestedStarterPacksSkeleton.ts | 4 +- .../getOnboardingSuggestedUsersSkeleton.ts | 4 +- .../unspecced/getPopularFeedGenerators.ts | 4 +- .../bsky/unspecced/getPostThreadOtherV2.ts | 4 +- .../app/bsky/unspecced/getPostThreadV2.ts | 4 +- .../app/bsky/unspecced/getSuggestedFeeds.ts | 4 +- .../unspecced/getSuggestedFeedsSkeleton.ts | 4 +- .../unspecced/getSuggestedOnboardingUsers.ts | 4 +- .../unspecced/getSuggestedStarterPacks.ts | 4 +- .../getSuggestedStarterPacksSkeleton.ts | 4 +- .../app/bsky/unspecced/getSuggestedUsers.ts | 4 +- .../unspecced/getSuggestedUsersForDiscover.ts | 4 +- .../getSuggestedUsersForDiscoverSkeleton.ts | 4 +- .../unspecced/getSuggestedUsersForExplore.ts | 4 +- .../getSuggestedUsersForExploreSkeleton.ts | 4 +- .../unspecced/getSuggestedUsersForSeeMore.ts | 4 +- .../getSuggestedUsersForSeeMoreSkeleton.ts | 4 +- .../unspecced/getSuggestedUsersSkeleton.ts | 4 +- .../bsky/unspecced/getSuggestionsSkeleton.ts | 4 +- .../bsky/unspecced/getTaggedSuggestions.ts | 4 +- .../app/bsky/unspecced/getTrendingTopics.ts | 4 +- .../types/app/bsky/unspecced/getTrends.ts | 4 +- .../app/bsky/unspecced/getTrendsSkeleton.ts | 4 +- .../app/bsky/unspecced/initAgeAssurance.ts | 4 +- .../bsky/unspecced/searchActorsSkeleton.ts | 4 +- .../app/bsky/unspecced/searchPostsSkeleton.ts | 4 +- .../unspecced/searchStarterPacksSkeleton.ts | 4 +- .../src/lexicon/types/app/bsky/video/defs.ts | 4 +- .../types/app/bsky/video/getJobStatus.ts | 4 +- .../types/app/bsky/video/getUploadLimits.ts | 4 +- .../types/app/bsky/video/uploadVideo.ts | 4 +- .../types/chat/bsky/actor/declaration.ts | 4 +- .../src/lexicon/types/chat/bsky/actor/defs.ts | 4 +- .../types/chat/bsky/actor/deleteAccount.ts | 4 +- .../chat/bsky/actor/exportAccountData.ts | 4 +- .../types/chat/bsky/convo/acceptConvo.ts | 4 +- .../types/chat/bsky/convo/addReaction.ts | 4 +- .../src/lexicon/types/chat/bsky/convo/defs.ts | 4 +- .../chat/bsky/convo/deleteMessageForSelf.ts | 4 +- .../lexicon/types/chat/bsky/convo/getConvo.ts | 4 +- .../chat/bsky/convo/getConvoAvailability.ts | 4 +- .../chat/bsky/convo/getConvoForMembers.ts | 4 +- .../types/chat/bsky/convo/getConvoMembers.ts | 4 +- .../lexicon/types/chat/bsky/convo/getLog.ts | 4 +- .../types/chat/bsky/convo/getMessages.ts | 4 +- .../types/chat/bsky/convo/leaveConvo.ts | 4 +- .../chat/bsky/convo/listConvoRequests.ts | 4 +- .../types/chat/bsky/convo/listConvos.ts | 4 +- .../types/chat/bsky/convo/lockConvo.ts | 4 +- .../types/chat/bsky/convo/muteConvo.ts | 4 +- .../types/chat/bsky/convo/removeReaction.ts | 4 +- .../types/chat/bsky/convo/sendMessage.ts | 4 +- .../types/chat/bsky/convo/sendMessageBatch.ts | 4 +- .../types/chat/bsky/convo/unlockConvo.ts | 4 +- .../types/chat/bsky/convo/unmuteConvo.ts | 4 +- .../types/chat/bsky/convo/updateAllRead.ts | 4 +- .../types/chat/bsky/convo/updateRead.ts | 4 +- .../types/chat/bsky/group/addMembers.ts | 4 +- .../chat/bsky/group/approveJoinRequest.ts | 4 +- .../types/chat/bsky/group/createGroup.ts | 4 +- .../types/chat/bsky/group/createJoinLink.ts | 4 +- .../src/lexicon/types/chat/bsky/group/defs.ts | 4 +- .../types/chat/bsky/group/disableJoinLink.ts | 4 +- .../types/chat/bsky/group/editGroup.ts | 4 +- .../types/chat/bsky/group/editJoinLink.ts | 4 +- .../types/chat/bsky/group/enableJoinLink.ts | 4 +- .../chat/bsky/group/getJoinLinkPreview.ts | 4 +- .../types/chat/bsky/group/listJoinRequests.ts | 4 +- .../chat/bsky/group/rejectJoinRequest.ts | 4 +- .../types/chat/bsky/group/removeMembers.ts | 4 +- .../types/chat/bsky/group/requestJoin.ts | 4 +- .../chat/bsky/moderation/getActorMetadata.ts | 4 +- .../chat/bsky/moderation/getMessageContext.ts | 4 +- .../bsky/moderation/subscribeModEvents.ts | 4 +- .../chat/bsky/moderation/updateActorAccess.ts | 4 +- .../lexicon/types/com/atproto/admin/defs.ts | 4 +- .../types/com/atproto/admin/deleteAccount.ts | 4 +- .../atproto/admin/disableAccountInvites.ts | 4 +- .../com/atproto/admin/disableInviteCodes.ts | 4 +- .../com/atproto/admin/enableAccountInvites.ts | 4 +- .../types/com/atproto/admin/getAccountInfo.ts | 4 +- .../com/atproto/admin/getAccountInfos.ts | 4 +- .../types/com/atproto/admin/getInviteCodes.ts | 4 +- .../com/atproto/admin/getSubjectStatus.ts | 4 +- .../types/com/atproto/admin/searchAccounts.ts | 4 +- .../types/com/atproto/admin/sendEmail.ts | 4 +- .../com/atproto/admin/updateAccountEmail.ts | 4 +- .../com/atproto/admin/updateAccountHandle.ts | 4 +- .../atproto/admin/updateAccountPassword.ts | 4 +- .../atproto/admin/updateAccountSigningKey.ts | 4 +- .../com/atproto/admin/updateSubjectStatus.ts | 4 +- .../types/com/atproto/identity/defs.ts | 4 +- .../identity/getRecommendedDidCredentials.ts | 4 +- .../com/atproto/identity/refreshIdentity.ts | 4 +- .../identity/requestPlcOperationSignature.ts | 4 +- .../types/com/atproto/identity/resolveDid.ts | 4 +- .../com/atproto/identity/resolveHandle.ts | 4 +- .../com/atproto/identity/resolveIdentity.ts | 4 +- .../com/atproto/identity/signPlcOperation.ts | 4 +- .../atproto/identity/submitPlcOperation.ts | 4 +- .../com/atproto/identity/updateHandle.ts | 4 +- .../lexicon/types/com/atproto/label/defs.ts | 4 +- .../types/com/atproto/label/queryLabels.ts | 4 +- .../com/atproto/label/subscribeLabels.ts | 4 +- .../com/atproto/lexicon/resolveLexicon.ts | 4 +- .../types/com/atproto/lexicon/schema.ts | 4 +- .../com/atproto/moderation/createReport.ts | 4 +- .../types/com/atproto/moderation/defs.ts | 4 +- .../types/com/atproto/repo/applyWrites.ts | 4 +- .../types/com/atproto/repo/createRecord.ts | 4 +- .../lexicon/types/com/atproto/repo/defs.ts | 4 +- .../types/com/atproto/repo/deleteRecord.ts | 4 +- .../types/com/atproto/repo/describeRepo.ts | 4 +- .../types/com/atproto/repo/getRecord.ts | 4 +- .../types/com/atproto/repo/importRepo.ts | 4 +- .../com/atproto/repo/listMissingBlobs.ts | 4 +- .../types/com/atproto/repo/listRecords.ts | 4 +- .../types/com/atproto/repo/putRecord.ts | 4 +- .../types/com/atproto/repo/strongRef.ts | 4 +- .../types/com/atproto/repo/uploadBlob.ts | 4 +- .../com/atproto/server/activateAccount.ts | 4 +- .../com/atproto/server/checkAccountStatus.ts | 4 +- .../types/com/atproto/server/confirmEmail.ts | 4 +- .../types/com/atproto/server/createAccount.ts | 4 +- .../com/atproto/server/createAppPassword.ts | 4 +- .../com/atproto/server/createInviteCode.ts | 4 +- .../com/atproto/server/createInviteCodes.ts | 4 +- .../types/com/atproto/server/createSession.ts | 4 +- .../com/atproto/server/deactivateAccount.ts | 4 +- .../lexicon/types/com/atproto/server/defs.ts | 4 +- .../types/com/atproto/server/deleteAccount.ts | 4 +- .../types/com/atproto/server/deleteSession.ts | 4 +- .../com/atproto/server/describeServer.ts | 4 +- .../atproto/server/getAccountInviteCodes.ts | 4 +- .../com/atproto/server/getServiceAuth.ts | 4 +- .../types/com/atproto/server/getSession.ts | 4 +- .../com/atproto/server/listAppPasswords.ts | 4 +- .../com/atproto/server/refreshSession.ts | 4 +- .../atproto/server/requestAccountDelete.ts | 4 +- .../server/requestEmailConfirmation.ts | 4 +- .../com/atproto/server/requestEmailUpdate.ts | 4 +- .../atproto/server/requestPasswordReset.ts | 4 +- .../com/atproto/server/reserveSigningKey.ts | 4 +- .../types/com/atproto/server/resetPassword.ts | 4 +- .../com/atproto/server/revokeAppPassword.ts | 4 +- .../types/com/atproto/server/updateEmail.ts | 4 +- .../lexicon/types/com/atproto/sync/defs.ts | 4 +- .../lexicon/types/com/atproto/sync/getBlob.ts | 4 +- .../types/com/atproto/sync/getBlocks.ts | 4 +- .../types/com/atproto/sync/getCheckout.ts | 4 +- .../lexicon/types/com/atproto/sync/getHead.ts | 4 +- .../types/com/atproto/sync/getHostStatus.ts | 4 +- .../types/com/atproto/sync/getLatestCommit.ts | 4 +- .../types/com/atproto/sync/getRecord.ts | 4 +- .../lexicon/types/com/atproto/sync/getRepo.ts | 4 +- .../types/com/atproto/sync/getRepoStatus.ts | 4 +- .../types/com/atproto/sync/listBlobs.ts | 4 +- .../types/com/atproto/sync/listHosts.ts | 4 +- .../types/com/atproto/sync/listRepos.ts | 4 +- .../com/atproto/sync/listReposByCollection.ts | 4 +- .../types/com/atproto/sync/notifyOfUpdate.ts | 4 +- .../types/com/atproto/sync/requestCrawl.ts | 4 +- .../types/com/atproto/sync/subscribeRepos.ts | 4 +- .../com/atproto/temp/addReservedHandle.ts | 4 +- .../atproto/temp/checkHandleAvailability.ts | 4 +- .../com/atproto/temp/checkSignupQueue.ts | 4 +- .../com/atproto/temp/dereferenceScope.ts | 4 +- .../types/com/atproto/temp/fetchLabels.ts | 4 +- .../atproto/temp/requestPhoneVerification.ts | 4 +- .../atproto/temp/revokeAccountCredentials.ts | 4 +- .../ozone/communication/createTemplate.ts | 4 +- .../types/tools/ozone/communication/defs.ts | 4 +- .../ozone/communication/deleteTemplate.ts | 4 +- .../ozone/communication/listTemplates.ts | 4 +- .../ozone/communication/updateTemplate.ts | 4 +- .../tools/ozone/hosting/getAccountHistory.ts | 4 +- .../moderation/cancelScheduledActions.ts | 4 +- .../types/tools/ozone/moderation/defs.ts | 4 +- .../types/tools/ozone/moderation/emitEvent.ts | 4 +- .../ozone/moderation/getAccountTimeline.ts | 4 +- .../types/tools/ozone/moderation/getEvent.ts | 4 +- .../types/tools/ozone/moderation/getRecord.ts | 4 +- .../tools/ozone/moderation/getRecords.ts | 4 +- .../types/tools/ozone/moderation/getRepo.ts | 4 +- .../ozone/moderation/getReporterStats.ts | 4 +- .../types/tools/ozone/moderation/getRepos.ts | 4 +- .../tools/ozone/moderation/getSubjects.ts | 4 +- .../ozone/moderation/listScheduledActions.ts | 4 +- .../tools/ozone/moderation/queryEvents.ts | 4 +- .../tools/ozone/moderation/queryStatuses.ts | 4 +- .../tools/ozone/moderation/scheduleAction.ts | 4 +- .../tools/ozone/moderation/searchRepos.ts | 4 +- .../tools/ozone/queue/assignModerator.ts | 4 +- .../types/tools/ozone/queue/createQueue.ts | 4 +- .../lexicon/types/tools/ozone/queue/defs.ts | 4 +- .../types/tools/ozone/queue/deleteQueue.ts | 4 +- .../types/tools/ozone/queue/getAssignments.ts | 4 +- .../types/tools/ozone/queue/listQueues.ts | 4 +- .../types/tools/ozone/queue/routeReports.ts | 4 +- .../tools/ozone/queue/unassignModerator.ts | 4 +- .../types/tools/ozone/queue/updateQueue.ts | 4 +- .../tools/ozone/report/assignModerator.ts | 4 +- .../tools/ozone/report/createActivity.ts | 4 +- .../lexicon/types/tools/ozone/report/defs.ts | 4 +- .../tools/ozone/report/getAssignments.ts | 4 +- .../tools/ozone/report/getHistoricalStats.ts | 4 +- .../tools/ozone/report/getLatestReport.ts | 4 +- .../types/tools/ozone/report/getLiveStats.ts | 4 +- .../types/tools/ozone/report/getReport.ts | 4 +- .../tools/ozone/report/listActivities.ts | 4 +- .../types/tools/ozone/report/queryReports.ts | 4 +- .../types/tools/ozone/report/reassignQueue.ts | 4 +- .../types/tools/ozone/report/refreshStats.ts | 4 +- .../tools/ozone/report/unassignModerator.ts | 4 +- .../types/tools/ozone/safelink/addRule.ts | 4 +- .../types/tools/ozone/safelink/defs.ts | 4 +- .../types/tools/ozone/safelink/queryEvents.ts | 4 +- .../types/tools/ozone/safelink/queryRules.ts | 4 +- .../types/tools/ozone/safelink/removeRule.ts | 4 +- .../types/tools/ozone/safelink/updateRule.ts | 4 +- .../types/tools/ozone/server/getConfig.ts | 4 +- .../types/tools/ozone/set/addValues.ts | 4 +- .../src/lexicon/types/tools/ozone/set/defs.ts | 4 +- .../types/tools/ozone/set/deleteSet.ts | 4 +- .../types/tools/ozone/set/deleteValues.ts | 4 +- .../types/tools/ozone/set/getValues.ts | 4 +- .../types/tools/ozone/set/querySets.ts | 4 +- .../types/tools/ozone/set/upsertSet.ts | 4 +- .../lexicon/types/tools/ozone/setting/defs.ts | 4 +- .../types/tools/ozone/setting/listOptions.ts | 4 +- .../tools/ozone/setting/removeOptions.ts | 4 +- .../types/tools/ozone/setting/upsertOption.ts | 4 +- .../types/tools/ozone/signature/defs.ts | 4 +- .../tools/ozone/signature/findCorrelation.ts | 4 +- .../ozone/signature/findRelatedAccounts.ts | 4 +- .../tools/ozone/signature/searchAccounts.ts | 4 +- .../types/tools/ozone/team/addMember.ts | 4 +- .../lexicon/types/tools/ozone/team/defs.ts | 4 +- .../types/tools/ozone/team/deleteMember.ts | 4 +- .../types/tools/ozone/team/listMembers.ts | 4 +- .../types/tools/ozone/team/updateMember.ts | 4 +- .../types/tools/ozone/verification/defs.ts | 4 +- .../ozone/verification/grantVerifications.ts | 4 +- .../ozone/verification/listVerifications.ts | 4 +- .../ozone/verification/revokeVerifications.ts | 4 +- .../ozone/src/mod-service/expiring-tags.ts | 4 +- packages/ozone/src/mod-service/index.ts | 57 +- packages/ozone/src/mod-service/profile.ts | 6 +- packages/ozone/src/mod-service/report.ts | 8 +- packages/ozone/src/mod-service/status.ts | 12 +- packages/ozone/src/mod-service/strike.ts | 2 +- packages/ozone/src/mod-service/subject.ts | 14 +- packages/ozone/src/mod-service/types.ts | 8 +- packages/ozone/src/mod-service/util.ts | 6 +- packages/ozone/src/mod-service/views.ts | 32 +- packages/ozone/src/queue/service.ts | 14 +- packages/ozone/src/report/activity.ts | 6 +- packages/ozone/src/report/reassign.ts | 4 +- packages/ozone/src/report/stats.ts | 10 +- packages/ozone/src/report/views.ts | 14 +- packages/ozone/src/safelink/service.ts | 6 +- .../ozone/src/scheduled-action/service.ts | 12 +- packages/ozone/src/scheduled-action/types.ts | 2 +- packages/ozone/src/sequencer/index.ts | 4 +- packages/ozone/src/sequencer/outbox.ts | 2 +- packages/ozone/src/sequencer/sequencer.ts | 12 +- packages/ozone/src/set/service.ts | 8 +- packages/ozone/src/setting/service.ts | 8 +- packages/ozone/src/setting/validators.ts | 4 +- .../ozone/src/tag-service/content-tagger.ts | 6 +- .../ozone/src/tag-service/embed-tagger.ts | 6 +- packages/ozone/src/tag-service/index.ts | 14 +- .../ozone/src/tag-service/language-tagger.ts | 6 +- packages/ozone/src/tag-service/util.ts | 2 +- packages/ozone/src/team/index.ts | 14 +- packages/ozone/src/util.ts | 2 +- packages/ozone/src/verification/issuer.ts | 4 +- packages/ozone/src/verification/service.ts | 6 +- packages/ozone/src/verification/util.ts | 11 +- packages/ozone/tests/3p-labeler.test.ts | 4 +- .../account-strikes.test.ts.snap | 72 +- .../__snapshots__/age-assurance.test.ts.snap | 26 +- .../__snapshots__/blob-divert.test.ts.snap | 104 +- .../get-account-timeline.test.ts.snap | 16 +- .../__snapshots__/get-record.test.ts.snap | 136 +- .../__snapshots__/get-records.test.ts.snap | 92 +- .../tests/__snapshots__/get-repo.test.ts.snap | 44 +- .../__snapshots__/get-repos.test.ts.snap | 66 +- .../get-starter-pack.test.ts.snap | 282 +- .../__snapshots__/get-subjects.test.ts.snap | 216 +- .../moderation-events.test.ts.snap | 158 +- .../moderation-statuses.test.ts.snap | 90 +- .../__snapshots__/moderation.test.ts.snap | 32 +- .../__snapshots__/report-reason.test.ts.snap | 6 +- .../tests/__snapshots__/safelink.test.ts.snap | 38 +- .../scheduled-action.test.ts.snap | 22 +- .../tests/__snapshots__/sets.test.ts.snap | 14 +- .../tests/__snapshots__/settings.test.ts.snap | 20 +- .../tests/__snapshots__/team.test.ts.snap | 128 +- .../verification-listener.test.ts.snap | 70 +- .../__snapshots__/verification.test.ts.snap | 142 +- packages/ozone/tests/_util.ts | 6 +- packages/ozone/tests/account-strikes.test.ts | 6 +- .../tests/ack-all-subjects-of-account.test.ts | 6 +- packages/ozone/tests/age-assurance.test.ts | 2 +- .../tests/communication-templates.test.ts | 2 +- packages/ozone/tests/content-tagger.test.ts | 4 +- packages/ozone/tests/db.test.ts | 2 +- packages/ozone/tests/expiring-label.test.ts | 2 +- packages/ozone/tests/expiring-tags.test.ts | 4 +- .../ozone/tests/get-account-timeline.test.ts | 6 +- packages/ozone/tests/get-config.test.ts | 4 +- packages/ozone/tests/get-lists.test.ts | 4 +- packages/ozone/tests/get-record.test.ts | 6 +- packages/ozone/tests/get-records.test.ts | 6 +- packages/ozone/tests/get-repo.test.ts | 6 +- packages/ozone/tests/get-report.test.ts | 4 +- packages/ozone/tests/get-repos.test.ts | 6 +- packages/ozone/tests/get-starter-pack.test.ts | 6 +- packages/ozone/tests/get-subjects.test.ts | 6 +- .../ozone/tests/moderation-appeals.test.ts | 4 +- .../ozone/tests/moderation-events.test.ts | 8 +- .../tests/moderation-status-tags.test.ts | 2 +- .../ozone/tests/moderation-statuses.test.ts | 10 +- packages/ozone/tests/moderation.test.ts | 14 +- packages/ozone/tests/protected-tags.test.ts | 4 +- packages/ozone/tests/query-labels.test.ts | 10 +- packages/ozone/tests/query-reports.test.ts | 4 +- packages/ozone/tests/queue-assignment.test.ts | 2 +- packages/ozone/tests/queue-router.test.ts | 2 +- packages/ozone/tests/queues.test.ts | 2 +- .../tests/record-and-account-events.test.ts | 10 +- packages/ozone/tests/repo-search.test.ts | 6 +- packages/ozone/tests/report-action.test.ts | 2 +- packages/ozone/tests/report-activity.test.ts | 4 +- .../ozone/tests/report-assignment.test.ts | 2 +- packages/ozone/tests/report-muting.test.ts | 2 +- packages/ozone/tests/report-reason.test.ts | 6 +- .../ozone/tests/report-reassign-queue.test.ts | 4 +- packages/ozone/tests/report-routing.test.ts | 2 +- packages/ozone/tests/report-stats.test.ts | 4 +- packages/ozone/tests/safelink.test.ts | 4 +- .../tests/scheduled-action-processor.test.ts | 6 +- packages/ozone/tests/scheduled-action.test.ts | 4 +- packages/ozone/tests/sequencer.test.ts | 6 +- packages/ozone/tests/server.test.ts | 4 +- packages/ozone/tests/sets.test.ts | 4 +- packages/ozone/tests/settings.test.ts | 6 +- .../tests/strike-expiry-processor.test.ts | 4 +- .../tests/subject-priority-score.test.ts | 2 +- packages/ozone/tests/team.test.ts | 2 +- .../ozone/tests/verification-listener.test.ts | 2 +- packages/ozone/tests/verification.test.ts | 2 +- .../jest.config.js => pds/jest.config.cjs} | 4 +- packages/pds/jest.config.js | 13 - packages/pds/package.json | 2 +- .../src/account-manager/account-manager.ts | 32 +- packages/pds/src/account-manager/db/index.ts | 8 +- .../005-oauth-account-management.ts | 2 +- .../account-manager/db/migrations/index.ts | 14 +- .../db/schema/account-device.ts | 2 +- .../db/schema/authorization-request.ts | 2 +- .../db/schema/authorized-client.ts | 2 +- .../src/account-manager/db/schema/device.ts | 2 +- .../src/account-manager/db/schema/index.ts | 54 +- .../src/account-manager/db/schema/lexicon.ts | 2 +- .../src/account-manager/db/schema/token.ts | 2 +- .../account-manager/helpers/account-device.ts | 6 +- .../src/account-manager/helpers/account.ts | 4 +- .../pds/src/account-manager/helpers/auth.ts | 6 +- .../helpers/authorization-request.ts | 4 +- .../helpers/authorized-client.ts | 4 +- .../pds/src/account-manager/helpers/device.ts | 4 +- .../account-manager/helpers/email-token.ts | 4 +- .../pds/src/account-manager/helpers/invite.ts | 4 +- .../src/account-manager/helpers/lexicon.ts | 4 +- .../src/account-manager/helpers/password.ts | 4 +- .../pds/src/account-manager/helpers/repo.ts | 2 +- .../pds/src/account-manager/helpers/token.ts | 6 +- .../helpers/used-refresh-token.ts | 2 +- .../pds/src/account-manager/oauth-store.ts | 36 +- .../pds/src/actor-store/actor-store-reader.ts | 12 +- .../src/actor-store/actor-store-resources.ts | 2 +- .../src/actor-store/actor-store-transactor.ts | 10 +- .../pds/src/actor-store/actor-store-writer.ts | 2 +- packages/pds/src/actor-store/actor-store.ts | 18 +- packages/pds/src/actor-store/blob/reader.ts | 4 +- .../pds/src/actor-store/blob/transactor.ts | 10 +- packages/pds/src/actor-store/db/index.ts | 8 +- .../src/actor-store/db/migrations/index.ts | 2 +- .../pds/src/actor-store/db/schema/index.ts | 28 +- packages/pds/src/actor-store/migrate.ts | 2 +- .../pds/src/actor-store/preference/reader.ts | 8 +- .../src/actor-store/preference/transactor.ts | 4 +- packages/pds/src/actor-store/record/reader.ts | 6 +- .../pds/src/actor-store/record/transactor.ts | 6 +- packages/pds/src/actor-store/repo/reader.ts | 10 +- .../src/actor-store/repo/sql-repo-reader.ts | 4 +- .../actor-store/repo/sql-repo-transactor.ts | 4 +- .../pds/src/actor-store/repo/transactor.ts | 16 +- .../src/api/app/bsky/actor/getPreferences.ts | 6 +- .../pds/src/api/app/bsky/actor/getProfile.ts | 6 +- .../pds/src/api/app/bsky/actor/getProfiles.ts | 6 +- packages/pds/src/api/app/bsky/actor/index.ts | 10 +- .../src/api/app/bsky/actor/putPreferences.ts | 8 +- .../src/api/app/bsky/feed/getActorLikes.ts | 6 +- .../src/api/app/bsky/feed/getAuthorFeed.ts | 6 +- packages/pds/src/api/app/bsky/feed/getFeed.ts | 4 +- .../src/api/app/bsky/feed/getPostThread.ts | 6 +- .../pds/src/api/app/bsky/feed/getTimeline.ts | 6 +- packages/pds/src/api/app/bsky/feed/index.ts | 12 +- packages/pds/src/api/app/bsky/index.ts | 8 +- .../src/api/app/bsky/notification/index.ts | 4 +- .../api/app/bsky/notification/registerPush.ts | 6 +- .../pds/src/api/app/bsky/util/resolver.ts | 2 +- .../api/com/atproto/admin/deleteAccount.ts | 4 +- .../atproto/admin/disableAccountInvites.ts | 2 +- .../com/atproto/admin/disableInviteCodes.ts | 2 +- .../com/atproto/admin/enableAccountInvites.ts | 2 +- .../api/com/atproto/admin/getAccountInfo.ts | 4 +- .../api/com/atproto/admin/getAccountInfos.ts | 4 +- .../api/com/atproto/admin/getInviteCodes.ts | 6 +- .../api/com/atproto/admin/getSubjectStatus.ts | 2 +- .../pds/src/api/com/atproto/admin/index.ts | 28 +- .../src/api/com/atproto/admin/sendEmail.ts | 2 +- .../com/atproto/admin/updateAccountEmail.ts | 2 +- .../com/atproto/admin/updateAccountHandle.ts | 4 +- .../atproto/admin/updateAccountPassword.ts | 4 +- .../com/atproto/admin/updateSubjectStatus.ts | 2 +- .../pds/src/api/com/atproto/admin/util.ts | 4 +- .../identity/getRecommendedDidCredentials.ts | 2 +- .../pds/src/api/com/atproto/identity/index.ts | 14 +- .../identity/requestPlcOperationSignature.ts | 4 +- .../api/com/atproto/identity/resolveHandle.ts | 4 +- .../com/atproto/identity/signPlcOperation.ts | 4 +- .../atproto/identity/submitPlcOperation.ts | 4 +- .../api/com/atproto/identity/updateHandle.ts | 4 +- packages/pds/src/api/com/atproto/index.ts | 16 +- .../com/atproto/moderation/createReport.ts | 6 +- .../src/api/com/atproto/moderation/index.ts | 4 +- .../src/api/com/atproto/repo/applyWrites.ts | 6 +- .../src/api/com/atproto/repo/createRecord.ts | 6 +- .../src/api/com/atproto/repo/deleteRecord.ts | 6 +- .../src/api/com/atproto/repo/describeRepo.ts | 4 +- .../pds/src/api/com/atproto/repo/getRecord.ts | 4 +- .../src/api/com/atproto/repo/importRepo.ts | 4 +- .../pds/src/api/com/atproto/repo/index.ts | 22 +- .../api/com/atproto/repo/listMissingBlobs.ts | 2 +- .../src/api/com/atproto/repo/listRecords.ts | 2 +- .../pds/src/api/com/atproto/repo/putRecord.ts | 8 +- .../src/api/com/atproto/repo/uploadBlob.ts | 2 +- .../api/com/atproto/server/activateAccount.ts | 6 +- .../com/atproto/server/checkAccountStatus.ts | 4 +- .../api/com/atproto/server/confirmEmail.ts | 2 +- .../api/com/atproto/server/createAccount.ts | 12 +- .../com/atproto/server/createAppPassword.ts | 4 +- .../com/atproto/server/createInviteCode.ts | 4 +- .../com/atproto/server/createInviteCodes.ts | 4 +- .../api/com/atproto/server/createSession.ts | 8 +- .../com/atproto/server/deactivateAccount.ts | 4 +- .../api/com/atproto/server/deleteAccount.ts | 6 +- .../api/com/atproto/server/deleteSession.ts | 2 +- .../api/com/atproto/server/describeServer.ts | 2 +- .../atproto/server/getAccountInviteCodes.ts | 8 +- .../api/com/atproto/server/getServiceAuth.ts | 9 +- .../src/api/com/atproto/server/getSession.ts | 10 +- .../pds/src/api/com/atproto/server/index.ts | 52 +- .../com/atproto/server/listAppPasswords.ts | 2 +- .../api/com/atproto/server/refreshSession.ts | 8 +- .../atproto/server/requestAccountDelete.ts | 4 +- .../server/requestEmailConfirmation.ts | 2 +- .../com/atproto/server/requestEmailUpdate.ts | 2 +- .../atproto/server/requestPasswordReset.ts | 2 +- .../com/atproto/server/reserveSigningKey.ts | 2 +- .../api/com/atproto/server/resetPassword.ts | 4 +- .../com/atproto/server/revokeAppPassword.ts | 2 +- .../src/api/com/atproto/server/updateEmail.ts | 6 +- .../pds/src/api/com/atproto/server/util.ts | 6 +- .../atproto/sync/deprecated/getCheckout.ts | 8 +- .../com/atproto/sync/deprecated/getHead.ts | 6 +- .../pds/src/api/com/atproto/sync/getBlob.ts | 8 +- .../pds/src/api/com/atproto/sync/getBlocks.ts | 6 +- .../api/com/atproto/sync/getLatestCommit.ts | 6 +- .../pds/src/api/com/atproto/sync/getRecord.ts | 8 +- .../pds/src/api/com/atproto/sync/getRepo.ts | 10 +- .../src/api/com/atproto/sync/getRepoStatus.ts | 6 +- .../pds/src/api/com/atproto/sync/index.ts | 24 +- .../pds/src/api/com/atproto/sync/listBlobs.ts | 8 +- .../pds/src/api/com/atproto/sync/listRepos.ts | 6 +- .../api/com/atproto/sync/subscribeRepos.ts | 6 +- packages/pds/src/api/com/atproto/sync/util.ts | 4 +- .../api/com/atproto/temp/checkSignupQueue.ts | 4 +- .../pds/src/api/com/atproto/temp/index.ts | 4 +- packages/pds/src/api/index.ts | 6 +- packages/pds/src/auth-output.ts | 2 +- packages/pds/src/auth-verifier.ts | 14 +- packages/pds/src/background.ts | 2 +- packages/pds/src/basic-routes.ts | 2 +- packages/pds/src/config/config.ts | 2 +- packages/pds/src/config/index.ts | 6 +- packages/pds/src/config/secrets.ts | 2 +- packages/pds/src/context.ts | 38 +- packages/pds/src/db/db.ts | 4 +- packages/pds/src/db/index.ts | 8 +- packages/pds/src/db/pagination.ts | 2 +- packages/pds/src/did-cache/db/index.ts | 8 +- packages/pds/src/did-cache/index.ts | 6 +- packages/pds/src/disk-blobstore.ts | 2 +- packages/pds/src/error.ts | 2 +- packages/pds/src/handle/index.ts | 2 +- packages/pds/src/image/image-url-builder.ts | 2 +- packages/pds/src/index.ts | 40 +- packages/pds/src/mailer/index.ts | 6 +- packages/pds/src/mailer/moderation.ts | 4 +- packages/pds/src/mailer/templates.ts | 10 +- packages/pds/src/pipethrough.ts | 6 +- packages/pds/src/read-after-write/index.ts | 6 +- packages/pds/src/read-after-write/types.ts | 2 +- packages/pds/src/read-after-write/util.ts | 8 +- packages/pds/src/read-after-write/viewer.ts | 10 +- packages/pds/src/redis.ts | 2 +- packages/pds/src/repo/index.ts | 4 +- packages/pds/src/repo/prepare.ts | 4 +- packages/pds/src/scripts/index.ts | 10 +- packages/pds/src/scripts/publish-identity.ts | 4 +- packages/pds/src/scripts/rebuild-repo.ts | 6 +- packages/pds/src/scripts/rotate-keys.ts | 10 +- .../src/scripts/sequencer-recovery/index.ts | 6 +- .../scripts/sequencer-recovery/recoverer.ts | 21 +- .../scripts/sequencer-recovery/recovery-db.ts | 2 +- .../sequencer-recovery/repair-repos.ts | 8 +- packages/pds/src/sequencer/db/index.ts | 8 +- .../pds/src/sequencer/db/migrations/index.ts | 2 +- packages/pds/src/sequencer/events.ts | 6 +- packages/pds/src/sequencer/index.ts | 6 +- packages/pds/src/sequencer/sequencer.ts | 14 +- packages/pds/src/well-known.ts | 2 +- .../takedown-appeal.test.ts.snap | 16 +- packages/pds/tests/account-deletion.test.ts | 10 +- packages/pds/tests/account.test.ts | 4 +- packages/pds/tests/auth.test.ts | 2 +- packages/pds/tests/blob-deletes.test.ts | 2 +- packages/pds/tests/create-post.test.ts | 2 +- packages/pds/tests/crud.test.ts | 4 +- packages/pds/tests/db.test.ts | 2 +- packages/pds/tests/email-confirmation.test.ts | 4 +- packages/pds/tests/entryway-mock.ts | 5 +- packages/pds/tests/entryway.test.ts | 2 +- packages/pds/tests/file-uploads.test.ts | 8 +- packages/pds/tests/handle-validation.test.ts | 2 +- packages/pds/tests/handles.test.ts | 4 +- packages/pds/tests/invite-codes.test.ts | 4 +- packages/pds/tests/moderation.test.ts | 2 +- packages/pds/tests/moderator-auth.test.ts | 2 +- packages/pds/tests/plc-operations.test.ts | 2 +- packages/pds/tests/preferences.test.ts | 2 +- .../proxied/__snapshots__/admin.test.ts.snap | 242 +- .../__snapshots__/feedgen.test.ts.snap | 112 +- .../proxied/__snapshots__/views.test.ts.snap | 2186 +++++----- packages/pds/tests/proxied/admin.test.ts | 4 +- packages/pds/tests/proxied/feedgen.test.ts | 4 +- packages/pds/tests/proxied/notif.test.ts | 2 +- packages/pds/tests/proxied/procedures.test.ts | 2 +- .../pds/tests/proxied/proxy-catchall.test.ts | 2 +- .../pds/tests/proxied/proxy-header.test.ts | 2 +- .../tests/proxied/read-after-write.test.ts | 2 +- packages/pds/tests/proxied/views.test.ts | 4 +- packages/pds/tests/races.test.ts | 4 +- packages/pds/tests/rate-limits.test.ts | 2 +- packages/pds/tests/recovery.test.ts | 2 +- packages/pds/tests/seeds/basic.ts | 2 +- packages/pds/tests/seeds/likes.ts | 2 +- packages/pds/tests/seeds/reposts.ts | 2 +- packages/pds/tests/sequencer.test.ts | 8 +- packages/pds/tests/server.test.ts | 6 +- packages/pds/tests/sync/list.test.ts | 2 +- .../pds/tests/sync/subscribe-repos.test.ts | 6 +- packages/pds/tests/takedown-appeal.test.ts | 2 +- .../repo/{jest.config.js => jest.config.cjs} | 2 +- packages/repo/package.json | 2 +- packages/repo/src/car.ts | 6 +- packages/repo/src/data-diff.ts | 6 +- packages/repo/src/index.ts | 22 +- packages/repo/src/mst/diff.ts | 6 +- packages/repo/src/mst/index.ts | 8 +- packages/repo/src/mst/mst.ts | 14 +- packages/repo/src/mst/util.ts | 4 +- packages/repo/src/mst/walker.ts | 2 +- packages/repo/src/parse.ts | 6 +- packages/repo/src/readable-repo.ts | 14 +- packages/repo/src/repo.ts | 18 +- packages/repo/src/storage/index.ts | 8 +- .../repo/src/storage/memory-blockstore.ts | 8 +- .../repo/src/storage/readable-blockstore.ts | 8 +- packages/repo/src/storage/sync-storage.ts | 4 +- packages/repo/src/storage/types.ts | 4 +- packages/repo/src/sync/consumer.ts | 20 +- packages/repo/src/sync/index.ts | 4 +- packages/repo/src/sync/provider.ts | 14 +- packages/repo/src/types.ts | 4 +- packages/repo/src/util.ts | 4 +- packages/repo/tests/_util.ts | 8 +- packages/repo/tests/car.test.ts | 2 +- packages/repo/tests/commit-data.test.ts | 9 +- packages/repo/tests/commit-proofs.test.ts | 6 +- packages/repo/tests/covering-proofs.test.ts | 8 +- packages/repo/tests/mst.test.ts | 10 +- packages/repo/tests/proofs.test.ts | 8 +- packages/repo/tests/repo.test.ts | 8 +- packages/repo/tests/sync.test.ts | 8 +- .../sync/{jest.config.js => jest.config.cjs} | 2 +- packages/sync/package.json | 2 +- packages/sync/src/firehose/index.ts | 6 +- packages/sync/src/index.ts | 6 +- packages/sync/src/runner/index.ts | 6 +- packages/sync/src/runner/memory-runner.ts | 4 +- packages/syntax/tests/aturi-string.test.ts | 6 +- packages/syntax/tests/aturi.test.ts | 2 +- packages/syntax/tests/datetime.test.ts | 2 +- packages/syntax/tests/did.test.ts | 6 +- packages/syntax/tests/handle.test.ts | 2 +- packages/syntax/tests/language.test.ts | 2 +- packages/syntax/tests/nsid.test.ts | 2 +- packages/syntax/tests/recordkey.test.ts | 2 +- packages/syntax/tests/tid.test.ts | 2 +- packages/tap/src/channel.ts | 4 +- packages/tap/src/client.ts | 6 +- packages/tap/src/index.ts | 12 +- packages/tap/src/lex-indexer.ts | 4 +- packages/tap/src/simple-indexer.ts | 4 +- packages/tap/tests/_util.ts | 4 +- packages/tap/tests/channel.test.ts | 6 +- packages/tap/tests/client.test.ts | 2 +- packages/tap/tests/lex-indexer.test.ts | 6 +- packages/tap/tests/simple-indexer.test.ts | 12 +- packages/tap/tests/util.test.ts | 2 +- .../{jest.config.js => jest.config.cjs} | 2 +- packages/ws-client/package.json | 2 +- packages/ws-client/tests/keepalive.test.ts | 2 +- .../{jest.config.js => jest.config.cjs} | 2 +- packages/xrpc-server/package.json | 2 +- packages/xrpc-server/src/auth.ts | 2 +- packages/xrpc-server/src/index.ts | 16 +- packages/xrpc-server/src/rate-limiter.ts | 4 +- packages/xrpc-server/src/server.ts | 17 +- packages/xrpc-server/src/stream/frames.ts | 4 +- packages/xrpc-server/src/stream/index.ts | 10 +- packages/xrpc-server/src/stream/server.ts | 4 +- packages/xrpc-server/src/stream/stream.ts | 2 +- .../xrpc-server/src/stream/subscription.ts | 2 +- packages/xrpc-server/src/types.ts | 4 +- packages/xrpc-server/src/util.ts | 4 +- packages/xrpc-server/tests/_util.ts | 2 +- packages/xrpc-server/tests/auth.test.ts | 4 +- packages/xrpc-server/tests/errors.test.ts | 4 +- packages/xrpc-server/tests/frames.test.ts | 2 +- packages/xrpc-server/tests/ipld.test.ts | 4 +- packages/xrpc-server/tests/parameters.test.ts | 4 +- packages/xrpc-server/tests/parsing.test.ts | 2 +- packages/xrpc-server/tests/procedures.test.ts | 4 +- packages/xrpc-server/tests/queries.test.ts | 4 +- .../xrpc-server/tests/rate-limiter.test.ts | 6 +- packages/xrpc-server/tests/responses.test.ts | 4 +- packages/xrpc-server/tests/stream.test.ts | 2 +- .../xrpc-server/tests/subscriptions.test.ts | 12 +- packages/xrpc/src/client.ts | 6 +- packages/xrpc/src/fetch-handler.ts | 4 +- packages/xrpc/src/index.ts | 12 +- packages/xrpc/src/util.ts | 2 +- packages/xrpc/src/xrpc-client.ts | 6 +- pnpm-lock.yaml | 2215 +++++++---- jest.setup.ts => test.setup.ts | 0 vitest.config.ts | 7 +- 1778 files changed, 16875 insertions(+), 15899 deletions(-) create mode 100644 .changeset/bumpy-kiwis-wish.md rename jest.config.js => jest.config.cjs (51%) rename packages/api/{jest.config.js => jest.config.cjs} (84%) delete mode 100644 packages/bsky/jest.config.js create mode 100644 packages/bsky/vitest.config.ts rename packages/bsync/{jest.config.js => jest.config.cjs} (80%) rename packages/common-web/{jest.config.js => jest.config.cjs} (80%) rename packages/common/{jest.config.js => jest.config.cjs} (80%) rename packages/crypto/{jest.config.js => jest.config.cjs} (80%) create mode 100644 packages/did/jest.config.cjs rename packages/identity/{jest.config.js => jest.config.cjs} (84%) delete mode 100644 packages/lexicon-resolver/jest.config.js create mode 100644 packages/lexicon-resolver/vitest.config.ts rename packages/lexicon/{jest.config.js => jest.config.cjs} (80%) rename packages/oauth/oauth-scopes/{jest.config.js => jest.config.cjs} (100%) rename packages/ozone/{jest.config.js => jest.config.cjs} (86%) rename packages/{did/jest.config.js => pds/jest.config.cjs} (66%) delete mode 100644 packages/pds/jest.config.js rename packages/repo/{jest.config.js => jest.config.cjs} (80%) rename packages/sync/{jest.config.js => jest.config.cjs} (81%) rename packages/ws-client/{jest.config.js => jest.config.cjs} (84%) rename packages/xrpc-server/{jest.config.js => jest.config.cjs} (84%) rename jest.setup.ts => test.setup.ts (100%) diff --git a/.changeset/bumpy-kiwis-wish.md b/.changeset/bumpy-kiwis-wish.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/bumpy-kiwis-wish.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.eslintrc b/.eslintrc index 97c197847e8..c429553f9db 100644 --- a/.eslintrc +++ b/.eslintrc @@ -63,7 +63,7 @@ }, "overrides": [ { - "files": ["jest.config.js"], + "files": ["jest.config.cjs"], "env": { "commonjs": true } }, { @@ -71,7 +71,7 @@ "env": { "node": true } }, { - "files": ["jest.setup.js"], + "files": ["test.setup.ts"], "env": { "jest": true } }, { diff --git a/jest.config.js b/jest.config.cjs similarity index 51% rename from jest.config.js rename to jest.config.cjs index d0126bea35b..be8cbbf78c1 100644 --- a/jest.config.js +++ b/jest.config.cjs @@ -1,4 +1,4 @@ /** @type {import('jest').Config} */ module.exports = { - projects: ['/packages/*/jest.config.js'], + projects: ['/packages/*/jest.config.cjs'], } diff --git a/package.json b/package.json index fed59c78762..9f1372cfda8 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-n": "^17.15.0", "eslint-plugin-prettier": "^5.1.3", - "jest": "^28.1.2", + "jest": "^30.0.0", "node-gyp": "^9.3.1", "pino-pretty": "^9.1.0", "prettier": "^3.2.5", diff --git a/packages/api/jest.config.js b/packages/api/jest.config.cjs similarity index 84% rename from packages/api/jest.config.js rename to packages/api/jest.config.cjs index d6611c66952..fc770491a2c 100644 --- a/packages/api/jest.config.js +++ b/packages/api/jest.config.cjs @@ -3,7 +3,7 @@ module.exports = { displayName: 'API', transform: { '^.+\\.ts$': '@swc/jest' }, testTimeout: 60000, - setupFiles: ['/../../jest.setup.ts'], + setupFiles: ['/../../test.setup.ts'], setupFilesAfterEnv: ['/jest.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/api/jest.setup.ts b/packages/api/jest.setup.ts index 4263aad09f4..885466688d7 100644 --- a/packages/api/jest.setup.ts +++ b/packages/api/jest.setup.ts @@ -1,5 +1,5 @@ -import { ModerationUI } from './src' -import { ModerationTestSuiteResultFlag } from './tests/util/moderation-behavior' +import { ModerationUI } from './src/index.js' +import { ModerationTestSuiteResultFlag } from './tests/util/moderation-behavior.js' expect.extend({ toBeModerationResult( diff --git a/packages/api/package.json b/packages/api/package.json index 47310625453..75959774983 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -38,7 +38,7 @@ "devDependencies": { "@atproto/lex-cli": "workspace:^", "@jest/globals": "^28.1.3", - "jest": "^28.1.2", + "jest": "^30.0.0", "prettier": "^3.2.5", "typescript": "^6.0.3" } diff --git a/packages/api/src/age-assurance.test.ts b/packages/api/src/age-assurance.test.ts index dcce59b059e..4248287decd 100644 --- a/packages/api/src/age-assurance.test.ts +++ b/packages/api/src/age-assurance.test.ts @@ -3,8 +3,8 @@ import { ageAssuranceRuleIDs, computeAgeAssuranceRegionAccess, getAgeAssuranceRegionConfig, -} from './age-assurance' -import { AppBskyAgeassuranceDefs } from './client' +} from './age-assurance.js' +import { AppBskyAgeassuranceDefs } from './client/index.js' describe('age-assurance', () => { describe('getAgeAssuranceRegionConfig', () => { diff --git a/packages/api/src/age-assurance.ts b/packages/api/src/age-assurance.ts index 25a38e8cdc1..8cb02fd2987 100644 --- a/packages/api/src/age-assurance.ts +++ b/packages/api/src/age-assurance.ts @@ -1,5 +1,5 @@ -import { AppBskyAgeassuranceDefs } from './client' -import { ids } from './client/lexicons' +import { AppBskyAgeassuranceDefs } from './client/index.js' +import { ids } from './client/lexicons.js' export type AgeAssuranceRuleID = Exclude< | AppBskyAgeassuranceDefs.ConfigRegionRuleDefault['$type'] diff --git a/packages/api/src/agent.ts b/packages/api/src/agent.ts index ae14fc7720f..037a41cbe20 100644 --- a/packages/api/src/agent.ts +++ b/packages/api/src/agent.ts @@ -17,20 +17,20 @@ import { ComAtprotoRepoPutRecord, ComNS, ToolsNS, -} from './client/index' -import { schemas } from './client/lexicons' -import { MutedWord, Nux } from './client/types/app/bsky/actor/defs' -import { $Typed, Un$Typed } from './client/util' -import { BSKY_LABELER_DID } from './const' -import { interpretLabelValueDefinitions } from './moderation' -import { DEFAULT_LABEL_SETTINGS } from './moderation/const/labels' +} from './client/index.js' +import { schemas } from './client/lexicons.js' +import { MutedWord, Nux } from './client/types/app/bsky/actor/defs.js' +import { $Typed, Un$Typed } from './client/util.js' +import { BSKY_LABELER_DID } from './const.js' +import { DEFAULT_LABEL_SETTINGS } from './moderation/const/labels.js' +import { interpretLabelValueDefinitions } from './moderation/index.js' import { InterpretedLabelValueDefinition, LabelPreference, ModerationPrefs, -} from './moderation/types' -import * as predicate from './predicate' -import { SessionManager } from './session-manager' +} from './moderation/types.js' +import * as predicate from './predicate.js' +import { SessionManager } from './session-manager.js' import { AtpAgentGlobalOpts, AtprotoProxy, @@ -42,14 +42,14 @@ import { asAtprotoProxy, asDid, isDid, -} from './types' +} from './types.js' import { getSavedFeedType, sanitizeMutedWordValue, savedFeedsToUriArrays, validateNux, validateSavedFeed, -} from './util' +} from './util.js' const FEED_VIEW_PREF_DEFAULTS = { hideReplies: false, diff --git a/packages/api/src/atp-agent.ts b/packages/api/src/atp-agent.ts index 05c2951daa5..74359dd5e0d 100644 --- a/packages/api/src/atp-agent.ts +++ b/packages/api/src/atp-agent.ts @@ -7,21 +7,21 @@ import { XrpcClient, errorResponseBody, } from '@atproto/xrpc' -import { Agent } from './agent' +import { Agent } from './agent.js' import { ComAtprotoServerCreateAccount, ComAtprotoServerCreateSession, ComAtprotoServerGetSession, ComAtprotoServerNS, ComAtprotoServerRefreshSession, -} from './client' -import { schemas } from './client/lexicons' -import { SessionManager } from './session-manager' +} from './client/index.js' +import { schemas } from './client/lexicons.js' +import { SessionManager } from './session-manager.js' import { AtpAgentLoginOpts, AtpPersistSessionHandler, AtpSessionData, -} from './types' +} from './types.js' const ReadableStream = globalThis.ReadableStream as | typeof globalThis.ReadableStream diff --git a/packages/api/src/bsky-agent.ts b/packages/api/src/bsky-agent.ts index 5091101afcf..fbd5ee456dd 100644 --- a/packages/api/src/bsky-agent.ts +++ b/packages/api/src/bsky-agent.ts @@ -1,4 +1,4 @@ -import { AtpAgent } from './atp-agent' +import { AtpAgent } from './atp-agent.js' /** @deprecated use {@link AtpAgent} instead */ export class BskyAgent extends AtpAgent { diff --git a/packages/api/src/client/types/app/bsky/actor/defs.ts b/packages/api/src/client/types/app/bsky/actor/defs.ts index 31096ad6e36..f8126db0b2e 100644 --- a/packages/api/src/client/types/app/bsky/actor/defs.ts +++ b/packages/api/src/client/types/app/bsky/actor/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' import type * as AppBskyGraphDefs from '../graph/defs.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' diff --git a/packages/api/src/client/types/app/bsky/actor/getPreferences.ts b/packages/api/src/client/types/app/bsky/actor/getPreferences.ts index ca0127b208c..9342002a179 100644 --- a/packages/api/src/client/types/app/bsky/actor/getPreferences.ts +++ b/packages/api/src/client/types/app/bsky/actor/getPreferences.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/getProfile.ts b/packages/api/src/client/types/app/bsky/actor/getProfile.ts index 7c165ed9b5d..fd862cde8f1 100644 --- a/packages/api/src/client/types/app/bsky/actor/getProfile.ts +++ b/packages/api/src/client/types/app/bsky/actor/getProfile.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/getProfiles.ts b/packages/api/src/client/types/app/bsky/actor/getProfiles.ts index 93f5525732c..fc5a1505be6 100644 --- a/packages/api/src/client/types/app/bsky/actor/getProfiles.ts +++ b/packages/api/src/client/types/app/bsky/actor/getProfiles.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts b/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts index 4f286106fec..8246c2e340f 100644 --- a/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts +++ b/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/profile.ts b/packages/api/src/client/types/app/bsky/actor/profile.ts index 9adf22c7663..c1e1d1353d7 100644 --- a/packages/api/src/client/types/app/bsky/actor/profile.ts +++ b/packages/api/src/client/types/app/bsky/actor/profile.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' diff --git a/packages/api/src/client/types/app/bsky/actor/putPreferences.ts b/packages/api/src/client/types/app/bsky/actor/putPreferences.ts index 36ca14119ff..75a32988495 100644 --- a/packages/api/src/client/types/app/bsky/actor/putPreferences.ts +++ b/packages/api/src/client/types/app/bsky/actor/putPreferences.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/searchActors.ts b/packages/api/src/client/types/app/bsky/actor/searchActors.ts index 848ba3a3691..9df611a2339 100644 --- a/packages/api/src/client/types/app/bsky/actor/searchActors.ts +++ b/packages/api/src/client/types/app/bsky/actor/searchActors.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts b/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts index 51ef5f7dd5c..9c9ad7d1df5 100644 --- a/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts +++ b/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/actor/status.ts b/packages/api/src/client/types/app/bsky/actor/status.ts index c6b8c4ec17d..70468ee6722 100644 --- a/packages/api/src/client/types/app/bsky/actor/status.ts +++ b/packages/api/src/client/types/app/bsky/actor/status.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyEmbedExternal from '../embed/external.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/ageassurance/begin.ts b/packages/api/src/client/types/app/bsky/ageassurance/begin.ts index 8d47aa0f276..c56228319ed 100644 --- a/packages/api/src/client/types/app/bsky/ageassurance/begin.ts +++ b/packages/api/src/client/types/app/bsky/ageassurance/begin.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyAgeassuranceDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/ageassurance/defs.ts b/packages/api/src/client/types/app/bsky/ageassurance/defs.ts index 13a8fb73cb7..83aa31a22e4 100644 --- a/packages/api/src/client/types/app/bsky/ageassurance/defs.ts +++ b/packages/api/src/client/types/app/bsky/ageassurance/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts b/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts index b36a446cce1..2181372250e 100644 --- a/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts +++ b/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyAgeassuranceDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/ageassurance/getState.ts b/packages/api/src/client/types/app/bsky/ageassurance/getState.ts index 9028c3c1b9b..4bc5792ce8a 100644 --- a/packages/api/src/client/types/app/bsky/ageassurance/getState.ts +++ b/packages/api/src/client/types/app/bsky/ageassurance/getState.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyAgeassuranceDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts b/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts index b23dceab75b..794c41b0d41 100644 --- a/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts +++ b/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/bookmark/defs.ts b/packages/api/src/client/types/app/bsky/bookmark/defs.ts index f466b4917eb..37df96d86d6 100644 --- a/packages/api/src/client/types/app/bsky/bookmark/defs.ts +++ b/packages/api/src/client/types/app/bsky/bookmark/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' import type * as AppBskyFeedDefs from '../feed/defs.js' diff --git a/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts b/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts index 1d51167d2e3..fd150411608 100644 --- a/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts +++ b/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts b/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts index e6938e8ce59..354c424edfc 100644 --- a/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts +++ b/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyBookmarkDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/contact/defs.ts b/packages/api/src/client/types/app/bsky/contact/defs.ts index 9258135f79f..7c0ef6b5c5c 100644 --- a/packages/api/src/client/types/app/bsky/contact/defs.ts +++ b/packages/api/src/client/types/app/bsky/contact/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts b/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts index d47761c499a..e43cb13f2b7 100644 --- a/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts +++ b/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/contact/getMatches.ts b/packages/api/src/client/types/app/bsky/contact/getMatches.ts index 8cae0209e14..d88f943b4af 100644 --- a/packages/api/src/client/types/app/bsky/contact/getMatches.ts +++ b/packages/api/src/client/types/app/bsky/contact/getMatches.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts b/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts index 630e603e866..4a064aa8dcb 100644 --- a/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts +++ b/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyContactDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/contact/importContacts.ts b/packages/api/src/client/types/app/bsky/contact/importContacts.ts index d1be9a6004c..f11f2074e50 100644 --- a/packages/api/src/client/types/app/bsky/contact/importContacts.ts +++ b/packages/api/src/client/types/app/bsky/contact/importContacts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyContactDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/contact/removeData.ts b/packages/api/src/client/types/app/bsky/contact/removeData.ts index 4c240c0adc1..2a5c6162883 100644 --- a/packages/api/src/client/types/app/bsky/contact/removeData.ts +++ b/packages/api/src/client/types/app/bsky/contact/removeData.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/contact/sendNotification.ts b/packages/api/src/client/types/app/bsky/contact/sendNotification.ts index d571ffbda5e..e0fbffd98e7 100644 --- a/packages/api/src/client/types/app/bsky/contact/sendNotification.ts +++ b/packages/api/src/client/types/app/bsky/contact/sendNotification.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts b/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts index 32a9393f30a..ff8d530c158 100644 --- a/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts +++ b/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts b/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts index cf2de84208a..b5b6d0ef785 100644 --- a/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts +++ b/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/draft/createDraft.ts b/packages/api/src/client/types/app/bsky/draft/createDraft.ts index a240c3f2912..05d4d6c4c92 100644 --- a/packages/api/src/client/types/app/bsky/draft/createDraft.ts +++ b/packages/api/src/client/types/app/bsky/draft/createDraft.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyDraftDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/draft/defs.ts b/packages/api/src/client/types/app/bsky/draft/defs.ts index 7c516573d86..63601154d69 100644 --- a/packages/api/src/client/types/app/bsky/draft/defs.ts +++ b/packages/api/src/client/types/app/bsky/draft/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedPostgate from '../feed/postgate.js' import type * as AppBskyFeedThreadgate from '../feed/threadgate.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' diff --git a/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts b/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts index 6cdbe28f6eb..5539a259250 100644 --- a/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts +++ b/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/draft/getDrafts.ts b/packages/api/src/client/types/app/bsky/draft/getDrafts.ts index 4dc0be16316..8418aa3bfbd 100644 --- a/packages/api/src/client/types/app/bsky/draft/getDrafts.ts +++ b/packages/api/src/client/types/app/bsky/draft/getDrafts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyDraftDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/draft/updateDraft.ts b/packages/api/src/client/types/app/bsky/draft/updateDraft.ts index 9c15b25b9d6..07fcca574b1 100644 --- a/packages/api/src/client/types/app/bsky/draft/updateDraft.ts +++ b/packages/api/src/client/types/app/bsky/draft/updateDraft.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyDraftDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/embed/defs.ts b/packages/api/src/client/types/app/bsky/embed/defs.ts index e7a4c5410da..ce60f5c9cb6 100644 --- a/packages/api/src/client/types/app/bsky/embed/defs.ts +++ b/packages/api/src/client/types/app/bsky/embed/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/embed/external.ts b/packages/api/src/client/types/app/bsky/embed/external.ts index bf839eb9983..b757ecd7b79 100644 --- a/packages/api/src/client/types/app/bsky/embed/external.ts +++ b/packages/api/src/client/types/app/bsky/embed/external.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/embed/images.ts b/packages/api/src/client/types/app/bsky/embed/images.ts index c60d085a09e..64dfb1ef064 100644 --- a/packages/api/src/client/types/app/bsky/embed/images.ts +++ b/packages/api/src/client/types/app/bsky/embed/images.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyEmbedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/embed/record.ts b/packages/api/src/client/types/app/bsky/embed/record.ts index b0d2049802c..e3be3bbd33d 100644 --- a/packages/api/src/client/types/app/bsky/embed/record.ts +++ b/packages/api/src/client/types/app/bsky/embed/record.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' import type * as AppBskyFeedDefs from '../feed/defs.js' import type * as AppBskyGraphDefs from '../graph/defs.js' diff --git a/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts b/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts index 995b8294712..c422dbfa3d3 100644 --- a/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts +++ b/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyEmbedRecord from './record.js' import type * as AppBskyEmbedImages from './images.js' import type * as AppBskyEmbedVideo from './video.js' diff --git a/packages/api/src/client/types/app/bsky/embed/video.ts b/packages/api/src/client/types/app/bsky/embed/video.ts index 5477ccd7791..4e5eb1e6a27 100644 --- a/packages/api/src/client/types/app/bsky/embed/video.ts +++ b/packages/api/src/client/types/app/bsky/embed/video.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyEmbedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/defs.ts b/packages/api/src/client/types/app/bsky/feed/defs.ts index b4e7ccc9e37..ed7bdef7078 100644 --- a/packages/api/src/client/types/app/bsky/feed/defs.ts +++ b/packages/api/src/client/types/app/bsky/feed/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' import type * as AppBskyEmbedImages from '../embed/images.js' import type * as AppBskyEmbedVideo from '../embed/video.js' diff --git a/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts b/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts index f167cc80de0..76c13d974ce 100644 --- a/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts +++ b/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/feed/generator.ts b/packages/api/src/client/types/app/bsky/feed/generator.ts index 54cc72d7d14..6665819ff65 100644 --- a/packages/api/src/client/types/app/bsky/feed/generator.ts +++ b/packages/api/src/client/types/app/bsky/feed/generator.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyRichtextFacet from '../richtext/facet.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' diff --git a/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts b/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts index c10676588be..8f8070d3484 100644 --- a/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts +++ b/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts b/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts index d1551702ea6..d3d36b69bd3 100644 --- a/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts +++ b/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts index 6b703a26bb0..71b3e3278f1 100644 --- a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getFeed.ts b/packages/api/src/client/types/app/bsky/feed/getFeed.ts index 9ac3d5684d2..7b246fabf6e 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeed.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts b/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts index 504c61a0799..2ebc2723643 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts b/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts index 2e047ee071e..dbcd173e839 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts b/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts index 9393126efc4..99d4f9c7a17 100644 --- a/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getLikes.ts b/packages/api/src/client/types/app/bsky/feed/getLikes.ts index 62b35c74f38..7ed854bc469 100644 --- a/packages/api/src/client/types/app/bsky/feed/getLikes.ts +++ b/packages/api/src/client/types/app/bsky/feed/getLikes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getListFeed.ts b/packages/api/src/client/types/app/bsky/feed/getListFeed.ts index 3d23b1fa1be..02003bd228b 100644 --- a/packages/api/src/client/types/app/bsky/feed/getListFeed.ts +++ b/packages/api/src/client/types/app/bsky/feed/getListFeed.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getPostThread.ts b/packages/api/src/client/types/app/bsky/feed/getPostThread.ts index 60897600c44..52ccdda9fd1 100644 --- a/packages/api/src/client/types/app/bsky/feed/getPostThread.ts +++ b/packages/api/src/client/types/app/bsky/feed/getPostThread.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getPosts.ts b/packages/api/src/client/types/app/bsky/feed/getPosts.ts index b143d8df9ce..c0efda870fe 100644 --- a/packages/api/src/client/types/app/bsky/feed/getPosts.ts +++ b/packages/api/src/client/types/app/bsky/feed/getPosts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getQuotes.ts b/packages/api/src/client/types/app/bsky/feed/getQuotes.ts index eadcafd888b..c5e16a5167e 100644 --- a/packages/api/src/client/types/app/bsky/feed/getQuotes.ts +++ b/packages/api/src/client/types/app/bsky/feed/getQuotes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts b/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts index 43858f5afb4..38b900c9391 100644 --- a/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts +++ b/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts b/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts index 9e3ddd8a34f..e0b2bc9d4f5 100644 --- a/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/getTimeline.ts b/packages/api/src/client/types/app/bsky/feed/getTimeline.ts index df73779e144..95188f84fbe 100644 --- a/packages/api/src/client/types/app/bsky/feed/getTimeline.ts +++ b/packages/api/src/client/types/app/bsky/feed/getTimeline.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/like.ts b/packages/api/src/client/types/app/bsky/feed/like.ts index 2d6d9b08687..c1828114464 100644 --- a/packages/api/src/client/types/app/bsky/feed/like.ts +++ b/packages/api/src/client/types/app/bsky/feed/like.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/post.ts b/packages/api/src/client/types/app/bsky/feed/post.ts index decaa83cd6b..86824d08d2a 100644 --- a/packages/api/src/client/types/app/bsky/feed/post.ts +++ b/packages/api/src/client/types/app/bsky/feed/post.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyRichtextFacet from '../richtext/facet.js' import type * as AppBskyEmbedImages from '../embed/images.js' import type * as AppBskyEmbedVideo from '../embed/video.js' diff --git a/packages/api/src/client/types/app/bsky/feed/postgate.ts b/packages/api/src/client/types/app/bsky/feed/postgate.ts index 10ba24d8355..c5cb2a262a6 100644 --- a/packages/api/src/client/types/app/bsky/feed/postgate.ts +++ b/packages/api/src/client/types/app/bsky/feed/postgate.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/feed/repost.ts b/packages/api/src/client/types/app/bsky/feed/repost.ts index d7c0259cab8..5d2eacc85b7 100644 --- a/packages/api/src/client/types/app/bsky/feed/repost.ts +++ b/packages/api/src/client/types/app/bsky/feed/repost.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/searchPosts.ts b/packages/api/src/client/types/app/bsky/feed/searchPosts.ts index abceb89c7e9..54ea4ac4303 100644 --- a/packages/api/src/client/types/app/bsky/feed/searchPosts.ts +++ b/packages/api/src/client/types/app/bsky/feed/searchPosts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts b/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts index 720f5aa1f6b..f83ae4ff094 100644 --- a/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts +++ b/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/feed/threadgate.ts b/packages/api/src/client/types/app/bsky/feed/threadgate.ts index 8d88800c1fb..dffbef78961 100644 --- a/packages/api/src/client/types/app/bsky/feed/threadgate.ts +++ b/packages/api/src/client/types/app/bsky/feed/threadgate.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/block.ts b/packages/api/src/client/types/app/bsky/graph/block.ts index 09869a82f42..b122acfde9d 100644 --- a/packages/api/src/client/types/app/bsky/graph/block.ts +++ b/packages/api/src/client/types/app/bsky/graph/block.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/defs.ts b/packages/api/src/client/types/app/bsky/graph/defs.ts index 318f0af0f68..53391588313 100644 --- a/packages/api/src/client/types/app/bsky/graph/defs.ts +++ b/packages/api/src/client/types/app/bsky/graph/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' import type * as AppBskyActorDefs from '../actor/defs.js' import type * as AppBskyRichtextFacet from '../richtext/facet.js' diff --git a/packages/api/src/client/types/app/bsky/graph/follow.ts b/packages/api/src/client/types/app/bsky/graph/follow.ts index 5eb64dfa36f..fccf753c310 100644 --- a/packages/api/src/client/types/app/bsky/graph/follow.ts +++ b/packages/api/src/client/types/app/bsky/graph/follow.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts index 53807ce7d27..23941f7d09a 100644 --- a/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getBlocks.ts b/packages/api/src/client/types/app/bsky/graph/getBlocks.ts index 0e96a1b9003..cd01a9ae646 100644 --- a/packages/api/src/client/types/app/bsky/graph/getBlocks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getBlocks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getFollowers.ts b/packages/api/src/client/types/app/bsky/graph/getFollowers.ts index f3c46c3741a..a88c9a6a0bf 100644 --- a/packages/api/src/client/types/app/bsky/graph/getFollowers.ts +++ b/packages/api/src/client/types/app/bsky/graph/getFollowers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getFollows.ts b/packages/api/src/client/types/app/bsky/graph/getFollows.ts index 7733f0aa011..839b24fa88b 100644 --- a/packages/api/src/client/types/app/bsky/graph/getFollows.ts +++ b/packages/api/src/client/types/app/bsky/graph/getFollows.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts b/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts index d5e81f40a5d..b39a72a5054 100644 --- a/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts +++ b/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getList.ts b/packages/api/src/client/types/app/bsky/graph/getList.ts index 41030daba36..38c2346c320 100644 --- a/packages/api/src/client/types/app/bsky/graph/getList.ts +++ b/packages/api/src/client/types/app/bsky/graph/getList.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts b/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts index b4ff22dd68d..0044705f5a3 100644 --- a/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getListMutes.ts b/packages/api/src/client/types/app/bsky/graph/getListMutes.ts index dca0797c38a..99dca005b87 100644 --- a/packages/api/src/client/types/app/bsky/graph/getListMutes.ts +++ b/packages/api/src/client/types/app/bsky/graph/getListMutes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getLists.ts b/packages/api/src/client/types/app/bsky/graph/getLists.ts index 6c49fbf5556..8020a745d0d 100644 --- a/packages/api/src/client/types/app/bsky/graph/getLists.ts +++ b/packages/api/src/client/types/app/bsky/graph/getLists.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts b/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts index e497e04b89e..855b1964333 100644 --- a/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts +++ b/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getMutes.ts b/packages/api/src/client/types/app/bsky/graph/getMutes.ts index 184083c9644..e5a3efe36fe 100644 --- a/packages/api/src/client/types/app/bsky/graph/getMutes.ts +++ b/packages/api/src/client/types/app/bsky/graph/getMutes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getRelationships.ts b/packages/api/src/client/types/app/bsky/graph/getRelationships.ts index bec761df621..0bced3161db 100644 --- a/packages/api/src/client/types/app/bsky/graph/getRelationships.ts +++ b/packages/api/src/client/types/app/bsky/graph/getRelationships.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts index 8264c5d069c..2642b12f15d 100644 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts +++ b/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts index 07caa46664e..3ae48f3fb63 100644 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts index 4d4cc55e1d9..34fa0513e75 100644 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts +++ b/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts index 5eb8eca9188..360f0cdf3c1 100644 --- a/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/list.ts b/packages/api/src/client/types/app/bsky/graph/list.ts index d0013cd5e8e..a3128fab25c 100644 --- a/packages/api/src/client/types/app/bsky/graph/list.ts +++ b/packages/api/src/client/types/app/bsky/graph/list.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' import type * as AppBskyRichtextFacet from '../richtext/facet.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' diff --git a/packages/api/src/client/types/app/bsky/graph/listblock.ts b/packages/api/src/client/types/app/bsky/graph/listblock.ts index bb2bffbe53d..4874dcc4e4e 100644 --- a/packages/api/src/client/types/app/bsky/graph/listblock.ts +++ b/packages/api/src/client/types/app/bsky/graph/listblock.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/listitem.ts b/packages/api/src/client/types/app/bsky/graph/listitem.ts index a7aacfc99ee..a4c88aeecef 100644 --- a/packages/api/src/client/types/app/bsky/graph/listitem.ts +++ b/packages/api/src/client/types/app/bsky/graph/listitem.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/muteActor.ts b/packages/api/src/client/types/app/bsky/graph/muteActor.ts index 29ab4113294..fb18bbd5dbb 100644 --- a/packages/api/src/client/types/app/bsky/graph/muteActor.ts +++ b/packages/api/src/client/types/app/bsky/graph/muteActor.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/muteActorList.ts b/packages/api/src/client/types/app/bsky/graph/muteActorList.ts index d4696dfabb4..a4204091ce3 100644 --- a/packages/api/src/client/types/app/bsky/graph/muteActorList.ts +++ b/packages/api/src/client/types/app/bsky/graph/muteActorList.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/muteThread.ts b/packages/api/src/client/types/app/bsky/graph/muteThread.ts index 4417bd6bba5..6b8bd438964 100644 --- a/packages/api/src/client/types/app/bsky/graph/muteThread.ts +++ b/packages/api/src/client/types/app/bsky/graph/muteThread.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts index 8831856bb44..fa9cafe9334 100644 --- a/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/starterpack.ts b/packages/api/src/client/types/app/bsky/graph/starterpack.ts index 92af266c315..c120fe5203a 100644 --- a/packages/api/src/client/types/app/bsky/graph/starterpack.ts +++ b/packages/api/src/client/types/app/bsky/graph/starterpack.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyRichtextFacet from '../richtext/facet.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts b/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts index 3737ad71a91..a10fd9a3c71 100644 --- a/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts +++ b/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts b/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts index fb3b7380f1d..fd403150acd 100644 --- a/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts +++ b/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts b/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts index 3e1c1311229..8861d222258 100644 --- a/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts +++ b/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/graph/verification.ts b/packages/api/src/client/types/app/bsky/graph/verification.ts index 3cc74eefac1..31ec934af93 100644 --- a/packages/api/src/client/types/app/bsky/graph/verification.ts +++ b/packages/api/src/client/types/app/bsky/graph/verification.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/labeler/defs.ts b/packages/api/src/client/types/app/bsky/labeler/defs.ts index ea910bbde65..72caf1bd23a 100644 --- a/packages/api/src/client/types/app/bsky/labeler/defs.ts +++ b/packages/api/src/client/types/app/bsky/labeler/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' diff --git a/packages/api/src/client/types/app/bsky/labeler/getServices.ts b/packages/api/src/client/types/app/bsky/labeler/getServices.ts index ba24378c335..7c367c831c1 100644 --- a/packages/api/src/client/types/app/bsky/labeler/getServices.ts +++ b/packages/api/src/client/types/app/bsky/labeler/getServices.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyLabelerDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/labeler/service.ts b/packages/api/src/client/types/app/bsky/labeler/service.ts index 81e080f628a..e1d013a1fc3 100644 --- a/packages/api/src/client/types/app/bsky/labeler/service.ts +++ b/packages/api/src/client/types/app/bsky/labeler/service.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyLabelerDefs from './defs.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' diff --git a/packages/api/src/client/types/app/bsky/notification/declaration.ts b/packages/api/src/client/types/app/bsky/notification/declaration.ts index 4ef2f94bb7f..4fbb7e09e81 100644 --- a/packages/api/src/client/types/app/bsky/notification/declaration.ts +++ b/packages/api/src/client/types/app/bsky/notification/declaration.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/notification/defs.ts b/packages/api/src/client/types/app/bsky/notification/defs.ts index 7ff0a82d550..20c308e8676 100644 --- a/packages/api/src/client/types/app/bsky/notification/defs.ts +++ b/packages/api/src/client/types/app/bsky/notification/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/notification/getPreferences.ts b/packages/api/src/client/types/app/bsky/notification/getPreferences.ts index 881bf05846c..3ddbd34e22f 100644 --- a/packages/api/src/client/types/app/bsky/notification/getPreferences.ts +++ b/packages/api/src/client/types/app/bsky/notification/getPreferences.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyNotificationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts b/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts index fb26be5b5dd..5ed40355efe 100644 --- a/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts +++ b/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts b/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts index f25c2b8d4e7..c5fb891b87d 100644 --- a/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts +++ b/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/notification/listNotifications.ts b/packages/api/src/client/types/app/bsky/notification/listNotifications.ts index a6f94ac7bb2..d5ec78833e7 100644 --- a/packages/api/src/client/types/app/bsky/notification/listNotifications.ts +++ b/packages/api/src/client/types/app/bsky/notification/listNotifications.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' diff --git a/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts b/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts index 7141e1ac285..85e2e3da083 100644 --- a/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts +++ b/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyNotificationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/notification/putPreferences.ts b/packages/api/src/client/types/app/bsky/notification/putPreferences.ts index 8c102849cb5..ae5439ab4ab 100644 --- a/packages/api/src/client/types/app/bsky/notification/putPreferences.ts +++ b/packages/api/src/client/types/app/bsky/notification/putPreferences.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts b/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts index 38ddf2b2ff5..07ae037368c 100644 --- a/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts +++ b/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyNotificationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/notification/registerPush.ts b/packages/api/src/client/types/app/bsky/notification/registerPush.ts index 3fcb158a416..5d79e765648 100644 --- a/packages/api/src/client/types/app/bsky/notification/registerPush.ts +++ b/packages/api/src/client/types/app/bsky/notification/registerPush.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts b/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts index b2c0b9e9531..3910431d229 100644 --- a/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts +++ b/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/notification/updateSeen.ts b/packages/api/src/client/types/app/bsky/notification/updateSeen.ts index 75e6783a27b..4a59718dae1 100644 --- a/packages/api/src/client/types/app/bsky/notification/updateSeen.ts +++ b/packages/api/src/client/types/app/bsky/notification/updateSeen.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/richtext/facet.ts b/packages/api/src/client/types/app/bsky/richtext/facet.ts index c9dba903cd8..80182f7a4c1 100644 --- a/packages/api/src/client/types/app/bsky/richtext/facet.ts +++ b/packages/api/src/client/types/app/bsky/richtext/facet.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/defs.ts b/packages/api/src/client/types/app/bsky/unspecced/defs.ts index 63de1603017..0c793da4d57 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/defs.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' import type * as AppBskyFeedDefs from '../feed/defs.js' diff --git a/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts b/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts index 069f8eefca9..757de98bc09 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts b/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts index e35f8b6afa7..e0711cee01f 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts index f59a166066a..714cb2c5036 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from '../graph/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts index a1dc36f0cc2..7cd517312ed 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts index c2a5bf8e722..45db98e0b54 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts index c27da862122..7146d0964b9 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from '../feed/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts b/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts index 2922df62e48..ef0787a2cc0 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts b/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts index b643649d88e..54e5c92b320 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from '../feed/defs.js' import type * as AppBskyUnspeccedDefs from './defs.js' diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts index 10d444532f6..712c98a1f73 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyFeedDefs from '../feed/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts index 522b1947684..96ddb90b1ab 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts index a3f64b0ef9f..5f03d799806 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts index 17b90dbd908..338285115a8 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyGraphDefs from '../graph/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts index d5d26e866b4..f0f3c0da365 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts index 1250df94d95..dbd017e87f8 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts index 468bd7f69fd..42ba1958394 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts index a846ce1c5ab..e7a99c5518a 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts index 82f40896ad7..646b21ba04a 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts index 9cbed886eed..e4dcbae8598 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts index fdd7c854433..f51a6cc143c 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts index 43f9d7c399b..553630fa8e4 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts index 9cbff2bf8fd..3b4ae11c7d7 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts index 4fd9e041d31..d8dfbb42bb9 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts index 237f30844c2..1d89dacd366 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts index d346cd1d13d..5ec36b93bd4 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts index 46a7b5d9524..998f60113a3 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts index 286629b8445..e2945c984fb 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts b/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts index 2c72adaa700..a3d78b8e8c2 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts index 120c9cda5de..8e71f43c5cf 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts index c33d6a2cd8d..319f4b0d5c9 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts index 03c3866001e..18bf0b95b26 100644 --- a/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +++ b/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyUnspeccedDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/video/defs.ts b/packages/api/src/client/types/app/bsky/video/defs.ts index f2e32aa4b47..cd61c727c59 100644 --- a/packages/api/src/client/types/app/bsky/video/defs.ts +++ b/packages/api/src/client/types/app/bsky/video/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/video/getJobStatus.ts b/packages/api/src/client/types/app/bsky/video/getJobStatus.ts index b5fceaa0b49..d96b351e378 100644 --- a/packages/api/src/client/types/app/bsky/video/getJobStatus.ts +++ b/packages/api/src/client/types/app/bsky/video/getJobStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyVideoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts b/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts index 74fa661d957..7fcfbaea23d 100644 --- a/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts +++ b/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/app/bsky/video/uploadVideo.ts b/packages/api/src/client/types/app/bsky/video/uploadVideo.ts index 3f59fb9ed69..7e13e34e309 100644 --- a/packages/api/src/client/types/app/bsky/video/uploadVideo.ts +++ b/packages/api/src/client/types/app/bsky/video/uploadVideo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyVideoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/actor/declaration.ts b/packages/api/src/client/types/chat/bsky/actor/declaration.ts index b29868faa3d..b909abaca13 100644 --- a/packages/api/src/client/types/chat/bsky/actor/declaration.ts +++ b/packages/api/src/client/types/chat/bsky/actor/declaration.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/actor/defs.ts b/packages/api/src/client/types/chat/bsky/actor/defs.ts index 67081735bf8..76d4f4772d1 100644 --- a/packages/api/src/client/types/chat/bsky/actor/defs.ts +++ b/packages/api/src/client/types/chat/bsky/actor/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../../../app/bsky/actor/defs.js' import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' diff --git a/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts b/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts index 36352aaa246..484ac36a69a 100644 --- a/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts +++ b/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts b/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts index d72717fb857..2b564168bfd 100644 --- a/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts +++ b/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts b/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts index b8522fd42fa..a41ffbb8529 100644 --- a/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/convo/addReaction.ts b/packages/api/src/client/types/chat/bsky/convo/addReaction.ts index e00d2c4ec86..fc296071398 100644 --- a/packages/api/src/client/types/chat/bsky/convo/addReaction.ts +++ b/packages/api/src/client/types/chat/bsky/convo/addReaction.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts index 92c4cec5939..c598b0b56d3 100644 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ b/packages/api/src/client/types/chat/bsky/convo/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyRichtextFacet from '../../../app/bsky/richtext/facet.js' import type * as AppBskyEmbedRecord from '../../../app/bsky/embed/record.js' import type * as ChatBskyActorDefs from '../actor/defs.js' diff --git a/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts b/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts index caee5ee9c68..0480447e83b 100644 --- a/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts +++ b/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvo.ts b/packages/api/src/client/types/chat/bsky/convo/getConvo.ts index 8dcd129110c..0f6c42fe1cd 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts index 9b1fbdc7e59..a30eef353fb 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts index 3772d4b5e70..96552e9fd3c 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts index 8fe66348798..1dbcc723e22 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyActorDefs from '../actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/getLog.ts b/packages/api/src/client/types/chat/bsky/convo/getLog.ts index a3f6479b0e5..8eb2596422c 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getLog.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getLog.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts index c97e2e0c2d8..4853249caa7 100644 --- a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts +++ b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' import type * as ChatBskyActorDefs from '../actor/defs.js' diff --git a/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts b/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts index c8746ceee38..e443572c8bf 100644 --- a/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts b/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts index 6e97f6a39d4..4a6599aace0 100644 --- a/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts +++ b/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' import type * as ChatBskyGroupDefs from '../group/defs.js' diff --git a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts index 9e2123769ce..4579baf47f9 100644 --- a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts +++ b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts b/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts index 5ad2401d246..5bd7fb36742 100644 --- a/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts b/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts index d42ed8770ec..13c7d86dd83 100644 --- a/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts b/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts index 51f903ddb10..16ec5b26183 100644 --- a/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts +++ b/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts b/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts index d6938937045..ddd10c7487a 100644 --- a/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts +++ b/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts b/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts index 1315981d44f..4e35742818b 100644 --- a/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts +++ b/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts b/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts index bd027fd6c7e..88aa1839dfc 100644 --- a/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts b/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts index 355c1df8db9..5422217ed3e 100644 --- a/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts +++ b/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts b/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts index 4befba6cfbd..76c44f33163 100644 --- a/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts +++ b/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/convo/updateRead.ts b/packages/api/src/client/types/chat/bsky/convo/updateRead.ts index f2fc0479a86..966cf204c11 100644 --- a/packages/api/src/client/types/chat/bsky/convo/updateRead.ts +++ b/packages/api/src/client/types/chat/bsky/convo/updateRead.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/addMembers.ts b/packages/api/src/client/types/chat/bsky/group/addMembers.ts index 887702d9f7c..c52beb35e53 100644 --- a/packages/api/src/client/types/chat/bsky/group/addMembers.ts +++ b/packages/api/src/client/types/chat/bsky/group/addMembers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' import type * as ChatBskyActorDefs from '../actor/defs.js' diff --git a/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts b/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts index 3bb103e9b73..2a6ff6925ac 100644 --- a/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts +++ b/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/createGroup.ts b/packages/api/src/client/types/chat/bsky/group/createGroup.ts index 95a9cc26525..f1e3220e670 100644 --- a/packages/api/src/client/types/chat/bsky/group/createGroup.ts +++ b/packages/api/src/client/types/chat/bsky/group/createGroup.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts index 5e85a6cea25..291a4002f77 100644 --- a/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts +++ b/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/defs.ts b/packages/api/src/client/types/chat/bsky/group/defs.ts index c98d2e2a045..720b8e37fd1 100644 --- a/packages/api/src/client/types/chat/bsky/group/defs.ts +++ b/packages/api/src/client/types/chat/bsky/group/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyActorDefs from '../actor/defs.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' diff --git a/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts index 0ee48421be0..6c599316020 100644 --- a/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts +++ b/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/editGroup.ts b/packages/api/src/client/types/chat/bsky/group/editGroup.ts index 2103657338b..f7fd45f44d0 100644 --- a/packages/api/src/client/types/chat/bsky/group/editGroup.ts +++ b/packages/api/src/client/types/chat/bsky/group/editGroup.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts index 2e8fe1b186d..7fa486f1b0d 100644 --- a/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts +++ b/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts index 9225b02b742..497998a0785 100644 --- a/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts +++ b/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts b/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts index a560b76f750..9e52756cc26 100644 --- a/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts +++ b/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts b/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts index f6db134abf9..57bbc45ffc8 100644 --- a/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts +++ b/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyGroupDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts b/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts index 1e190f0fe1a..29283bc79bd 100644 --- a/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts +++ b/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/group/removeMembers.ts b/packages/api/src/client/types/chat/bsky/group/removeMembers.ts index da698a79533..cfcc857ad72 100644 --- a/packages/api/src/client/types/chat/bsky/group/removeMembers.ts +++ b/packages/api/src/client/types/chat/bsky/group/removeMembers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/group/requestJoin.ts b/packages/api/src/client/types/chat/bsky/group/requestJoin.ts index 65376f1699e..0d4c8cb7b91 100644 --- a/packages/api/src/client/types/chat/bsky/group/requestJoin.ts +++ b/packages/api/src/client/types/chat/bsky/group/requestJoin.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts b/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts index 288423dba12..06544716741 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts index c17bffb3ab8..caad1cedf91 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ChatBskyConvoDefs from '../convo/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts index aaf8b068dad..169fc39bc50 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts b/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts index bdef5d2312f..5ac17b656e4 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/defs.ts b/packages/api/src/client/types/com/atproto/admin/defs.ts index 14d86006073..eb88e1d2fdd 100644 --- a/packages/api/src/client/types/com/atproto/admin/defs.ts +++ b/packages/api/src/client/types/com/atproto/admin/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoServerDefs from '../server/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts b/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts index ad8155f5ac3..6194d2ecbb2 100644 --- a/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts +++ b/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts b/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts index 18b885a7070..ec5261285e7 100644 --- a/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts +++ b/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts b/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts index 559c77a61a8..0b2176d4fef 100644 --- a/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts +++ b/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts b/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts index 4c5c12313c8..739f20ca7d7 100644 --- a/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts +++ b/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts b/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts index 061f7781844..5a53e3564cf 100644 --- a/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts +++ b/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts b/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts index 869b5076078..cf32c475857 100644 --- a/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts +++ b/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts b/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts index 45302093022..45385ab9b87 100644 --- a/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts +++ b/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoServerDefs from '../server/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts b/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts index cd6be1e789f..0e2a0e99087 100644 --- a/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts +++ b/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from './defs.js' import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' diff --git a/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts b/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts index 802bb9100fb..1ce441bfb9c 100644 --- a/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts +++ b/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/admin/sendEmail.ts b/packages/api/src/client/types/com/atproto/admin/sendEmail.ts index bf027d452ea..e93abed60d2 100644 --- a/packages/api/src/client/types/com/atproto/admin/sendEmail.ts +++ b/packages/api/src/client/types/com/atproto/admin/sendEmail.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts index 82fb80661ae..93a926bd915 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts index 43be17f2c40..1ab8e4f70cf 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts index 6bf88c5da5c..1fbf2cf2f4c 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts index a517efca41e..459c4a06ada 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts b/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts index dc26bf7295a..df65544850a 100644 --- a/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from './defs.js' import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' diff --git a/packages/api/src/client/types/com/atproto/identity/defs.ts b/packages/api/src/client/types/com/atproto/identity/defs.ts index 5554b56a8cc..7359624d13a 100644 --- a/packages/api/src/client/types/com/atproto/identity/defs.ts +++ b/packages/api/src/client/types/com/atproto/identity/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts b/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts index d05cfb78d71..53de7d11a00 100644 --- a/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts +++ b/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts b/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts index 4716d466052..d0f2d628c0c 100644 --- a/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts +++ b/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoIdentityDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts b/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts index 9b81702a753..e28bfd3d394 100644 --- a/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts +++ b/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/resolveDid.ts b/packages/api/src/client/types/com/atproto/identity/resolveDid.ts index d49d5e18004..2cead805559 100644 --- a/packages/api/src/client/types/com/atproto/identity/resolveDid.ts +++ b/packages/api/src/client/types/com/atproto/identity/resolveDid.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts b/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts index 40a212cb3c4..1d2538f783d 100644 --- a/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts +++ b/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts b/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts index c9bd2011483..20cf35ea065 100644 --- a/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts +++ b/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoIdentityDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts b/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts index af85c98cab7..c23046d46af 100644 --- a/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts +++ b/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts b/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts index d31992acd3b..3a8e725e095 100644 --- a/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts +++ b/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/identity/updateHandle.ts b/packages/api/src/client/types/com/atproto/identity/updateHandle.ts index 44ebc7d07fd..cfd0ba15612 100644 --- a/packages/api/src/client/types/com/atproto/identity/updateHandle.ts +++ b/packages/api/src/client/types/com/atproto/identity/updateHandle.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/label/defs.ts b/packages/api/src/client/types/com/atproto/label/defs.ts index c9b0fb813c6..53bf729e763 100644 --- a/packages/api/src/client/types/com/atproto/label/defs.ts +++ b/packages/api/src/client/types/com/atproto/label/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/label/queryLabels.ts b/packages/api/src/client/types/com/atproto/label/queryLabels.ts index 983c69727f0..1b2a1c95cca 100644 --- a/packages/api/src/client/types/com/atproto/label/queryLabels.ts +++ b/packages/api/src/client/types/com/atproto/label/queryLabels.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLabelDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/label/subscribeLabels.ts b/packages/api/src/client/types/com/atproto/label/subscribeLabels.ts index cf53248fdaa..8c9cff921fc 100644 --- a/packages/api/src/client/types/com/atproto/label/subscribeLabels.ts +++ b/packages/api/src/client/types/com/atproto/label/subscribeLabels.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLabelDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/lexicon/resolveLexicon.ts b/packages/api/src/client/types/com/atproto/lexicon/resolveLexicon.ts index 10c3b794f10..ab2c240aabc 100644 --- a/packages/api/src/client/types/com/atproto/lexicon/resolveLexicon.ts +++ b/packages/api/src/client/types/com/atproto/lexicon/resolveLexicon.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLexiconSchema from './schema.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/lexicon/schema.ts b/packages/api/src/client/types/com/atproto/lexicon/schema.ts index 4e038989f6c..67b77ba3c06 100644 --- a/packages/api/src/client/types/com/atproto/lexicon/schema.ts +++ b/packages/api/src/client/types/com/atproto/lexicon/schema.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/moderation/createReport.ts b/packages/api/src/client/types/com/atproto/moderation/createReport.ts index 4326ffab225..26cf0e035f1 100644 --- a/packages/api/src/client/types/com/atproto/moderation/createReport.ts +++ b/packages/api/src/client/types/com/atproto/moderation/createReport.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoModerationDefs from './defs.js' import type * as ComAtprotoAdminDefs from '../admin/defs.js' import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' diff --git a/packages/api/src/client/types/com/atproto/moderation/defs.ts b/packages/api/src/client/types/com/atproto/moderation/defs.ts index 0413397e4b2..dba4194acf2 100644 --- a/packages/api/src/client/types/com/atproto/moderation/defs.ts +++ b/packages/api/src/client/types/com/atproto/moderation/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/applyWrites.ts b/packages/api/src/client/types/com/atproto/repo/applyWrites.ts index c7cbac32f9e..cd3af1ba6f6 100644 --- a/packages/api/src/client/types/com/atproto/repo/applyWrites.ts +++ b/packages/api/src/client/types/com/atproto/repo/applyWrites.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/repo/createRecord.ts b/packages/api/src/client/types/com/atproto/repo/createRecord.ts index f51899557a0..1f35147c885 100644 --- a/packages/api/src/client/types/com/atproto/repo/createRecord.ts +++ b/packages/api/src/client/types/com/atproto/repo/createRecord.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/repo/defs.ts b/packages/api/src/client/types/com/atproto/repo/defs.ts index e45be7b96db..9a989e22739 100644 --- a/packages/api/src/client/types/com/atproto/repo/defs.ts +++ b/packages/api/src/client/types/com/atproto/repo/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/deleteRecord.ts b/packages/api/src/client/types/com/atproto/repo/deleteRecord.ts index 8113b8f8433..e0c64501e6c 100644 --- a/packages/api/src/client/types/com/atproto/repo/deleteRecord.ts +++ b/packages/api/src/client/types/com/atproto/repo/deleteRecord.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/repo/describeRepo.ts b/packages/api/src/client/types/com/atproto/repo/describeRepo.ts index b633fe7f93b..c7adcaaa787 100644 --- a/packages/api/src/client/types/com/atproto/repo/describeRepo.ts +++ b/packages/api/src/client/types/com/atproto/repo/describeRepo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/getRecord.ts b/packages/api/src/client/types/com/atproto/repo/getRecord.ts index 0b021e6474f..c5697995c10 100644 --- a/packages/api/src/client/types/com/atproto/repo/getRecord.ts +++ b/packages/api/src/client/types/com/atproto/repo/getRecord.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/importRepo.ts b/packages/api/src/client/types/com/atproto/repo/importRepo.ts index fc730df0210..6e4c3bf49e2 100644 --- a/packages/api/src/client/types/com/atproto/repo/importRepo.ts +++ b/packages/api/src/client/types/com/atproto/repo/importRepo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/listMissingBlobs.ts b/packages/api/src/client/types/com/atproto/repo/listMissingBlobs.ts index 7d230e0f7e6..b1af231e444 100644 --- a/packages/api/src/client/types/com/atproto/repo/listMissingBlobs.ts +++ b/packages/api/src/client/types/com/atproto/repo/listMissingBlobs.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/listRecords.ts b/packages/api/src/client/types/com/atproto/repo/listRecords.ts index 730cfe4f9fa..45e15ad5003 100644 --- a/packages/api/src/client/types/com/atproto/repo/listRecords.ts +++ b/packages/api/src/client/types/com/atproto/repo/listRecords.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/putRecord.ts b/packages/api/src/client/types/com/atproto/repo/putRecord.ts index 037dfb449c3..28e1342a64b 100644 --- a/packages/api/src/client/types/com/atproto/repo/putRecord.ts +++ b/packages/api/src/client/types/com/atproto/repo/putRecord.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoRepoDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/repo/strongRef.ts b/packages/api/src/client/types/com/atproto/repo/strongRef.ts index 04734ff191d..bbd20440ab5 100644 --- a/packages/api/src/client/types/com/atproto/repo/strongRef.ts +++ b/packages/api/src/client/types/com/atproto/repo/strongRef.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/repo/uploadBlob.ts b/packages/api/src/client/types/com/atproto/repo/uploadBlob.ts index 2816249aced..7d312538c2a 100644 --- a/packages/api/src/client/types/com/atproto/repo/uploadBlob.ts +++ b/packages/api/src/client/types/com/atproto/repo/uploadBlob.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/activateAccount.ts b/packages/api/src/client/types/com/atproto/server/activateAccount.ts index 52707e877f8..d73d245ceb9 100644 --- a/packages/api/src/client/types/com/atproto/server/activateAccount.ts +++ b/packages/api/src/client/types/com/atproto/server/activateAccount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/checkAccountStatus.ts b/packages/api/src/client/types/com/atproto/server/checkAccountStatus.ts index 6d8e4e06107..e3bd14c1769 100644 --- a/packages/api/src/client/types/com/atproto/server/checkAccountStatus.ts +++ b/packages/api/src/client/types/com/atproto/server/checkAccountStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/confirmEmail.ts b/packages/api/src/client/types/com/atproto/server/confirmEmail.ts index 83207edbe09..5de59e2e6d8 100644 --- a/packages/api/src/client/types/com/atproto/server/confirmEmail.ts +++ b/packages/api/src/client/types/com/atproto/server/confirmEmail.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/createAccount.ts b/packages/api/src/client/types/com/atproto/server/createAccount.ts index 1f8e331032c..ea65a62e9d3 100644 --- a/packages/api/src/client/types/com/atproto/server/createAccount.ts +++ b/packages/api/src/client/types/com/atproto/server/createAccount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/createAppPassword.ts b/packages/api/src/client/types/com/atproto/server/createAppPassword.ts index d63faf1af36..9031da72610 100644 --- a/packages/api/src/client/types/com/atproto/server/createAppPassword.ts +++ b/packages/api/src/client/types/com/atproto/server/createAppPassword.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/createInviteCode.ts b/packages/api/src/client/types/com/atproto/server/createInviteCode.ts index 1aa1387a9b4..40b547d5264 100644 --- a/packages/api/src/client/types/com/atproto/server/createInviteCode.ts +++ b/packages/api/src/client/types/com/atproto/server/createInviteCode.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/createInviteCodes.ts b/packages/api/src/client/types/com/atproto/server/createInviteCodes.ts index be425f9bf8e..97e7f404b71 100644 --- a/packages/api/src/client/types/com/atproto/server/createInviteCodes.ts +++ b/packages/api/src/client/types/com/atproto/server/createInviteCodes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/createSession.ts b/packages/api/src/client/types/com/atproto/server/createSession.ts index 504bd5e1eaa..f1100d8590a 100644 --- a/packages/api/src/client/types/com/atproto/server/createSession.ts +++ b/packages/api/src/client/types/com/atproto/server/createSession.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/deactivateAccount.ts b/packages/api/src/client/types/com/atproto/server/deactivateAccount.ts index 4b97fda48fe..2a596484029 100644 --- a/packages/api/src/client/types/com/atproto/server/deactivateAccount.ts +++ b/packages/api/src/client/types/com/atproto/server/deactivateAccount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/defs.ts b/packages/api/src/client/types/com/atproto/server/defs.ts index 3876ce2b816..d072012db80 100644 --- a/packages/api/src/client/types/com/atproto/server/defs.ts +++ b/packages/api/src/client/types/com/atproto/server/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/deleteAccount.ts b/packages/api/src/client/types/com/atproto/server/deleteAccount.ts index ca778aa52ee..a41e80fe95d 100644 --- a/packages/api/src/client/types/com/atproto/server/deleteAccount.ts +++ b/packages/api/src/client/types/com/atproto/server/deleteAccount.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/deleteSession.ts b/packages/api/src/client/types/com/atproto/server/deleteSession.ts index 5c51d5fe24b..2dcf71bb012 100644 --- a/packages/api/src/client/types/com/atproto/server/deleteSession.ts +++ b/packages/api/src/client/types/com/atproto/server/deleteSession.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/describeServer.ts b/packages/api/src/client/types/com/atproto/server/describeServer.ts index 3a8b93fbb84..12a7153e250 100644 --- a/packages/api/src/client/types/com/atproto/server/describeServer.ts +++ b/packages/api/src/client/types/com/atproto/server/describeServer.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/getAccountInviteCodes.ts b/packages/api/src/client/types/com/atproto/server/getAccountInviteCodes.ts index 8acbe0f9d87..b304b6e14e1 100644 --- a/packages/api/src/client/types/com/atproto/server/getAccountInviteCodes.ts +++ b/packages/api/src/client/types/com/atproto/server/getAccountInviteCodes.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoServerDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/server/getServiceAuth.ts b/packages/api/src/client/types/com/atproto/server/getServiceAuth.ts index e9cb1e5e6dc..3f07112d3fa 100644 --- a/packages/api/src/client/types/com/atproto/server/getServiceAuth.ts +++ b/packages/api/src/client/types/com/atproto/server/getServiceAuth.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/getSession.ts b/packages/api/src/client/types/com/atproto/server/getSession.ts index 102e80f4e11..787f347a432 100644 --- a/packages/api/src/client/types/com/atproto/server/getSession.ts +++ b/packages/api/src/client/types/com/atproto/server/getSession.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/listAppPasswords.ts b/packages/api/src/client/types/com/atproto/server/listAppPasswords.ts index e409e3ff288..1fd794a115c 100644 --- a/packages/api/src/client/types/com/atproto/server/listAppPasswords.ts +++ b/packages/api/src/client/types/com/atproto/server/listAppPasswords.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/refreshSession.ts b/packages/api/src/client/types/com/atproto/server/refreshSession.ts index ad4760821ba..3f8d5cc9436 100644 --- a/packages/api/src/client/types/com/atproto/server/refreshSession.ts +++ b/packages/api/src/client/types/com/atproto/server/refreshSession.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/requestAccountDelete.ts b/packages/api/src/client/types/com/atproto/server/requestAccountDelete.ts index 1ff07d3e06b..fccb7dfd57f 100644 --- a/packages/api/src/client/types/com/atproto/server/requestAccountDelete.ts +++ b/packages/api/src/client/types/com/atproto/server/requestAccountDelete.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/requestEmailConfirmation.ts b/packages/api/src/client/types/com/atproto/server/requestEmailConfirmation.ts index a2ebfc6f4aa..23a83821562 100644 --- a/packages/api/src/client/types/com/atproto/server/requestEmailConfirmation.ts +++ b/packages/api/src/client/types/com/atproto/server/requestEmailConfirmation.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/requestEmailUpdate.ts b/packages/api/src/client/types/com/atproto/server/requestEmailUpdate.ts index 53472599fd5..ff0f5b63099 100644 --- a/packages/api/src/client/types/com/atproto/server/requestEmailUpdate.ts +++ b/packages/api/src/client/types/com/atproto/server/requestEmailUpdate.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/requestPasswordReset.ts b/packages/api/src/client/types/com/atproto/server/requestPasswordReset.ts index 101719023ad..529aebcc333 100644 --- a/packages/api/src/client/types/com/atproto/server/requestPasswordReset.ts +++ b/packages/api/src/client/types/com/atproto/server/requestPasswordReset.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/reserveSigningKey.ts b/packages/api/src/client/types/com/atproto/server/reserveSigningKey.ts index 57c1a1caaf4..1e65bc31d9d 100644 --- a/packages/api/src/client/types/com/atproto/server/reserveSigningKey.ts +++ b/packages/api/src/client/types/com/atproto/server/reserveSigningKey.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/resetPassword.ts b/packages/api/src/client/types/com/atproto/server/resetPassword.ts index 4e4510a59fd..3d18d8b1de6 100644 --- a/packages/api/src/client/types/com/atproto/server/resetPassword.ts +++ b/packages/api/src/client/types/com/atproto/server/resetPassword.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/revokeAppPassword.ts b/packages/api/src/client/types/com/atproto/server/revokeAppPassword.ts index 9ea830327f4..e86575f8281 100644 --- a/packages/api/src/client/types/com/atproto/server/revokeAppPassword.ts +++ b/packages/api/src/client/types/com/atproto/server/revokeAppPassword.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/server/updateEmail.ts b/packages/api/src/client/types/com/atproto/server/updateEmail.ts index 311779a079b..6d7ab1a68a2 100644 --- a/packages/api/src/client/types/com/atproto/server/updateEmail.ts +++ b/packages/api/src/client/types/com/atproto/server/updateEmail.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/defs.ts b/packages/api/src/client/types/com/atproto/sync/defs.ts index 39b389f1a51..618b3511334 100644 --- a/packages/api/src/client/types/com/atproto/sync/defs.ts +++ b/packages/api/src/client/types/com/atproto/sync/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getBlob.ts b/packages/api/src/client/types/com/atproto/sync/getBlob.ts index a328094680f..6afd6a7cc1c 100644 --- a/packages/api/src/client/types/com/atproto/sync/getBlob.ts +++ b/packages/api/src/client/types/com/atproto/sync/getBlob.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getBlocks.ts b/packages/api/src/client/types/com/atproto/sync/getBlocks.ts index 1625e8610b3..4e4d5495334 100644 --- a/packages/api/src/client/types/com/atproto/sync/getBlocks.ts +++ b/packages/api/src/client/types/com/atproto/sync/getBlocks.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getCheckout.ts b/packages/api/src/client/types/com/atproto/sync/getCheckout.ts index a38a9468668..5037203ae4d 100644 --- a/packages/api/src/client/types/com/atproto/sync/getCheckout.ts +++ b/packages/api/src/client/types/com/atproto/sync/getCheckout.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getHead.ts b/packages/api/src/client/types/com/atproto/sync/getHead.ts index ee1d7064f25..7b92af8b030 100644 --- a/packages/api/src/client/types/com/atproto/sync/getHead.ts +++ b/packages/api/src/client/types/com/atproto/sync/getHead.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getHostStatus.ts b/packages/api/src/client/types/com/atproto/sync/getHostStatus.ts index 0bb19aaa323..fe03c4ef5b2 100644 --- a/packages/api/src/client/types/com/atproto/sync/getHostStatus.ts +++ b/packages/api/src/client/types/com/atproto/sync/getHostStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoSyncDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/sync/getLatestCommit.ts b/packages/api/src/client/types/com/atproto/sync/getLatestCommit.ts index 66d71d64da5..6f39c1bc8c7 100644 --- a/packages/api/src/client/types/com/atproto/sync/getLatestCommit.ts +++ b/packages/api/src/client/types/com/atproto/sync/getLatestCommit.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getRecord.ts b/packages/api/src/client/types/com/atproto/sync/getRecord.ts index 5a4e7be5070..7cd48ce133a 100644 --- a/packages/api/src/client/types/com/atproto/sync/getRecord.ts +++ b/packages/api/src/client/types/com/atproto/sync/getRecord.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getRepo.ts b/packages/api/src/client/types/com/atproto/sync/getRepo.ts index 04510081da1..dc69d0a62cc 100644 --- a/packages/api/src/client/types/com/atproto/sync/getRepo.ts +++ b/packages/api/src/client/types/com/atproto/sync/getRepo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/getRepoStatus.ts b/packages/api/src/client/types/com/atproto/sync/getRepoStatus.ts index 244e06251a2..8a0f6144c2e 100644 --- a/packages/api/src/client/types/com/atproto/sync/getRepoStatus.ts +++ b/packages/api/src/client/types/com/atproto/sync/getRepoStatus.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/listBlobs.ts b/packages/api/src/client/types/com/atproto/sync/listBlobs.ts index 347c9dcba20..3ac558bdbbf 100644 --- a/packages/api/src/client/types/com/atproto/sync/listBlobs.ts +++ b/packages/api/src/client/types/com/atproto/sync/listBlobs.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/listHosts.ts b/packages/api/src/client/types/com/atproto/sync/listHosts.ts index 6ea231e02c3..6c5f78baeb0 100644 --- a/packages/api/src/client/types/com/atproto/sync/listHosts.ts +++ b/packages/api/src/client/types/com/atproto/sync/listHosts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoSyncDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/sync/listRepos.ts b/packages/api/src/client/types/com/atproto/sync/listRepos.ts index 668c2bffa70..fb778015135 100644 --- a/packages/api/src/client/types/com/atproto/sync/listRepos.ts +++ b/packages/api/src/client/types/com/atproto/sync/listRepos.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/listReposByCollection.ts b/packages/api/src/client/types/com/atproto/sync/listReposByCollection.ts index 721914185ab..e4057153fcb 100644 --- a/packages/api/src/client/types/com/atproto/sync/listReposByCollection.ts +++ b/packages/api/src/client/types/com/atproto/sync/listReposByCollection.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/notifyOfUpdate.ts b/packages/api/src/client/types/com/atproto/sync/notifyOfUpdate.ts index 732052dd95c..397fe64c361 100644 --- a/packages/api/src/client/types/com/atproto/sync/notifyOfUpdate.ts +++ b/packages/api/src/client/types/com/atproto/sync/notifyOfUpdate.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/requestCrawl.ts b/packages/api/src/client/types/com/atproto/sync/requestCrawl.ts index 0ebcf21599b..a4c1dae5f29 100644 --- a/packages/api/src/client/types/com/atproto/sync/requestCrawl.ts +++ b/packages/api/src/client/types/com/atproto/sync/requestCrawl.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/sync/subscribeRepos.ts b/packages/api/src/client/types/com/atproto/sync/subscribeRepos.ts index fae8f64ada8..e8d43996f23 100644 --- a/packages/api/src/client/types/com/atproto/sync/subscribeRepos.ts +++ b/packages/api/src/client/types/com/atproto/sync/subscribeRepos.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/temp/addReservedHandle.ts b/packages/api/src/client/types/com/atproto/temp/addReservedHandle.ts index 72672ede56c..9322b1086b0 100644 --- a/packages/api/src/client/types/com/atproto/temp/addReservedHandle.ts +++ b/packages/api/src/client/types/com/atproto/temp/addReservedHandle.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/temp/checkHandleAvailability.ts b/packages/api/src/client/types/com/atproto/temp/checkHandleAvailability.ts index ecd4015d2af..e062db23107 100644 --- a/packages/api/src/client/types/com/atproto/temp/checkHandleAvailability.ts +++ b/packages/api/src/client/types/com/atproto/temp/checkHandleAvailability.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/temp/checkSignupQueue.ts b/packages/api/src/client/types/com/atproto/temp/checkSignupQueue.ts index 3c364858618..4833d897135 100644 --- a/packages/api/src/client/types/com/atproto/temp/checkSignupQueue.ts +++ b/packages/api/src/client/types/com/atproto/temp/checkSignupQueue.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/temp/dereferenceScope.ts b/packages/api/src/client/types/com/atproto/temp/dereferenceScope.ts index 7d85f93dad9..0770e339923 100644 --- a/packages/api/src/client/types/com/atproto/temp/dereferenceScope.ts +++ b/packages/api/src/client/types/com/atproto/temp/dereferenceScope.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/temp/fetchLabels.ts b/packages/api/src/client/types/com/atproto/temp/fetchLabels.ts index 8078f2e66f6..3dd5ebfb977 100644 --- a/packages/api/src/client/types/com/atproto/temp/fetchLabels.ts +++ b/packages/api/src/client/types/com/atproto/temp/fetchLabels.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoLabelDefs from '../label/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/com/atproto/temp/requestPhoneVerification.ts b/packages/api/src/client/types/com/atproto/temp/requestPhoneVerification.ts index 5ff3f331ba7..50dead89c64 100644 --- a/packages/api/src/client/types/com/atproto/temp/requestPhoneVerification.ts +++ b/packages/api/src/client/types/com/atproto/temp/requestPhoneVerification.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/atproto/temp/revokeAccountCredentials.ts b/packages/api/src/client/types/com/atproto/temp/revokeAccountCredentials.ts index b9c9ef3d64d..6f8bcdef5c6 100644 --- a/packages/api/src/client/types/com/atproto/temp/revokeAccountCredentials.ts +++ b/packages/api/src/client/types/com/atproto/temp/revokeAccountCredentials.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/com/germnetwork/declaration.ts b/packages/api/src/client/types/com/germnetwork/declaration.ts index ed50d2e5d79..f4be02c59f2 100644 --- a/packages/api/src/client/types/com/germnetwork/declaration.ts +++ b/packages/api/src/client/types/com/germnetwork/declaration.ts @@ -3,8 +3,8 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../lexicons' -import { type $Typed, is$typed as _is$typed, type OmitKey } from '../../../util' +import { validate as _validate } from '../../../lexicons.js' +import { type $Typed, is$typed as _is$typed, type OmitKey } from '../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/communication/createTemplate.ts b/packages/api/src/client/types/tools/ozone/communication/createTemplate.ts index 816db042e04..cccfe897973 100644 --- a/packages/api/src/client/types/tools/ozone/communication/createTemplate.ts +++ b/packages/api/src/client/types/tools/ozone/communication/createTemplate.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneCommunicationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/communication/defs.ts b/packages/api/src/client/types/tools/ozone/communication/defs.ts index 21168672762..acf5de47310 100644 --- a/packages/api/src/client/types/tools/ozone/communication/defs.ts +++ b/packages/api/src/client/types/tools/ozone/communication/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/communication/deleteTemplate.ts b/packages/api/src/client/types/tools/ozone/communication/deleteTemplate.ts index 74050e5dedc..47a65cf0d98 100644 --- a/packages/api/src/client/types/tools/ozone/communication/deleteTemplate.ts +++ b/packages/api/src/client/types/tools/ozone/communication/deleteTemplate.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/communication/listTemplates.ts b/packages/api/src/client/types/tools/ozone/communication/listTemplates.ts index 650ef4b6b77..84bb64b1225 100644 --- a/packages/api/src/client/types/tools/ozone/communication/listTemplates.ts +++ b/packages/api/src/client/types/tools/ozone/communication/listTemplates.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneCommunicationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/communication/updateTemplate.ts b/packages/api/src/client/types/tools/ozone/communication/updateTemplate.ts index f7cb980ed7b..64c35c2f887 100644 --- a/packages/api/src/client/types/tools/ozone/communication/updateTemplate.ts +++ b/packages/api/src/client/types/tools/ozone/communication/updateTemplate.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneCommunicationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/hosting/getAccountHistory.ts b/packages/api/src/client/types/tools/ozone/hosting/getAccountHistory.ts index 134149800eb..9fd0f42904a 100644 --- a/packages/api/src/client/types/tools/ozone/hosting/getAccountHistory.ts +++ b/packages/api/src/client/types/tools/ozone/hosting/getAccountHistory.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/moderation/cancelScheduledActions.ts b/packages/api/src/client/types/tools/ozone/moderation/cancelScheduledActions.ts index 8e4413df081..bff5bf4693e 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/cancelScheduledActions.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/cancelScheduledActions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/moderation/defs.ts b/packages/api/src/client/types/tools/ozone/moderation/defs.ts index 8e3f6af7a81..210115c9b81 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/defs.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from '../../../com/atproto/admin/defs.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' import type * as ChatBskyConvoDefs from '../../../chat/bsky/convo/defs.js' diff --git a/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts b/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts index 7fc1dcce4c1..a4cf501bb21 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' import type * as ComAtprotoAdminDefs from '../../../com/atproto/admin/defs.js' import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' diff --git a/packages/api/src/client/types/tools/ozone/moderation/getAccountTimeline.ts b/packages/api/src/client/types/tools/ozone/moderation/getAccountTimeline.ts index cc909932c9a..53b6bcc4a3c 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getAccountTimeline.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getAccountTimeline.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/moderation/getEvent.ts b/packages/api/src/client/types/tools/ozone/moderation/getEvent.ts index 05c99e3de32..ef565244f88 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getEvent.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getEvent.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/getRecord.ts b/packages/api/src/client/types/tools/ozone/moderation/getRecord.ts index 7807a491e13..a36665fe6e4 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getRecord.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getRecord.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/getRecords.ts b/packages/api/src/client/types/tools/ozone/moderation/getRecords.ts index a8f5062dba0..862737728ae 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getRecords.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getRecords.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/getRepo.ts b/packages/api/src/client/types/tools/ozone/moderation/getRepo.ts index 02076fe2fff..78568e034f0 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getRepo.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getRepo.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/getReporterStats.ts b/packages/api/src/client/types/tools/ozone/moderation/getReporterStats.ts index c23a40a2bee..02dd89f8cb5 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getReporterStats.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getReporterStats.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/getRepos.ts b/packages/api/src/client/types/tools/ozone/moderation/getRepos.ts index d2ef3d5027c..f4e0c800666 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getRepos.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getRepos.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/getSubjects.ts b/packages/api/src/client/types/tools/ozone/moderation/getSubjects.ts index bb98a8624f1..70d2841e553 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/getSubjects.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/getSubjects.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/listScheduledActions.ts b/packages/api/src/client/types/tools/ozone/moderation/listScheduledActions.ts index a47ea9c0f9f..7760757efce 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/listScheduledActions.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/listScheduledActions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/queryEvents.ts b/packages/api/src/client/types/tools/ozone/moderation/queryEvents.ts index ac44792a756..6472f1260a0 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/queryEvents.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/queryEvents.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts b/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts index 04993ad2a2e..b7b6ee41dcb 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/scheduleAction.ts b/packages/api/src/client/types/tools/ozone/moderation/scheduleAction.ts index f3ab8745355..019dc7f2877 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/scheduleAction.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/scheduleAction.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/moderation/searchRepos.ts b/packages/api/src/client/types/tools/ozone/moderation/searchRepos.ts index 7435f72d999..0f2d1bb0155 100644 --- a/packages/api/src/client/types/tools/ozone/moderation/searchRepos.ts +++ b/packages/api/src/client/types/tools/ozone/moderation/searchRepos.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts b/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts index 1083591e700..40a5806bcd4 100644 --- a/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts +++ b/packages/api/src/client/types/tools/ozone/queue/assignModerator.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneQueueDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/queue/createQueue.ts b/packages/api/src/client/types/tools/ozone/queue/createQueue.ts index 8f7685619c2..5d3cce84412 100644 --- a/packages/api/src/client/types/tools/ozone/queue/createQueue.ts +++ b/packages/api/src/client/types/tools/ozone/queue/createQueue.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneQueueDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/queue/defs.ts b/packages/api/src/client/types/tools/ozone/queue/defs.ts index 14665397752..772f255083d 100644 --- a/packages/api/src/client/types/tools/ozone/queue/defs.ts +++ b/packages/api/src/client/types/tools/ozone/queue/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneTeamDefs from '../team/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts b/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts index 647f253fa57..6c30e90f78f 100644 --- a/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts +++ b/packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts b/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts index fbb74784667..02a987124c5 100644 --- a/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts +++ b/packages/api/src/client/types/tools/ozone/queue/getAssignments.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneQueueDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/queue/listQueues.ts b/packages/api/src/client/types/tools/ozone/queue/listQueues.ts index 1b2ee5d3c10..18e69383130 100644 --- a/packages/api/src/client/types/tools/ozone/queue/listQueues.ts +++ b/packages/api/src/client/types/tools/ozone/queue/listQueues.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneQueueDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/queue/routeReports.ts b/packages/api/src/client/types/tools/ozone/queue/routeReports.ts index 96694b8d09a..0ede03593e2 100644 --- a/packages/api/src/client/types/tools/ozone/queue/routeReports.ts +++ b/packages/api/src/client/types/tools/ozone/queue/routeReports.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts b/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts index 2a006c65576..f658c17dff3 100644 --- a/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts +++ b/packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts b/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts index 786fe023eed..aa39aa133d8 100644 --- a/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts +++ b/packages/api/src/client/types/tools/ozone/queue/updateQueue.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneQueueDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/assignModerator.ts b/packages/api/src/client/types/tools/ozone/report/assignModerator.ts index 5ccb88c57b3..3dcce9e63a0 100644 --- a/packages/api/src/client/types/tools/ozone/report/assignModerator.ts +++ b/packages/api/src/client/types/tools/ozone/report/assignModerator.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/createActivity.ts b/packages/api/src/client/types/tools/ozone/report/createActivity.ts index b220b270362..37c38b1ebb0 100644 --- a/packages/api/src/client/types/tools/ozone/report/createActivity.ts +++ b/packages/api/src/client/types/tools/ozone/report/createActivity.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/defs.ts b/packages/api/src/client/types/tools/ozone/report/defs.ts index c3bba7f72b2..4ae076804dc 100644 --- a/packages/api/src/client/types/tools/ozone/report/defs.ts +++ b/packages/api/src/client/types/tools/ozone/report/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneTeamDefs from '../team/defs.js' import type * as ToolsOzoneModerationDefs from '../moderation/defs.js' import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' diff --git a/packages/api/src/client/types/tools/ozone/report/getAssignments.ts b/packages/api/src/client/types/tools/ozone/report/getAssignments.ts index 27f3823a657..57b4c1ec4e4 100644 --- a/packages/api/src/client/types/tools/ozone/report/getAssignments.ts +++ b/packages/api/src/client/types/tools/ozone/report/getAssignments.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts b/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts index 3cd5c228dfb..ce350d164fd 100644 --- a/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts +++ b/packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts b/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts index 43eb018540d..83043a0c2b4 100644 --- a/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts +++ b/packages/api/src/client/types/tools/ozone/report/getLatestReport.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts b/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts index 42567f5c859..ce997f155ea 100644 --- a/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts +++ b/packages/api/src/client/types/tools/ozone/report/getLiveStats.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/getReport.ts b/packages/api/src/client/types/tools/ozone/report/getReport.ts index b159856ab92..5b71682f64b 100644 --- a/packages/api/src/client/types/tools/ozone/report/getReport.ts +++ b/packages/api/src/client/types/tools/ozone/report/getReport.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/listActivities.ts b/packages/api/src/client/types/tools/ozone/report/listActivities.ts index 4cc9446e43f..1a66651c7b9 100644 --- a/packages/api/src/client/types/tools/ozone/report/listActivities.ts +++ b/packages/api/src/client/types/tools/ozone/report/listActivities.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/queryReports.ts b/packages/api/src/client/types/tools/ozone/report/queryReports.ts index ebecdbc959c..80767f96674 100644 --- a/packages/api/src/client/types/tools/ozone/report/queryReports.ts +++ b/packages/api/src/client/types/tools/ozone/report/queryReports.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts b/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts index f7f9bbbf1c5..e9248575c23 100644 --- a/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts +++ b/packages/api/src/client/types/tools/ozone/report/reassignQueue.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/report/refreshStats.ts b/packages/api/src/client/types/tools/ozone/report/refreshStats.ts index 4ce5773f427..8c08644b25d 100644 --- a/packages/api/src/client/types/tools/ozone/report/refreshStats.ts +++ b/packages/api/src/client/types/tools/ozone/report/refreshStats.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts b/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts index 41684e2d53b..108b125dfc7 100644 --- a/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts +++ b/packages/api/src/client/types/tools/ozone/report/unassignModerator.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneReportDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/safelink/addRule.ts b/packages/api/src/client/types/tools/ozone/safelink/addRule.ts index 855e5aa1fdd..93593b6b24d 100644 --- a/packages/api/src/client/types/tools/ozone/safelink/addRule.ts +++ b/packages/api/src/client/types/tools/ozone/safelink/addRule.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSafelinkDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/safelink/defs.ts b/packages/api/src/client/types/tools/ozone/safelink/defs.ts index 3dd81f9e23e..46ebf1c2c90 100644 --- a/packages/api/src/client/types/tools/ozone/safelink/defs.ts +++ b/packages/api/src/client/types/tools/ozone/safelink/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/safelink/queryEvents.ts b/packages/api/src/client/types/tools/ozone/safelink/queryEvents.ts index d52e56fdd70..36d1fb0f7e9 100644 --- a/packages/api/src/client/types/tools/ozone/safelink/queryEvents.ts +++ b/packages/api/src/client/types/tools/ozone/safelink/queryEvents.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSafelinkDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/safelink/queryRules.ts b/packages/api/src/client/types/tools/ozone/safelink/queryRules.ts index ad732d7eb67..87380b650a8 100644 --- a/packages/api/src/client/types/tools/ozone/safelink/queryRules.ts +++ b/packages/api/src/client/types/tools/ozone/safelink/queryRules.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSafelinkDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/safelink/removeRule.ts b/packages/api/src/client/types/tools/ozone/safelink/removeRule.ts index f7f8c1d97da..076c8a6be27 100644 --- a/packages/api/src/client/types/tools/ozone/safelink/removeRule.ts +++ b/packages/api/src/client/types/tools/ozone/safelink/removeRule.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSafelinkDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/safelink/updateRule.ts b/packages/api/src/client/types/tools/ozone/safelink/updateRule.ts index 02e19f04267..477fb05854c 100644 --- a/packages/api/src/client/types/tools/ozone/safelink/updateRule.ts +++ b/packages/api/src/client/types/tools/ozone/safelink/updateRule.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSafelinkDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/server/getConfig.ts b/packages/api/src/client/types/tools/ozone/server/getConfig.ts index f1d7363f36c..157214ee225 100644 --- a/packages/api/src/client/types/tools/ozone/server/getConfig.ts +++ b/packages/api/src/client/types/tools/ozone/server/getConfig.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/set/addValues.ts b/packages/api/src/client/types/tools/ozone/set/addValues.ts index 68fe1ea476a..215148b89a0 100644 --- a/packages/api/src/client/types/tools/ozone/set/addValues.ts +++ b/packages/api/src/client/types/tools/ozone/set/addValues.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/set/defs.ts b/packages/api/src/client/types/tools/ozone/set/defs.ts index c960df8e640..aa17cfbb046 100644 --- a/packages/api/src/client/types/tools/ozone/set/defs.ts +++ b/packages/api/src/client/types/tools/ozone/set/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/set/deleteSet.ts b/packages/api/src/client/types/tools/ozone/set/deleteSet.ts index 619f27dcf34..5e5715f34ff 100644 --- a/packages/api/src/client/types/tools/ozone/set/deleteSet.ts +++ b/packages/api/src/client/types/tools/ozone/set/deleteSet.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/set/deleteValues.ts b/packages/api/src/client/types/tools/ozone/set/deleteValues.ts index 428490a1254..cfffc139fc3 100644 --- a/packages/api/src/client/types/tools/ozone/set/deleteValues.ts +++ b/packages/api/src/client/types/tools/ozone/set/deleteValues.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/set/getValues.ts b/packages/api/src/client/types/tools/ozone/set/getValues.ts index 91b5619f97b..ab9276ba759 100644 --- a/packages/api/src/client/types/tools/ozone/set/getValues.ts +++ b/packages/api/src/client/types/tools/ozone/set/getValues.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSetDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/set/querySets.ts b/packages/api/src/client/types/tools/ozone/set/querySets.ts index b470728e4c0..8d30ebc6e65 100644 --- a/packages/api/src/client/types/tools/ozone/set/querySets.ts +++ b/packages/api/src/client/types/tools/ozone/set/querySets.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSetDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/set/upsertSet.ts b/packages/api/src/client/types/tools/ozone/set/upsertSet.ts index 6b18fd88834..23db0e7ed0f 100644 --- a/packages/api/src/client/types/tools/ozone/set/upsertSet.ts +++ b/packages/api/src/client/types/tools/ozone/set/upsertSet.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSetDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/setting/defs.ts b/packages/api/src/client/types/tools/ozone/setting/defs.ts index 76d5088ba44..15310938e5c 100644 --- a/packages/api/src/client/types/tools/ozone/setting/defs.ts +++ b/packages/api/src/client/types/tools/ozone/setting/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/setting/listOptions.ts b/packages/api/src/client/types/tools/ozone/setting/listOptions.ts index d60dfb28afc..9f94f414b47 100644 --- a/packages/api/src/client/types/tools/ozone/setting/listOptions.ts +++ b/packages/api/src/client/types/tools/ozone/setting/listOptions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSettingDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/setting/removeOptions.ts b/packages/api/src/client/types/tools/ozone/setting/removeOptions.ts index 8a70917717f..c2316f7ceae 100644 --- a/packages/api/src/client/types/tools/ozone/setting/removeOptions.ts +++ b/packages/api/src/client/types/tools/ozone/setting/removeOptions.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/setting/upsertOption.ts b/packages/api/src/client/types/tools/ozone/setting/upsertOption.ts index f9b4b73bede..10f44f83302 100644 --- a/packages/api/src/client/types/tools/ozone/setting/upsertOption.ts +++ b/packages/api/src/client/types/tools/ozone/setting/upsertOption.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSettingDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/signature/defs.ts b/packages/api/src/client/types/tools/ozone/signature/defs.ts index 5170c66f897..bb73b0f34f3 100644 --- a/packages/api/src/client/types/tools/ozone/signature/defs.ts +++ b/packages/api/src/client/types/tools/ozone/signature/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/signature/findCorrelation.ts b/packages/api/src/client/types/tools/ozone/signature/findCorrelation.ts index 40f3151ea56..cea026a230a 100644 --- a/packages/api/src/client/types/tools/ozone/signature/findCorrelation.ts +++ b/packages/api/src/client/types/tools/ozone/signature/findCorrelation.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneSignatureDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/signature/findRelatedAccounts.ts b/packages/api/src/client/types/tools/ozone/signature/findRelatedAccounts.ts index d1e6fd2d144..08408ca7e4a 100644 --- a/packages/api/src/client/types/tools/ozone/signature/findRelatedAccounts.ts +++ b/packages/api/src/client/types/tools/ozone/signature/findRelatedAccounts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from '../../../com/atproto/admin/defs.js' import type * as ToolsOzoneSignatureDefs from './defs.js' diff --git a/packages/api/src/client/types/tools/ozone/signature/searchAccounts.ts b/packages/api/src/client/types/tools/ozone/signature/searchAccounts.ts index 0eb87f05bae..46f4855e0d4 100644 --- a/packages/api/src/client/types/tools/ozone/signature/searchAccounts.ts +++ b/packages/api/src/client/types/tools/ozone/signature/searchAccounts.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ComAtprotoAdminDefs from '../../../com/atproto/admin/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/team/addMember.ts b/packages/api/src/client/types/tools/ozone/team/addMember.ts index 928d3733553..684b5a4039e 100644 --- a/packages/api/src/client/types/tools/ozone/team/addMember.ts +++ b/packages/api/src/client/types/tools/ozone/team/addMember.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneTeamDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/team/defs.ts b/packages/api/src/client/types/tools/ozone/team/defs.ts index 9ee584a76eb..97229a5941f 100644 --- a/packages/api/src/client/types/tools/ozone/team/defs.ts +++ b/packages/api/src/client/types/tools/ozone/team/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as AppBskyActorDefs from '../../../app/bsky/actor/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/team/deleteMember.ts b/packages/api/src/client/types/tools/ozone/team/deleteMember.ts index b529439eebc..a7dd729009a 100644 --- a/packages/api/src/client/types/tools/ozone/team/deleteMember.ts +++ b/packages/api/src/client/types/tools/ozone/team/deleteMember.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/client/types/tools/ozone/team/listMembers.ts b/packages/api/src/client/types/tools/ozone/team/listMembers.ts index 3db583b3a4c..180786f7535 100644 --- a/packages/api/src/client/types/tools/ozone/team/listMembers.ts +++ b/packages/api/src/client/types/tools/ozone/team/listMembers.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneTeamDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/team/updateMember.ts b/packages/api/src/client/types/tools/ozone/team/updateMember.ts index 7d4da23359f..d75b1357c98 100644 --- a/packages/api/src/client/types/tools/ozone/team/updateMember.ts +++ b/packages/api/src/client/types/tools/ozone/team/updateMember.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneTeamDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/verification/defs.ts b/packages/api/src/client/types/tools/ozone/verification/defs.ts index d44e5ed60ba..e2760699191 100644 --- a/packages/api/src/client/types/tools/ozone/verification/defs.ts +++ b/packages/api/src/client/types/tools/ozone/verification/defs.ts @@ -3,12 +3,12 @@ */ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneModerationDefs from '../moderation/defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/verification/grantVerifications.ts b/packages/api/src/client/types/tools/ozone/verification/grantVerifications.ts index 33cb375f590..4f6ea674377 100644 --- a/packages/api/src/client/types/tools/ozone/verification/grantVerifications.ts +++ b/packages/api/src/client/types/tools/ozone/verification/grantVerifications.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneVerificationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/verification/listVerifications.ts b/packages/api/src/client/types/tools/ozone/verification/listVerifications.ts index 77f96283559..7e148d6abb5 100644 --- a/packages/api/src/client/types/tools/ozone/verification/listVerifications.ts +++ b/packages/api/src/client/types/tools/ozone/verification/listVerifications.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' import type * as ToolsOzoneVerificationDefs from './defs.js' const is$typed = _is$typed, diff --git a/packages/api/src/client/types/tools/ozone/verification/revokeVerifications.ts b/packages/api/src/client/types/tools/ozone/verification/revokeVerifications.ts index 8890ed35a9e..70cd1413acc 100644 --- a/packages/api/src/client/types/tools/ozone/verification/revokeVerifications.ts +++ b/packages/api/src/client/types/tools/ozone/verification/revokeVerifications.ts @@ -4,12 +4,12 @@ import { HeadersMap, XRPCError } from '@atproto/xrpc' import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons' +import { validate as _validate } from '../../../../lexicons.js' import { type $Typed, is$typed as _is$typed, type OmitKey, -} from '../../../../util' +} from '../../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index ef8e0f979ce..c4a6f40500e 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,5 +1,5 @@ import { Lexicons } from '@atproto/lexicon' -import { lexicons as internalLexicons } from './client/lexicons' +import { lexicons as internalLexicons } from './client/lexicons.js' export { AtUri } from '@atproto/syntax' export { @@ -12,32 +12,32 @@ export { export { parseLanguage } from '@atproto/common-web' export { XRPCError } from '@atproto/xrpc' -export * from './types' -export * from './const' -export * from './util' -export * from './client' -export { ids, schemas } from './client/lexicons' -export type { $Typed, Un$Typed } from './client/util' -export { asPredicate } from './client/util' -export * from './rich-text/rich-text' -export * from './rich-text/sanitization' -export * from './rich-text/unicode' -export * from './rich-text/util' -export * from './moderation' -export * from './moderation/types' -export * from './mocker' -export * from './age-assurance' -export { DEFAULT_LABEL_SETTINGS, LABELS } from './moderation/const/labels' -export { Agent } from './agent' +export * from './types.js' +export * from './const.js' +export * from './util.js' +export * from './client/index.js' +export { ids, schemas } from './client/lexicons.js' +export type { $Typed, Un$Typed } from './client/util.js' +export { asPredicate } from './client/util.js' +export * from './rich-text/rich-text.js' +export * from './rich-text/sanitization.js' +export * from './rich-text/unicode.js' +export * from './rich-text/util.js' +export * from './moderation/index.js' +export * from './moderation/types.js' +export * from './mocker.js' +export * from './age-assurance.js' +export { DEFAULT_LABEL_SETTINGS, LABELS } from './moderation/const/labels.js' +export { Agent } from './agent.js' -export { AtpAgent, type AtpAgentOptions } from './atp-agent' -export { CredentialSession } from './atp-agent' -export { BskyAgent } from './bsky-agent' +export { AtpAgent, type AtpAgentOptions } from './atp-agent.js' +export { CredentialSession } from './atp-agent.js' +export { BskyAgent } from './bsky-agent.js' export { /** @deprecated */ AtpAgent as default, -} from './atp-agent' +} from './atp-agent.js' // Expose a copy to prevent alteration of the internal Lexicon instance used by // the AtpBaseClient class. diff --git a/packages/api/src/mocker.ts b/packages/api/src/mocker.ts index 1d42142b06b..e5619ce31b6 100644 --- a/packages/api/src/mocker.ts +++ b/packages/api/src/mocker.ts @@ -6,8 +6,8 @@ import { AppBskyGraphDefs, AppBskyNotificationListNotifications, ComAtprotoLabelDefs, -} from './client' -import { $Typed, Un$Typed } from './client/util' +} from './client/index.js' +import { $Typed, Un$Typed } from './client/util.js' const FAKE_CID = 'bafyreiclp443lavogvhj3d2ob2cxbfuscni2k5jk7bebjzg7khl3esabwq' diff --git a/packages/api/src/moderation/decision.ts b/packages/api/src/moderation/decision.ts index e1f269d212b..31e7eb10b1e 100644 --- a/packages/api/src/moderation/decision.ts +++ b/packages/api/src/moderation/decision.ts @@ -1,6 +1,6 @@ -import { AppBskyGraphDefs } from '../client/index' -import { LABELS } from './const/labels' -import { MuteWordMatch } from './mutewords' +import { AppBskyGraphDefs } from '../client/index.js' +import { LABELS } from './const/labels.js' +import { MuteWordMatch } from './mutewords.js' import { BLOCK_BEHAVIOR, CUSTOM_LABEL_VALUE_RE, @@ -14,8 +14,8 @@ import { ModerationCause, ModerationOpts, NOOP_BEHAVIOR, -} from './types' -import { ModerationUI } from './ui' +} from './types.js' +import { ModerationUI } from './ui.js' enum ModerationBehaviorSeverity { High, diff --git a/packages/api/src/moderation/index.ts b/packages/api/src/moderation/index.ts index 153a1db350d..53804d7d20b 100644 --- a/packages/api/src/moderation/index.ts +++ b/packages/api/src/moderation/index.ts @@ -1,11 +1,11 @@ -import { ModerationDecision } from './decision' -import { decideAccount } from './subjects/account' -import { decideFeedGenerator } from './subjects/feed-generator' -import { decideNotification } from './subjects/notification' -import { decidePost } from './subjects/post' -import { decideProfile } from './subjects/profile' -import { decideStatus } from './subjects/status' -import { decideUserList } from './subjects/user-list' +import { ModerationDecision } from './decision.js' +import { decideAccount } from './subjects/account.js' +import { decideFeedGenerator } from './subjects/feed-generator.js' +import { decideNotification } from './subjects/notification.js' +import { decidePost } from './subjects/post.js' +import { decideProfile } from './subjects/profile.js' +import { decideStatus } from './subjects/status.js' +import { decideUserList } from './subjects/user-list.js' import { ModerationOpts, ModerationSubjectFeedGenerator, @@ -13,15 +13,15 @@ import { ModerationSubjectPost, ModerationSubjectProfile, ModerationSubjectUserList, -} from './types' +} from './types.js' -export { ModerationUI } from './ui' -export { ModerationDecision } from './decision' -export { hasMutedWord, matchMuteWords } from './mutewords' +export { ModerationUI } from './ui.js' +export { ModerationDecision } from './decision.js' +export { hasMutedWord, matchMuteWords } from './mutewords.js' export { interpretLabelValueDefinition, interpretLabelValueDefinitions, -} from './util' +} from './util.js' export function moderateProfile( subject: ModerationSubjectProfile, diff --git a/packages/api/src/moderation/mutewords.ts b/packages/api/src/moderation/mutewords.ts index 53c43f0d3d7..7e749d20979 100644 --- a/packages/api/src/moderation/mutewords.ts +++ b/packages/api/src/moderation/mutewords.ts @@ -1,4 +1,4 @@ -import { AppBskyActorDefs, AppBskyRichtextFacet } from '../client' +import { AppBskyActorDefs, AppBskyRichtextFacet } from '../client/index.js' const REGEX = { LEADING_TRAILING_PUNCTUATION: /(?:^\p{P}+|\p{P}+$)/gu, diff --git a/packages/api/src/moderation/subjects/account.ts b/packages/api/src/moderation/subjects/account.ts index 6014d46ffad..0dcc99b6f91 100644 --- a/packages/api/src/moderation/subjects/account.ts +++ b/packages/api/src/moderation/subjects/account.ts @@ -1,5 +1,5 @@ -import { ModerationDecision } from '../decision' -import { Label, ModerationOpts, ModerationSubjectProfile } from '../types' +import { ModerationDecision } from '../decision.js' +import { Label, ModerationOpts, ModerationSubjectProfile } from '../types.js' export function decideAccount( subject: ModerationSubjectProfile, diff --git a/packages/api/src/moderation/subjects/feed-generator.ts b/packages/api/src/moderation/subjects/feed-generator.ts index 8568f90f0ed..6e006a752ae 100644 --- a/packages/api/src/moderation/subjects/feed-generator.ts +++ b/packages/api/src/moderation/subjects/feed-generator.ts @@ -1,7 +1,7 @@ -import { ModerationDecision } from '../decision' -import { ModerationOpts, ModerationSubjectFeedGenerator } from '../types' -import { decideAccount } from './account' -import { decideProfile } from './profile' +import { ModerationDecision } from '../decision.js' +import { ModerationOpts, ModerationSubjectFeedGenerator } from '../types.js' +import { decideAccount } from './account.js' +import { decideProfile } from './profile.js' export function decideFeedGenerator( subject: ModerationSubjectFeedGenerator, diff --git a/packages/api/src/moderation/subjects/notification.ts b/packages/api/src/moderation/subjects/notification.ts index 2e3a8a09f9d..5852ec366d8 100644 --- a/packages/api/src/moderation/subjects/notification.ts +++ b/packages/api/src/moderation/subjects/notification.ts @@ -1,7 +1,7 @@ -import { ModerationDecision } from '../decision' -import { ModerationOpts, ModerationSubjectNotification } from '../types' -import { decideAccount } from './account' -import { decideProfile } from './profile' +import { ModerationDecision } from '../decision.js' +import { ModerationOpts, ModerationSubjectNotification } from '../types.js' +import { decideAccount } from './account.js' +import { decideProfile } from './profile.js' export function decideNotification( subject: ModerationSubjectNotification, diff --git a/packages/api/src/moderation/subjects/post.ts b/packages/api/src/moderation/subjects/post.ts index 4a786859b8c..9a80670e8fb 100644 --- a/packages/api/src/moderation/subjects/post.ts +++ b/packages/api/src/moderation/subjects/post.ts @@ -5,13 +5,13 @@ import { AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, AppBskyFeedPost, -} from '../../client' -import { $Typed } from '../../client/util' -import { ModerationDecision } from '../decision' -import { MuteWordMatch, matchMuteWords } from '../mutewords' -import { ModerationOpts, ModerationSubjectPost } from '../types' -import { decideAccount } from './account' -import { decideProfile } from './profile' +} from '../../client/index.js' +import { $Typed } from '../../client/util.js' +import { ModerationDecision } from '../decision.js' +import { MuteWordMatch, matchMuteWords } from '../mutewords.js' +import { ModerationOpts, ModerationSubjectPost } from '../types.js' +import { decideAccount } from './account.js' +import { decideProfile } from './profile.js' export function decidePost( subject: ModerationSubjectPost, diff --git a/packages/api/src/moderation/subjects/profile.ts b/packages/api/src/moderation/subjects/profile.ts index 0dfcf67b658..d7d480475a7 100644 --- a/packages/api/src/moderation/subjects/profile.ts +++ b/packages/api/src/moderation/subjects/profile.ts @@ -1,5 +1,5 @@ -import { ModerationDecision } from '../decision' -import { Label, ModerationOpts, ModerationSubjectProfile } from '../types' +import { ModerationDecision } from '../decision.js' +import { Label, ModerationOpts, ModerationSubjectProfile } from '../types.js' export function decideProfile( subject: ModerationSubjectProfile, diff --git a/packages/api/src/moderation/subjects/status.ts b/packages/api/src/moderation/subjects/status.ts index 11f3dc0ed0b..b5582780e6b 100644 --- a/packages/api/src/moderation/subjects/status.ts +++ b/packages/api/src/moderation/subjects/status.ts @@ -1,7 +1,7 @@ -import { ModerationDecision } from '../decision' -import { ModerationOpts, ModerationSubjectProfile } from '../types' -import { decideAccount } from './account' -import { decideProfile } from './profile' +import { ModerationDecision } from '../decision.js' +import { ModerationOpts, ModerationSubjectProfile } from '../types.js' +import { decideAccount } from './account.js' +import { decideProfile } from './profile.js' export function decideStatus( subject: ModerationSubjectProfile, diff --git a/packages/api/src/moderation/subjects/user-list.ts b/packages/api/src/moderation/subjects/user-list.ts index 461b469b9fe..7e504cf071f 100644 --- a/packages/api/src/moderation/subjects/user-list.ts +++ b/packages/api/src/moderation/subjects/user-list.ts @@ -1,9 +1,9 @@ import { AtUri } from '@atproto/syntax' -import { AppBskyActorDefs } from '../../client/index' -import { ModerationDecision } from '../decision' -import { ModerationOpts, ModerationSubjectUserList } from '../types' -import { decideAccount } from './account' -import { decideProfile } from './profile' +import { AppBskyActorDefs } from '../../client/index.js' +import { ModerationDecision } from '../decision.js' +import { ModerationOpts, ModerationSubjectUserList } from '../types.js' +import { decideAccount } from './account.js' +import { decideProfile } from './profile.js' export function decideUserList( subject: ModerationSubjectUserList, diff --git a/packages/api/src/moderation/types.ts b/packages/api/src/moderation/types.ts index 38fd63fe5f1..78fb5893781 100644 --- a/packages/api/src/moderation/types.ts +++ b/packages/api/src/moderation/types.ts @@ -5,9 +5,9 @@ import { AppBskyNotificationListNotifications, ChatBskyActorDefs, ComAtprotoLabelDefs, -} from '../client/index' -import { KnownLabelValue } from './const/labels' -import { MuteWordMatch } from './mutewords' +} from '../client/index.js' +import { KnownLabelValue } from './const/labels.js' +import { MuteWordMatch } from './mutewords.js' // syntax // = diff --git a/packages/api/src/moderation/ui.ts b/packages/api/src/moderation/ui.ts index 4de1818f659..4e958678da2 100644 --- a/packages/api/src/moderation/ui.ts +++ b/packages/api/src/moderation/ui.ts @@ -1,4 +1,4 @@ -import { ModerationCause } from './types' +import { ModerationCause } from './types.js' export class ModerationUI { noOverride = false diff --git a/packages/api/src/moderation/util.ts b/packages/api/src/moderation/util.ts index a76b37f8b9f..8aeedc05b48 100644 --- a/packages/api/src/moderation/util.ts +++ b/packages/api/src/moderation/util.ts @@ -3,14 +3,14 @@ import { AppBskyEmbedRecordWithMedia, AppBskyLabelerDefs, ComAtprotoLabelDefs, -} from '../client' -import { asPredicate } from '../client/util' +} from '../client/index.js' +import { asPredicate } from '../client/util.js' import { InterpretedLabelValueDefinition, LabelPreference, LabelValueDefinitionFlag, ModerationBehavior, -} from './types' +} from './types.js' export function isQuotedPost(embed: unknown): embed is AppBskyEmbedRecord.View { return Boolean(embed && AppBskyEmbedRecord.isView(embed)) diff --git a/packages/api/src/predicate.ts b/packages/api/src/predicate.ts index 8c812fda266..9423328d49f 100644 --- a/packages/api/src/predicate.ts +++ b/packages/api/src/predicate.ts @@ -1,5 +1,5 @@ -import { AppBskyActorDefs, AppBskyActorProfile } from './client/index' -import { asPredicate } from './client/util' +import { AppBskyActorDefs, AppBskyActorProfile } from './client/index.js' +import { asPredicate } from './client/util.js' export const isValidProfile = asPredicate(AppBskyActorProfile.validateRecord) export const isValidAdultContentPref = asPredicate( diff --git a/packages/api/src/rich-text/detection.ts b/packages/api/src/rich-text/detection.ts index 931ee8450d2..2793b6a3afb 100644 --- a/packages/api/src/rich-text/detection.ts +++ b/packages/api/src/rich-text/detection.ts @@ -1,13 +1,13 @@ import TLDs from 'tlds' -import { AppBskyRichtextFacet } from '../client' -import { UnicodeString } from './unicode' +import { AppBskyRichtextFacet } from '../client/index.js' +import { UnicodeString } from './unicode.js' import { CASHTAG_REGEX, MENTION_REGEX, TAG_REGEX, TRAILING_PUNCTUATION_REGEX, URL_REGEX, -} from './util' +} from './util.js' export type Facet = AppBskyRichtextFacet.Main diff --git a/packages/api/src/rich-text/rich-text.ts b/packages/api/src/rich-text/rich-text.ts index ba46e570356..8e937aef8ec 100644 --- a/packages/api/src/rich-text/rich-text.ts +++ b/packages/api/src/rich-text/rich-text.ts @@ -91,10 +91,14 @@ F: 0 1 2 3 4 5 6 7 8 910 // string indices ^-------^ // target slice {start: 0, end: 5} */ -import { AppBskyFeedPost, AppBskyRichtextFacet, AtpBaseClient } from '../client' -import { detectFacets } from './detection' -import { sanitizeRichText } from './sanitization' -import { UnicodeString } from './unicode' +import { + AppBskyFeedPost, + AppBskyRichtextFacet, + AtpBaseClient, +} from '../client/index.js' +import { detectFacets } from './detection.js' +import { sanitizeRichText } from './sanitization.js' +import { UnicodeString } from './unicode.js' export type Facet = AppBskyRichtextFacet.Main export type FacetLink = AppBskyRichtextFacet.Link diff --git a/packages/api/src/rich-text/sanitization.ts b/packages/api/src/rich-text/sanitization.ts index 31aa7fb0e7e..e0b09868863 100644 --- a/packages/api/src/rich-text/sanitization.ts +++ b/packages/api/src/rich-text/sanitization.ts @@ -1,5 +1,5 @@ -import { RichText } from './rich-text' -import { UnicodeString } from './unicode' +import { RichText } from './rich-text.js' +import { UnicodeString } from './unicode.js' // this regex is intentionally matching on the zero-with-separator codepoint // eslint-disable-next-line no-misleading-character-class diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index 511760a0d30..91542a17adb 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -1,5 +1,5 @@ -import { AppBskyActorDefs } from './client' -import { ModerationPrefs } from './moderation/types' +import { AppBskyActorDefs } from './client/index.js' +import { ModerationPrefs } from './moderation/types.js' export type UnknownServiceType = string & NonNullable export type AtprotoServiceType = 'atproto_labeler' | UnknownServiceType diff --git a/packages/api/src/util.ts b/packages/api/src/util.ts index 9eb3683920b..5b490946b92 100644 --- a/packages/api/src/util.ts +++ b/packages/api/src/util.ts @@ -1,7 +1,7 @@ import { z } from 'zod' import { AtUri } from '@atproto/syntax' -import { AppBskyActorDefs } from './client' -import { Nux } from './client/types/app/bsky/actor/defs' +import { AppBskyActorDefs } from './client/index.js' +import { Nux } from './client/types/app/bsky/actor/defs.js' export function sanitizeMutedWordValue(value: string) { return ( diff --git a/packages/api/tests/atp-agent.test.ts b/packages/api/tests/atp-agent.test.ts index 93d764800d3..e1fb6720213 100644 --- a/packages/api/tests/atp-agent.test.ts +++ b/packages/api/tests/atp-agent.test.ts @@ -1,18 +1,18 @@ import { TID } from '@atproto/common-web' import { TestNetworkNoAppView } from '@atproto/dev-env' +import { asPredicate } from '../src/client/util.js' import { AppBskyActorDefs, AppBskyActorProfile, AtpAgent, ComAtprotoRepoPutRecord, DEFAULT_LABEL_SETTINGS, -} from '../src' -import { asPredicate } from '../src/client/util' +} from '../src/index.js' import { getSavedFeedType, savedFeedsToUriArrays, validateSavedFeed, -} from '../src/util' +} from '../src/util.js' describe('agent', () => { let network: TestNetworkNoAppView diff --git a/packages/api/tests/dispatcher.test.ts b/packages/api/tests/dispatcher.test.ts index df4fe0edc75..a2698708fc1 100644 --- a/packages/api/tests/dispatcher.test.ts +++ b/packages/api/tests/dispatcher.test.ts @@ -7,8 +7,8 @@ import { AtpSessionData, AtpSessionEvent, BSKY_LABELER_DID, -} from '../src' -import { createHeaderEchoServer } from './util/echo-server' +} from '../src/index.js' +import { createHeaderEchoServer } from './util/echo-server.js' const getPdsEndpointUrl = (...args: Parameters) => { const endpoint = getPdsEndpoint(...args) diff --git a/packages/api/tests/moderation-behaviors.test.ts b/packages/api/tests/moderation-behaviors.test.ts index 27373501937..821600d38e5 100644 --- a/packages/api/tests/moderation-behaviors.test.ts +++ b/packages/api/tests/moderation-behaviors.test.ts @@ -1,11 +1,11 @@ -import { moderatePost, moderateProfile } from '../src' +import { moderatePost, moderateProfile } from '../src/index.js' import { ModerationBehaviorSuiteRunner, ModerationTestSuiteScenario, SuiteConfigurations, SuiteScenarios, SuiteUsers, -} from './util/moderation-behavior' +} from './util/moderation-behavior.js' const USERS: SuiteUsers = { self: { diff --git a/packages/api/tests/moderation-custom-labels.test.ts b/packages/api/tests/moderation-custom-labels.test.ts index 366e7a486ce..179fd33a827 100644 --- a/packages/api/tests/moderation-custom-labels.test.ts +++ b/packages/api/tests/moderation-custom-labels.test.ts @@ -5,8 +5,8 @@ import { mock, moderatePost, moderateProfile, -} from '../src' -import './util/moderation-behavior' +} from '../src/index.js' +import './util/moderation-behavior.js' interface ScenarioResult { profileList?: string[] diff --git a/packages/api/tests/moderation-mutewords.test.ts b/packages/api/tests/moderation-mutewords.test.ts index 0734cece958..43fbdae0668 100644 --- a/packages/api/tests/moderation-mutewords.test.ts +++ b/packages/api/tests/moderation-mutewords.test.ts @@ -1,5 +1,5 @@ -import { RichText, mock, moderatePost } from '../src/' -import { matchMuteWords } from '../src/moderation/mutewords' +import { RichText, mock, moderatePost } from '../src//index.js' +import { matchMuteWords } from '../src/moderation/mutewords.js' describe(`matchMuteWords`, () => { describe(`tags`, () => { diff --git a/packages/api/tests/moderation-prefs.test.ts b/packages/api/tests/moderation-prefs.test.ts index e82b725b0c2..412dc4dabd2 100644 --- a/packages/api/tests/moderation-prefs.test.ts +++ b/packages/api/tests/moderation-prefs.test.ts @@ -1,7 +1,7 @@ import { TestNetworkNoAppView } from '@atproto/dev-env' -import { DEFAULT_LABEL_SETTINGS } from '../src' -import { isContentLabelPref } from '../src/client/types/app/bsky/actor/defs' -import './util/moderation-behavior' +import { isContentLabelPref } from '../src/client/types/app/bsky/actor/defs.js' +import { DEFAULT_LABEL_SETTINGS } from '../src/index.js' +import './util/moderation-behavior.js' describe('agent', () => { let network: TestNetworkNoAppView diff --git a/packages/api/tests/moderation-quoteposts.test.ts b/packages/api/tests/moderation-quoteposts.test.ts index 4ff94abae39..a9a31a40e3e 100644 --- a/packages/api/tests/moderation-quoteposts.test.ts +++ b/packages/api/tests/moderation-quoteposts.test.ts @@ -4,8 +4,8 @@ import { interpretLabelValueDefinition, mock, moderatePost, -} from '../src' -import './util/moderation-behavior' +} from '../src/index.js' +import './util/moderation-behavior.js' interface ScenarioResult { profileList?: string[] diff --git a/packages/api/tests/moderation.test.ts b/packages/api/tests/moderation.test.ts index 6c0a7f9139a..db0505204ef 100644 --- a/packages/api/tests/moderation.test.ts +++ b/packages/api/tests/moderation.test.ts @@ -1,11 +1,11 @@ -import { ModerationOpts } from '../dist' import { + ModerationOpts, interpretLabelValueDefinition, mock, moderatePost, moderateProfile, -} from '../src' -import './util/moderation-behavior' +} from '../src/index.js' +import './util/moderation-behavior.js' describe('Moderation', () => { it('Applies self-labels on profiles according to the global preferences', () => { diff --git a/packages/api/tests/rich-text-detection.test.ts b/packages/api/tests/rich-text-detection.test.ts index 6adc2df0dc2..5a5137ebe48 100644 --- a/packages/api/tests/rich-text-detection.test.ts +++ b/packages/api/tests/rich-text-detection.test.ts @@ -1,9 +1,9 @@ -import { AtpAgent, RichText, RichTextSegment } from '../src' import { isLink, isMention, isTag, -} from '../src/client/types/app/bsky/richtext/facet' +} from '../src/client/types/app/bsky/richtext/facet.js' +import { AtpAgent, RichText, RichTextSegment } from '../src/index.js' describe('detectFacets', () => { const agent = new AtpAgent({ service: 'http://localhost' }) diff --git a/packages/api/tests/rich-text-sanitization.test.ts b/packages/api/tests/rich-text-sanitization.test.ts index 45365df1fff..80c45762b4b 100644 --- a/packages/api/tests/rich-text-sanitization.test.ts +++ b/packages/api/tests/rich-text-sanitization.test.ts @@ -1,4 +1,9 @@ -import { Facet, RichText, UnicodeString, sanitizeRichText } from '../src' +import { + Facet, + RichText, + UnicodeString, + sanitizeRichText, +} from '../src/index.js' describe('sanitizeRichText: cleanNewlines', () => { it('removes more than two consecutive new lines', () => { diff --git a/packages/api/tests/rich-text.test.ts b/packages/api/tests/rich-text.test.ts index 7683babb3aa..362b4a6a4c7 100644 --- a/packages/api/tests/rich-text.test.ts +++ b/packages/api/tests/rich-text.test.ts @@ -1,4 +1,4 @@ -import { RichText } from '../src' +import { RichText } from '../src/index.js' describe('RichText', () => { it('converts entities to facets correctly', () => { diff --git a/packages/api/tests/util/moderation-behavior.ts b/packages/api/tests/util/moderation-behavior.ts index f30986852f9..d091f3f065a 100644 --- a/packages/api/tests/util/moderation-behavior.ts +++ b/packages/api/tests/util/moderation-behavior.ts @@ -3,8 +3,8 @@ import { LabelPreference, ModerationOpts, ModerationUI, -} from '../../src' -import { mock as m } from '../../src/mocker' +} from '../../src/index.js' +import { mock as m } from '../../src/mocker.js' export type ModerationTestSuiteResultFlag = | 'filter' diff --git a/packages/aws/src/bunny.ts b/packages/aws/src/bunny.ts index dadee53d554..da6b19a9d1c 100644 --- a/packages/aws/src/bunny.ts +++ b/packages/aws/src/bunny.ts @@ -1,5 +1,5 @@ import { allFulfilled } from '@atproto/common' -import { ImageInvalidator } from './types' +import { ImageInvalidator } from './types.js' export type BunnyConfig = { accessKey: string diff --git a/packages/aws/src/cloudfront.ts b/packages/aws/src/cloudfront.ts index 0577e4cc613..0cda3326587 100644 --- a/packages/aws/src/cloudfront.ts +++ b/packages/aws/src/cloudfront.ts @@ -1,5 +1,5 @@ import * as aws from '@aws-sdk/client-cloudfront' -import { ImageInvalidator } from './types' +import { ImageInvalidator } from './types.js' export type CloudfrontConfig = { distributionId: string diff --git a/packages/aws/src/index.ts b/packages/aws/src/index.ts index aa11f2c7ef0..5c186736e59 100644 --- a/packages/aws/src/index.ts +++ b/packages/aws/src/index.ts @@ -1,6 +1,6 @@ -export * from './kms' -export * from './s3' -export * from './cloudfront' -export * from './bunny' -export * from './util' -export * from './types' +export * from './kms.js' +export * from './s3.js' +export * from './cloudfront.js' +export * from './bunny.js' +export * from './util.js' +export * from './types.js' diff --git a/packages/aws/src/util.ts b/packages/aws/src/util.ts index 90e9fc4d21f..f9bbddb5025 100644 --- a/packages/aws/src/util.ts +++ b/packages/aws/src/util.ts @@ -1,5 +1,5 @@ import { allFulfilled } from '@atproto/common' -import { ImageInvalidator } from './types' +import { ImageInvalidator } from './types.js' export class MultiImageInvalidator implements ImageInvalidator { constructor(public invalidators: ImageInvalidator[]) {} diff --git a/packages/bsky/bin/migration-create.ts b/packages/bsky/bin/migration-create.ts index 4d77afd94fd..d4cc7aac0a6 100644 --- a/packages/bsky/bin/migration-create.ts +++ b/packages/bsky/bin/migration-create.ts @@ -27,7 +27,7 @@ export async function main() { await fs.writeFile(path.join(dir, `${filename}.ts`), template, { flag: 'wx' }) await fs.writeFile( path.join(dir, 'index.ts'), - `export * as _${prefix} from './${filename}'\n`, + `export * as _${prefix} from './${filename}.js'\n`, { flag: 'a' }, ) } diff --git a/packages/bsky/jest.config.js b/packages/bsky/jest.config.js deleted file mode 100644 index def188c3092..00000000000 --- a/packages/bsky/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('jest').Config} */ -module.exports = { - displayName: 'Bsky App View', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, - transformIgnorePatterns: ['/node_modules/.pnpm/(?!(get-port)@)'], - testTimeout: 60000, - setupFiles: ['/../../jest.setup.ts'], - moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, -} diff --git a/packages/bsky/package.json b/packages/bsky/package.json index b75f8c8594c..6cbc2e0400a 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -20,9 +20,9 @@ "prebuild": "pnpm run codegen", "build": "tsc --build tsconfig.build.json", "start": "node --enable-source-maps dist/bin.js", - "test": "../dev-infra/with-test-redis-and-db.sh jest", + "test": "../dev-infra/with-test-redis-and-db.sh vitest run", "test:log": "tail -50 test.log | pino-pretty", - "test:updateSnapshot": "../dev-infra/with-test-redis-and-db.sh jest --updateSnapshot", + "test:updateSnapshot": "../dev-infra/with-test-redis-and-db.sh vitest run --update", "migration:create": "ts-node ./bin/migration-create.ts", "buf:gen": "buf generate ../bsync/proto && buf generate ./proto" }, @@ -80,14 +80,13 @@ "@bufbuild/protoc-gen-es": "^1.5.0", "@connectrpc/protoc-gen-connect-es": "^1.1.4", "@did-plc/server": "^0.0.1", - "@jest/globals": "28", "@types/cors": "^2.8.12", "@types/express": "^4.17.13", "@types/express-serve-static-core": "^4.17.36", "@types/pg": "^8.6.6", "@types/qs": "^6.9.7", - "jest": "^28.1.2", "ts-node": "^10.8.2", - "typescript": "^6.0.3" + "typescript": "^6.0.3", + "vitest": "^4.0.16" } } diff --git a/packages/bsky/src/api/age-assurance/index.ts b/packages/bsky/src/api/age-assurance/index.ts index 91d441db49b..b99316a01d7 100644 --- a/packages/bsky/src/api/age-assurance/index.ts +++ b/packages/bsky/src/api/age-assurance/index.ts @@ -1,9 +1,9 @@ import { Router, raw } from 'express' -import { AppContext } from '../../context' -import { webhookAuth } from '../kws/webhook' -import { handler as ageVerifiedRedirect } from './redirects/kws-age-verified' -import { AppContextWithAA } from './types' -import { handler as ageVerifiedWebhook } from './webhooks/kws-age-verified' +import { AppContext } from '../../context.js' +import { webhookAuth } from '../kws/webhook.js' +import { handler as ageVerifiedRedirect } from './redirects/kws-age-verified.js' +import { AppContextWithAA } from './types.js' +import { handler as ageVerifiedWebhook } from './webhooks/kws-age-verified.js' export const createRouter = (ctx: AppContext): Router => { assertAppContextWithAgeAssuranceClient(ctx) diff --git a/packages/bsky/src/api/age-assurance/kws/external-payload.test.ts b/packages/bsky/src/api/age-assurance/kws/external-payload.test.ts index 18d5138b6e2..3da44d353fd 100644 --- a/packages/bsky/src/api/age-assurance/kws/external-payload.test.ts +++ b/packages/bsky/src/api/age-assurance/kws/external-payload.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from '@jest/globals' +import { describe, expect, it } from 'vitest' import { KWSExternalPayloadVersion, parseKWSExternalPayloadV1WithV2Compat, @@ -6,7 +6,7 @@ import { parseKWSExternalPayloadVersion, serializeKWSExternalPayloadV1, serializeKWSExternalPayloadV2, -} from './external-payload' +} from './external-payload.js' describe('parseKWSExternalPayloadVersion', () => { it('should return V2 for "2"', () => { diff --git a/packages/bsky/src/api/age-assurance/redirects/kws-age-verified.ts b/packages/bsky/src/api/age-assurance/redirects/kws-age-verified.ts index 4175e9a8226..bb0de65aedc 100644 --- a/packages/bsky/src/api/age-assurance/redirects/kws-age-verified.ts +++ b/packages/bsky/src/api/age-assurance/redirects/kws-age-verified.ts @@ -1,15 +1,15 @@ import express, { RequestHandler } from 'express' -import { ageAssuranceLogger as logger } from '../../../logger' -import { getClientUa, validateSignature } from '../../kws/util' -import { AGE_ASSURANCE_CONFIG } from '../const' -import { parseKWSAgeVerifiedStatus } from '../kws/age-verified' +import { ageAssuranceLogger as logger } from '../../../logger.js' +import { getClientUa, validateSignature } from '../../kws/util.js' +import { AGE_ASSURANCE_CONFIG } from '../const.js' +import { parseKWSAgeVerifiedStatus } from '../kws/age-verified.js' import { type KWSExternalPayloadV2, parseKWSExternalPayloadV2, -} from '../kws/external-payload' -import { createEvent } from '../stash' -import { AppContextWithAA } from '../types' -import { computeAgeAssuranceAccessOrThrow } from '../util' +} from '../kws/external-payload.js' +import { createEvent } from '../stash.js' +import { AppContextWithAA } from '../types.js' +import { computeAgeAssuranceAccessOrThrow } from '../util.js' function parseQueryParams( ctx: AppContextWithAA, diff --git a/packages/bsky/src/api/age-assurance/stash.ts b/packages/bsky/src/api/age-assurance/stash.ts index a281fc5778a..fbda61e31d0 100644 --- a/packages/bsky/src/api/age-assurance/stash.ts +++ b/packages/bsky/src/api/age-assurance/stash.ts @@ -1,8 +1,8 @@ import { TID } from '@atproto/common' import { DatetimeString } from '@atproto/syntax' -import { AppContext } from '../../context' +import { AppContext } from '../../context.js' import { app } from '../../lexicons/index.js' -import { Namespaces } from '../../stash' +import { Namespaces } from '../../stash.js' export async function createEvent( ctx: AppContext, diff --git a/packages/bsky/src/api/age-assurance/types.ts b/packages/bsky/src/api/age-assurance/types.ts index b766c8a986f..fea35272ca1 100644 --- a/packages/bsky/src/api/age-assurance/types.ts +++ b/packages/bsky/src/api/age-assurance/types.ts @@ -1,6 +1,6 @@ -import { KwsConfig, ServerConfig } from '../../config' -import { AppContext } from '../../context' -import { KwsClient } from '../../kws' +import { KwsConfig, ServerConfig } from '../../config.js' +import { AppContext } from '../../context.js' +import { KwsClient } from '../../kws.js' export type AppContextWithAA = AppContext & { kwsClient: KwsClient diff --git a/packages/bsky/src/api/age-assurance/webhooks/kws-age-verified.ts b/packages/bsky/src/api/age-assurance/webhooks/kws-age-verified.ts index 9ce053268ea..af436b32bf1 100644 --- a/packages/bsky/src/api/age-assurance/webhooks/kws-age-verified.ts +++ b/packages/bsky/src/api/age-assurance/webhooks/kws-age-verified.ts @@ -1,14 +1,14 @@ import express, { RequestHandler } from 'express' -import { ageAssuranceLogger as logger } from '../../../logger' -import { AGE_ASSURANCE_CONFIG } from '../const' +import { ageAssuranceLogger as logger } from '../../../logger.js' +import { AGE_ASSURANCE_CONFIG } from '../const.js' import { type KWSWebhookAgeVerified, parseKWSAgeVerifiedWebhook, -} from '../kws/age-verified' -import { parseKWSExternalPayloadV2 } from '../kws/external-payload' -import { createEvent } from '../stash' -import { type AppContextWithAA } from '../types' -import { computeAgeAssuranceAccessOrThrow } from '../util' +} from '../kws/age-verified.js' +import { parseKWSExternalPayloadV2 } from '../kws/external-payload.js' +import { createEvent } from '../stash.js' +import { type AppContextWithAA } from '../types.js' +import { computeAgeAssuranceAccessOrThrow } from '../util.js' export const handler = (ctx: AppContextWithAA): RequestHandler => diff --git a/packages/bsky/src/api/app/bsky/actor/getProfile.ts b/packages/bsky/src/api/app/bsky/actor/getProfile.ts index b387b8c3713..98b657e79e0 100644 --- a/packages/bsky/src/api/app/bsky/actor/getProfile.ts +++ b/packages/bsky/src/api/app/bsky/actor/getProfile.ts @@ -1,15 +1,15 @@ import { DidString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline, noRules } from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +import { createPipeline, noRules } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getProfile = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/actor/getProfiles.ts b/packages/bsky/src/api/app/bsky/actor/getProfiles.ts index 50d14578063..6367e40d3be 100644 --- a/packages/bsky/src/api/app/bsky/actor/getProfiles.ts +++ b/packages/bsky/src/api/app/bsky/actor/getProfiles.ts @@ -1,16 +1,16 @@ import { mapDefined } from '@atproto/common' import { DidString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline, noRules } from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +import { createPipeline, noRules } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getProfile = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts index 3a2062c121a..52d33e2c4c3 100644 --- a/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts +++ b/packages/bsky/src/api/app/bsky/actor/getSuggestions.ts @@ -1,18 +1,18 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString, isDidString } from '@atproto/lex' import { Headers as HeadersMap, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getSuggestions = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/actor/searchActors.ts b/packages/bsky/src/api/app/bsky/actor/searchActors.ts index b2f193a99e8..aab61d4b5ee 100644 --- a/packages/bsky/src/api/app/bsky/actor/searchActors.ts +++ b/packages/bsky/src/api/app/bsky/actor/searchActors.ts @@ -1,10 +1,10 @@ import { mapDefined } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -12,9 +12,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const searchActors = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts b/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts index a239912b0e9..b83e4cd2091 100644 --- a/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts +++ b/packages/bsky/src/api/app/bsky/actor/searchActorsTypeahead.ts @@ -1,9 +1,9 @@ import { mapDefined } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,9 +11,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const searchActorsTypeahead = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/ageassurance/begin.ts b/packages/bsky/src/api/app/bsky/ageassurance/begin.ts index 047caa0c4da..2d69e87d305 100644 --- a/packages/bsky/src/api/app/bsky/ageassurance/begin.ts +++ b/packages/bsky/src/api/app/bsky/ageassurance/begin.ts @@ -7,24 +7,24 @@ import { MethodNotImplementedError, Server, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' type InputSchema = app.bsky.ageassurance.begin.$InputBody import { app } from '../../../../lexicons/index.js' -import { httpLogger as log } from '../../../../logger' -import { ActorInfo } from '../../../../proto/bsky_pb' -import { AGE_ASSURANCE_CONFIG } from '../../../age-assurance/const' +import { httpLogger as log } from '../../../../logger.js' +import { ActorInfo } from '../../../../proto/bsky_pb.js' +import { AGE_ASSURANCE_CONFIG } from '../../../age-assurance/const.js' import { KWS_SUPPORTED_LANGUAGES, KWS_V2_COUNTRIES, -} from '../../../age-assurance/kws/const' +} from '../../../age-assurance/kws/const.js' import { KWSExternalPayloadTooLargeError, KWSExternalPayloadVersion, serializeKWSExternalPayloadV2, -} from '../../../age-assurance/kws/external-payload' -import { createEvent } from '../../../age-assurance/stash' -import { createLocationString } from '../../../age-assurance/util' -import { getClientUa } from '../../../kws/util' +} from '../../../age-assurance/kws/external-payload.js' +import { createEvent } from '../../../age-assurance/stash.js' +import { createLocationString } from '../../../age-assurance/util.js' +import { getClientUa } from '../../../kws/util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.ageassurance.begin, { diff --git a/packages/bsky/src/api/app/bsky/ageassurance/getConfig.ts b/packages/bsky/src/api/app/bsky/ageassurance/getConfig.ts index f456a86ab60..b9529087380 100644 --- a/packages/bsky/src/api/app/bsky/ageassurance/getConfig.ts +++ b/packages/bsky/src/api/app/bsky/ageassurance/getConfig.ts @@ -1,6 +1,6 @@ import { Server } from '@atproto/xrpc-server' -import { AGE_ASSURANCE_CONFIG } from '../../../../api/age-assurance/const' -import { AppContext } from '../../../../context' +import { AGE_ASSURANCE_CONFIG } from '../../../../api/age-assurance/const.js' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/ageassurance/getState.ts b/packages/bsky/src/api/app/bsky/ageassurance/getState.ts index a053c0b27fa..a4d3987bc74 100644 --- a/packages/bsky/src/api/app/bsky/ageassurance/getState.ts +++ b/packages/bsky/src/api/app/bsky/ageassurance/getState.ts @@ -1,8 +1,8 @@ import { DatetimeString } from '@atproto/syntax' import { Server, UpstreamFailureError } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { ActorInfo } from '../../../../proto/bsky_pb' +import { ActorInfo } from '../../../../proto/bsky_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.ageassurance.getState, { diff --git a/packages/bsky/src/api/app/bsky/bookmark/createBookmark.ts b/packages/bsky/src/api/app/bsky/bookmark/createBookmark.ts index 3a21671db45..ea81af7c167 100644 --- a/packages/bsky/src/api/app/bsky/bookmark/createBookmark.ts +++ b/packages/bsky/src/api/app/bsky/bookmark/createBookmark.ts @@ -1,9 +1,9 @@ import { TID } from '@atproto/common' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { Namespaces } from '../../../../stash' -import { validateUri } from './util' +import { Namespaces } from '../../../../stash.js' +import { validateUri } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.bookmark.createBookmark, { diff --git a/packages/bsky/src/api/app/bsky/bookmark/deleteBookmark.ts b/packages/bsky/src/api/app/bsky/bookmark/deleteBookmark.ts index 4d4f03e88c9..1ef0c3d515b 100644 --- a/packages/bsky/src/api/app/bsky/bookmark/deleteBookmark.ts +++ b/packages/bsky/src/api/app/bsky/bookmark/deleteBookmark.ts @@ -1,8 +1,8 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { Namespaces } from '../../../../stash' -import { validateUri } from './util' +import { Namespaces } from '../../../../stash.js' +import { validateUri } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.bookmark.deleteBookmark, { diff --git a/packages/bsky/src/api/app/bsky/bookmark/getBookmarks.ts b/packages/bsky/src/api/app/bsky/bookmark/getBookmarks.ts index 01b035734fa..bd7d7a4b0a5 100644 --- a/packages/bsky/src/api/app/bsky/bookmark/getBookmarks.ts +++ b/packages/bsky/src/api/app/bsky/bookmark/getBookmarks.ts @@ -1,7 +1,10 @@ import { mapDefined } from '@atproto/common' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -9,10 +12,10 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { BookmarkInfo } from '../../../../proto/bsky_pb' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { BookmarkInfo } from '../../../../proto/bsky_pb.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getBookmarks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/contact/dismissMatch.ts b/packages/bsky/src/api/app/bsky/contact/dismissMatch.ts index f58a4149652..e807b564408 100644 --- a/packages/bsky/src/api/app/bsky/contact/dismissMatch.ts +++ b/packages/bsky/src/api/app/bsky/contact/dismissMatch.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.contact.dismissMatch, { diff --git a/packages/bsky/src/api/app/bsky/contact/getMatches.ts b/packages/bsky/src/api/app/bsky/contact/getMatches.ts index b1c36a5c1c8..36ff7b1d2ac 100644 --- a/packages/bsky/src/api/app/bsky/contact/getMatches.ts +++ b/packages/bsky/src/api/app/bsky/contact/getMatches.ts @@ -1,21 +1,21 @@ import { mapDefined } from '@atproto/common' import { DidString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtxWithViewer, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { RolodexClient } from '../../../../rolodex' -import { Views } from '../../../../views' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +} from '../../../../pipeline.js' +import { RolodexClient } from '../../../../rolodex.js' +import { Views } from '../../../../views/index.js' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { const getMatches = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/contact/getSyncStatus.ts b/packages/bsky/src/api/app/bsky/contact/getSyncStatus.ts index 6036f28bd46..f27d35e0143 100644 --- a/packages/bsky/src/api/app/bsky/contact/getSyncStatus.ts +++ b/packages/bsky/src/api/app/bsky/contact/getSyncStatus.ts @@ -1,8 +1,8 @@ import { DatetimeString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.contact.getSyncStatus, { diff --git a/packages/bsky/src/api/app/bsky/contact/importContacts.ts b/packages/bsky/src/api/app/bsky/contact/importContacts.ts index afc09316800..a2a7fb3ae8c 100644 --- a/packages/bsky/src/api/app/bsky/contact/importContacts.ts +++ b/packages/bsky/src/api/app/bsky/contact/importContacts.ts @@ -1,23 +1,23 @@ import { mapDefined } from '@atproto/common' import { DidString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { ImportContactsMatch } from '../../../../proto/rolodex_pb' -import { RolodexClient } from '../../../../rolodex' -import { Views } from '../../../../views' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +} from '../../../../pipeline.js' +import { ImportContactsMatch } from '../../../../proto/rolodex_pb.js' +import { RolodexClient } from '../../../../rolodex.js' +import { Views } from '../../../../views/index.js' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { const importContacts = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/contact/removeData.ts b/packages/bsky/src/api/app/bsky/contact/removeData.ts index 9827be14769..664436e2178 100644 --- a/packages/bsky/src/api/app/bsky/contact/removeData.ts +++ b/packages/bsky/src/api/app/bsky/contact/removeData.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.contact.removeData, { diff --git a/packages/bsky/src/api/app/bsky/contact/sendNotification.ts b/packages/bsky/src/api/app/bsky/contact/sendNotification.ts index b0914ae6def..b48630ba4d8 100644 --- a/packages/bsky/src/api/app/bsky/contact/sendNotification.ts +++ b/packages/bsky/src/api/app/bsky/contact/sendNotification.ts @@ -1,9 +1,9 @@ import { TID } from '@atproto/common' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { Namespaces } from '../../../../stash' -import { assertRolodexOrThrowUnimplemented } from './util' +import { Namespaces } from '../../../../stash.js' +import { assertRolodexOrThrowUnimplemented } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.contact.sendNotification, { diff --git a/packages/bsky/src/api/app/bsky/contact/startPhoneVerification.ts b/packages/bsky/src/api/app/bsky/contact/startPhoneVerification.ts index 172e04b0a85..52304415236 100644 --- a/packages/bsky/src/api/app/bsky/contact/startPhoneVerification.ts +++ b/packages/bsky/src/api/app/bsky/contact/startPhoneVerification.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.contact.startPhoneVerification, { diff --git a/packages/bsky/src/api/app/bsky/contact/util.ts b/packages/bsky/src/api/app/bsky/contact/util.ts index e602fdb1232..b9c22efc53d 100644 --- a/packages/bsky/src/api/app/bsky/contact/util.ts +++ b/packages/bsky/src/api/app/bsky/contact/util.ts @@ -4,8 +4,8 @@ import { InvalidRequestError, MethodNotImplementedError, } from '@atproto/xrpc-server' -import { AppContext } from '../../../..' -import { RolodexClient } from '../../../../rolodex' +import { AppContext } from '../../../../index.js' +import { RolodexClient } from '../../../../rolodex.js' export function assertRolodexOrThrowUnimplemented( ctx: AppContext, diff --git a/packages/bsky/src/api/app/bsky/contact/verifyPhone.ts b/packages/bsky/src/api/app/bsky/contact/verifyPhone.ts index be24a051bf0..f85faa7b5ee 100644 --- a/packages/bsky/src/api/app/bsky/contact/verifyPhone.ts +++ b/packages/bsky/src/api/app/bsky/contact/verifyPhone.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util' +import { assertRolodexOrThrowUnimplemented, callRolodexClient } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.contact.verifyPhone, { diff --git a/packages/bsky/src/api/app/bsky/draft/createDraft.ts b/packages/bsky/src/api/app/bsky/draft/createDraft.ts index eb59649212e..5cbb66d6376 100644 --- a/packages/bsky/src/api/app/bsky/draft/createDraft.ts +++ b/packages/bsky/src/api/app/bsky/draft/createDraft.ts @@ -1,8 +1,8 @@ import { TID } from '@atproto/common' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { Namespaces } from '../../../../stash' +import { Namespaces } from '../../../../stash.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.draft.createDraft, { diff --git a/packages/bsky/src/api/app/bsky/draft/deleteDraft.ts b/packages/bsky/src/api/app/bsky/draft/deleteDraft.ts index c3c4caf37f9..947c2de5e80 100644 --- a/packages/bsky/src/api/app/bsky/draft/deleteDraft.ts +++ b/packages/bsky/src/api/app/bsky/draft/deleteDraft.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { app } from '../../../../lexicons' -import { Namespaces } from '../../../../stash' +import { AppContext } from '../../../../context.js' +import { app } from '../../../../lexicons/index.js' +import { Namespaces } from '../../../../stash.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.draft.deleteDraft, { diff --git a/packages/bsky/src/api/app/bsky/draft/getDrafts.ts b/packages/bsky/src/api/app/bsky/draft/getDrafts.ts index ec1cb032908..e8607cd56ab 100644 --- a/packages/bsky/src/api/app/bsky/draft/getDrafts.ts +++ b/packages/bsky/src/api/app/bsky/draft/getDrafts.ts @@ -1,6 +1,6 @@ import { DatetimeString, lexParse } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/draft/updateDraft.ts b/packages/bsky/src/api/app/bsky/draft/updateDraft.ts index 36ac696a011..95c47bdd43b 100644 --- a/packages/bsky/src/api/app/bsky/draft/updateDraft.ts +++ b/packages/bsky/src/api/app/bsky/draft/updateDraft.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { Namespaces } from '../../../../stash' +import { Namespaces } from '../../../../stash.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.draft.updateDraft, { diff --git a/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts b/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts index ce46f1a1cfe..8562b6b0310 100644 --- a/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts +++ b/packages/bsky/src/api/app/bsky/feed/getActorFeeds.ts @@ -1,18 +1,18 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline, noRules } from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline, noRules } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getActorFeeds = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts b/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts index 6f53bbc3adc..aa7c33c0e04 100644 --- a/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts +++ b/packages/bsky/src/api/app/bsky/feed/getActorLikes.ts @@ -1,20 +1,20 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { FeedItem } from '../../../../hydration/feed' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { FeedItem } from '../../../../hydration/feed.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { uriToDid as creatorFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getActorLikes = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts index 8ec4d2a99f9..0b1b9a6d569 100644 --- a/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getAuthorFeed.ts @@ -1,23 +1,23 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { Actor } from '../../../../hydration/actor' -import { FeedItem, Post } from '../../../../hydration/feed' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { Actor } from '../../../../hydration/actor.js' +import { FeedItem, Post } from '../../../../hydration/feed.js' import { HydrateCtx, HydrationState, Hydrator, mergeStates, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { FeedType } from '../../../../proto/bsky_pb' -import { safePinnedPost, uriToDid } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { FeedType } from '../../../../proto/bsky_pb.js' +import { safePinnedPost, uriToDid } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getAuthorFeed = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getFeed.ts b/packages/bsky/src/api/app/bsky/feed/getFeed.ts index 25abc365993..ab1e5a0cb2b 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeed.ts @@ -13,15 +13,15 @@ import { XRPCError, serverTimingHeader, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { Code, getServiceEndpoint, isDataplaneError, unpackIdentityServices, -} from '../../../../data-plane' -import { FeedItem } from '../../../../hydration/feed' -import { HydrateCtx } from '../../../../hydration/hydrator' +} from '../../../../data-plane/index.js' +import { FeedItem } from '../../../../hydration/feed.js' +import { HydrateCtx } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -29,9 +29,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb' -import { BSKY_USER_AGENT, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb.js' +import { BSKY_USER_AGENT, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getFeed = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts b/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts index 24a6ceb653c..91c1d9ddb22 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeedGenerator.ts @@ -1,14 +1,14 @@ import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { Code, getServiceEndpoint, isDataplaneError, unpackIdentityServices, -} from '../../../../data-plane' +} from '../../../../data-plane/index.js' import { app } from '../../../../lexicons/index.js' -import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb' -import { resHeaders } from '../../../util' +import { GetIdentityByDidResponse } from '../../../../proto/bsky_pb.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.feed.getFeedGenerator, { diff --git a/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts b/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts index e09529e63f1..f2b3257697f 100644 --- a/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts +++ b/packages/bsky/src/api/app/bsky/feed/getFeedGenerators.ts @@ -1,16 +1,16 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline, noRules } from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +import { createPipeline, noRules } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getFeedGenerators = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getLikes.ts b/packages/bsky/src/api/app/bsky/feed/getLikes.ts index ace3b46ba34..c3585652714 100644 --- a/packages/bsky/src/api/app/bsky/feed/getLikes.ts +++ b/packages/bsky/src/api/app/bsky/feed/getLikes.ts @@ -6,18 +6,18 @@ import { normalizeDatetimeAlways, } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { RulesFnInput, createPipeline } from '../../../../pipeline' -import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { RulesFnInput, createPipeline } from '../../../../pipeline.js' +import { uriToDid as creatorFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getLikes = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/feed/getListFeed.ts b/packages/bsky/src/api/app/bsky/feed/getListFeed.ts index a3ccd708692..3f5c2096773 100644 --- a/packages/bsky/src/api/app/bsky/feed/getListFeed.ts +++ b/packages/bsky/src/api/app/bsky/feed/getListFeed.ts @@ -1,21 +1,21 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { FeedItem } from '../../../../hydration/feed' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { FeedItem } from '../../../../hydration/feed.js' import { HydrateCtx, HydrationState, Hydrator, mergeStates, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { uriToDid } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { uriToDid } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getListFeed = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getPostThread.ts b/packages/bsky/src/api/app/bsky/feed/getPostThread.ts index e25aefa2f35..9ce30b10b5f 100644 --- a/packages/bsky/src/api/app/bsky/feed/getPostThread.ts +++ b/packages/bsky/src/api/app/bsky/feed/getPostThread.ts @@ -1,9 +1,13 @@ import { AtUriString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { ServerConfig } from '../../../../config' -import { AppContext } from '../../../../context' -import { Code, DataPlaneClient, isDataplaneError } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { ServerConfig } from '../../../../config.js' +import { AppContext } from '../../../../context.js' +import { + Code, + DataPlaneClient, + isDataplaneError, +} from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,10 +15,10 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { postUriToThreadgateUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { ATPROTO_REPO_REV, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { postUriToThreadgateUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { ATPROTO_REPO_REV, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getPostThread = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getPosts.ts b/packages/bsky/src/api/app/bsky/feed/getPosts.ts index b13764d436e..15df847680b 100644 --- a/packages/bsky/src/api/app/bsky/feed/getPosts.ts +++ b/packages/bsky/src/api/app/bsky/feed/getPosts.ts @@ -1,17 +1,17 @@ import { dedupeStrs, mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { uriToDid as creatorFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getPosts = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/feed/getQuotes.ts b/packages/bsky/src/api/app/bsky/feed/getQuotes.ts index 5dbd0aafc62..352c1403a3d 100644 --- a/packages/bsky/src/api/app/bsky/feed/getQuotes.ts +++ b/packages/bsky/src/api/app/bsky/feed/getQuotes.ts @@ -1,18 +1,18 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { uriToDid } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { uriToDid } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getQuotes = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts b/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts index c74733a3289..85ee6ec57fb 100644 --- a/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts +++ b/packages/bsky/src/api/app/bsky/feed/getRepostedBy.ts @@ -1,18 +1,18 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { uriToDid as creatorFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getRepostedBy = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts b/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts index 629f62eb2f8..d0bd6a547fe 100644 --- a/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts +++ b/packages/bsky/src/api/app/bsky/feed/getSuggestedFeeds.ts @@ -1,10 +1,10 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { resHeaders } from '../../../util' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.feed.getSuggestedFeeds, { diff --git a/packages/bsky/src/api/app/bsky/feed/getTimeline.ts b/packages/bsky/src/api/app/bsky/feed/getTimeline.ts index ad141216a9e..8ad7c84ea2d 100644 --- a/packages/bsky/src/api/app/bsky/feed/getTimeline.ts +++ b/packages/bsky/src/api/app/bsky/feed/getTimeline.ts @@ -1,19 +1,19 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { FeedItem } from '../../../../hydration/feed' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { FeedItem } from '../../../../hydration/feed.js' import { HydrateCtxWithViewer, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline } from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { createPipeline } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getTimeline = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/feed/searchPosts.ts b/packages/bsky/src/api/app/bsky/feed/searchPosts.ts index 5193a130d4c..646facca074 100644 --- a/packages/bsky/src/api/app/bsky/feed/searchPosts.ts +++ b/packages/bsky/src/api/app/bsky/feed/searchPosts.ts @@ -1,15 +1,15 @@ import { mapDefined } from '@atproto/common' import { AtUriString, Client } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { ServerConfig } from '../../../../config' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' +import { ServerConfig } from '../../../../config.js' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' import { PostSearchQuery, parsePostSearchQuery, -} from '../../../../data-plane/server/util' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +} from '../../../../data-plane/server/util.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -17,10 +17,10 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { uriToDid as creatorFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const searchPosts = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts b/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts index 6c49cb68fd5..64554d0e722 100644 --- a/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getActorStarterPacks.ts @@ -1,10 +1,10 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -12,9 +12,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getActorStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getBlocks.ts b/packages/bsky/src/api/app/bsky/graph/getBlocks.ts index 5931565a88d..296f15c1014 100644 --- a/packages/bsky/src/api/app/bsky/graph/getBlocks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getBlocks.ts @@ -1,8 +1,11 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,9 +13,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getBlocks = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/graph/getFollowers.ts b/packages/bsky/src/api/app/bsky/graph/getFollowers.ts index 12dc3009666..a50a94ed8e0 100644 --- a/packages/bsky/src/api/app/bsky/graph/getFollowers.ts +++ b/packages/bsky/src/api/app/bsky/graph/getFollowers.ts @@ -1,12 +1,12 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,10 +14,10 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { uriToDid as didFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { uriToDid as didFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getFollowers = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getFollows.ts b/packages/bsky/src/api/app/bsky/graph/getFollows.ts index d70b0c64ad6..448722b4202 100644 --- a/packages/bsky/src/api/app/bsky/graph/getFollows.ts +++ b/packages/bsky/src/api/app/bsky/graph/getFollows.ts @@ -1,12 +1,12 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,9 +14,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getFollows = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts b/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts index 6ce336665d4..82c6bf5ca80 100644 --- a/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts +++ b/packages/bsky/src/api/app/bsky/graph/getKnownFollowers.ts @@ -1,8 +1,11 @@ import { mapDefined } from '@atproto/common' import { DidString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,9 +13,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getKnownFollowers = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getList.ts b/packages/bsky/src/api/app/bsky/graph/getList.ts index 45fc4e26b2d..c5dbc8371d1 100644 --- a/packages/bsky/src/api/app/bsky/graph/getList.ts +++ b/packages/bsky/src/api/app/bsky/graph/getList.ts @@ -1,13 +1,13 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -15,11 +15,11 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { ListItemInfo } from '../../../../proto/bsky_pb' -import { uriToDid as didFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { ListItemInfo } from '../../../../proto/bsky_pb.js' +import { uriToDid as didFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getList = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts b/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts index 4bc49dd71be..1a5289d2c0d 100644 --- a/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getListBlocks.ts @@ -1,8 +1,11 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,9 +13,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getListBlocks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getListMutes.ts b/packages/bsky/src/api/app/bsky/graph/getListMutes.ts index 3411a129bd4..d5228aee43c 100644 --- a/packages/bsky/src/api/app/bsky/graph/getListMutes.ts +++ b/packages/bsky/src/api/app/bsky/graph/getListMutes.ts @@ -1,8 +1,11 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,9 +13,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getListMutes = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getLists.ts b/packages/bsky/src/api/app/bsky/graph/getLists.ts index bf2eddecb02..06e81dd0332 100644 --- a/packages/bsky/src/api/app/bsky/graph/getLists.ts +++ b/packages/bsky/src/api/app/bsky/graph/getLists.ts @@ -1,9 +1,9 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,9 +11,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' const CURATELIST = app.bsky.graph.defs.curatelist.value const MODLIST = app.bsky.graph.defs.modlist.value diff --git a/packages/bsky/src/api/app/bsky/graph/getListsWithMembership.ts b/packages/bsky/src/api/app/bsky/graph/getListsWithMembership.ts index 7918e6a8b2f..fb9003ed59c 100644 --- a/packages/bsky/src/api/app/bsky/graph/getListsWithMembership.ts +++ b/packages/bsky/src/api/app/bsky/graph/getListsWithMembership.ts @@ -1,9 +1,12 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,9 +14,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' const CURATELIST = app.bsky.graph.defs.curatelist.value const MODLIST = app.bsky.graph.defs.modlist.value diff --git a/packages/bsky/src/api/app/bsky/graph/getMutes.ts b/packages/bsky/src/api/app/bsky/graph/getMutes.ts index dfab470af83..e35e2c6002c 100644 --- a/packages/bsky/src/api/app/bsky/graph/getMutes.ts +++ b/packages/bsky/src/api/app/bsky/graph/getMutes.ts @@ -1,8 +1,11 @@ import { mapDefined } from '@atproto/common' import { DidString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,9 +13,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getMutes = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/graph/getRelationships.ts b/packages/bsky/src/api/app/bsky/graph/getRelationships.ts index 947d3c06cef..b29e4904e55 100644 --- a/packages/bsky/src/api/app/bsky/graph/getRelationships.ts +++ b/packages/bsky/src/api/app/bsky/graph/getRelationships.ts @@ -1,5 +1,5 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts b/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts index 72edb5a7bda..d6c57369a2b 100644 --- a/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts +++ b/packages/bsky/src/api/app/bsky/graph/getStarterPack.ts @@ -1,7 +1,7 @@ import { AtUriString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -9,9 +9,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getStarterPack = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts b/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts index 1232eedb588..873e27ea4b2 100644 --- a/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/graph/getStarterPacks.ts @@ -1,16 +1,16 @@ import { dedupeStrs, mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, HydrationState, Hydrator, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' -import { createPipeline, noRules } from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +import { createPipeline, noRules } from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getStarterPacksWithMembership.ts b/packages/bsky/src/api/app/bsky/graph/getStarterPacksWithMembership.ts index 2a39813fa21..39df0133da0 100644 --- a/packages/bsky/src/api/app/bsky/graph/getStarterPacksWithMembership.ts +++ b/packages/bsky/src/api/app/bsky/graph/getStarterPacksWithMembership.ts @@ -1,12 +1,12 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DidString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtxWithViewer, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,9 +14,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getStarterPacksWithMembership = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts index ae7e011bb83..089050f3b97 100644 --- a/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/getSuggestedFollowsByActor.ts @@ -6,8 +6,8 @@ import { InvalidRequestError, Server, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -15,9 +15,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getSuggestedFollowsByActor = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/muteActor.ts b/packages/bsky/src/api/app/bsky/graph/muteActor.ts index 94f0d87abbc..0c551c5caf2 100644 --- a/packages/bsky/src/api/app/bsky/graph/muteActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/muteActor.ts @@ -1,7 +1,7 @@ import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { MuteOperation_Type } from '../../../../proto/bsync_pb' +import { MuteOperation_Type } from '../../../../proto/bsync_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.graph.muteActor, { diff --git a/packages/bsky/src/api/app/bsky/graph/muteActorList.ts b/packages/bsky/src/api/app/bsky/graph/muteActorList.ts index d8b963c6040..4f0835a7f0f 100644 --- a/packages/bsky/src/api/app/bsky/graph/muteActorList.ts +++ b/packages/bsky/src/api/app/bsky/graph/muteActorList.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { MuteOperation_Type } from '../../../../proto/bsync_pb' +import { MuteOperation_Type } from '../../../../proto/bsync_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.graph.muteActorList, { diff --git a/packages/bsky/src/api/app/bsky/graph/muteThread.ts b/packages/bsky/src/api/app/bsky/graph/muteThread.ts index 7477e003b5f..1099503b9ad 100644 --- a/packages/bsky/src/api/app/bsky/graph/muteThread.ts +++ b/packages/bsky/src/api/app/bsky/graph/muteThread.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { MuteOperation_Type } from '../../../../proto/bsync_pb' +import { MuteOperation_Type } from '../../../../proto/bsync_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.graph.muteThread, { diff --git a/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts b/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts index 07cff23dc6e..e24b931417a 100644 --- a/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/graph/searchStarterPacks.ts @@ -1,10 +1,10 @@ import { mapDefined } from '@atproto/common' import { AtUriString, Client } from '@atproto/lex' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { DataPlaneClient } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { DataPlaneClient } from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -12,10 +12,10 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { uriToDid as creatorFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { uriToDid as creatorFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const searchStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts b/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts index 81a6dd91fde..2203fbe1ab2 100644 --- a/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts +++ b/packages/bsky/src/api/app/bsky/graph/unmuteActor.ts @@ -1,7 +1,7 @@ import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { MuteOperation_Type } from '../../../../proto/bsync_pb' +import { MuteOperation_Type } from '../../../../proto/bsync_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.graph.unmuteActor, { diff --git a/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts b/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts index 455f7a1961d..54a5bb6ff1f 100644 --- a/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts +++ b/packages/bsky/src/api/app/bsky/graph/unmuteActorList.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { MuteOperation_Type } from '../../../../proto/bsync_pb' +import { MuteOperation_Type } from '../../../../proto/bsync_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.graph.unmuteActorList, { diff --git a/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts b/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts index 3cac0821be8..2991d8c4657 100644 --- a/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts +++ b/packages/bsky/src/api/app/bsky/graph/unmuteThread.ts @@ -1,7 +1,7 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { MuteOperation_Type } from '../../../../proto/bsync_pb' +import { MuteOperation_Type } from '../../../../proto/bsync_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.graph.unmuteThread, { diff --git a/packages/bsky/src/api/app/bsky/labeler/getServices.ts b/packages/bsky/src/api/app/bsky/labeler/getServices.ts index 6d2be4455ed..7fcd9a2de73 100644 --- a/packages/bsky/src/api/app/bsky/labeler/getServices.ts +++ b/packages/bsky/src/api/app/bsky/labeler/getServices.ts @@ -1,8 +1,8 @@ import { mapDefined } from '@atproto/common' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { resHeaders } from '../../../util' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.labeler.getServices, { diff --git a/packages/bsky/src/api/app/bsky/notification/getPreferences.ts b/packages/bsky/src/api/app/bsky/notification/getPreferences.ts index d0013bbae87..b6d8ac3dee5 100644 --- a/packages/bsky/src/api/app/bsky/notification/getPreferences.ts +++ b/packages/bsky/src/api/app/bsky/notification/getPreferences.ts @@ -1,10 +1,10 @@ import assert from 'node:assert' import { Un$Typed } from '@atproto/lex' import { Server, UpstreamFailureError } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { GetNotificationPreferencesResponse } from '../../../../proto/bsky_pb' -import { protobufToLex } from './util' +import { GetNotificationPreferencesResponse } from '../../../../proto/bsky_pb.js' +import { protobufToLex } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.notification.getPreferences, { diff --git a/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts b/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts index 4455361aaf4..3782dececfc 100644 --- a/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts +++ b/packages/bsky/src/api/app/bsky/notification/getUnreadCount.ts @@ -1,7 +1,7 @@ import { DidString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -9,8 +9,8 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getUnreadCount = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/notification/listActivitySubscriptions.ts b/packages/bsky/src/api/app/bsky/notification/listActivitySubscriptions.ts index 86ce60c523b..94994955167 100644 --- a/packages/bsky/src/api/app/bsky/notification/listActivitySubscriptions.ts +++ b/packages/bsky/src/api/app/bsky/notification/listActivitySubscriptions.ts @@ -1,8 +1,11 @@ import { mapDefined } from '@atproto/common' import { DidString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,9 +13,9 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { clearlyBadCursor, resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { clearlyBadCursor, resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const listActivitySubscriptions = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/notification/listNotifications.ts b/packages/bsky/src/api/app/bsky/notification/listNotifications.ts index 93609270f9d..51b1e7d22d1 100644 --- a/packages/bsky/src/api/app/bsky/notification/listNotifications.ts +++ b/packages/bsky/src/api/app/bsky/notification/listNotifications.ts @@ -1,9 +1,12 @@ import { mapDefined } from '@atproto/common' import { AtUriString, DatetimeString, DidString } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { ServerConfig } from '../../../../config' -import { AppContext } from '../../../../context' -import { HydrateCtxWithViewer, Hydrator } from '../../../../hydration/hydrator' +import { ServerConfig } from '../../../../config.js' +import { AppContext } from '../../../../context.js' +import { + HydrateCtxWithViewer, + Hydrator, +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,12 +14,12 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Notification } from '../../../../proto/bsky_pb' -import { uriToDid as didFromUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { isPostRecordType } from '../../../../views/types' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Notification } from '../../../../proto/bsky_pb.js' +import { uriToDid as didFromUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { isPostRecordType } from '../../../../views/types.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const listNotifications = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/notification/putActivitySubscription.ts b/packages/bsky/src/api/app/bsky/notification/putActivitySubscription.ts index 6407c930c36..1aea69fcaa3 100644 --- a/packages/bsky/src/api/app/bsky/notification/putActivitySubscription.ts +++ b/packages/bsky/src/api/app/bsky/notification/putActivitySubscription.ts @@ -1,9 +1,9 @@ import { TID } from '@atproto/common' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { isActivitySubscriptionEnabled } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { isActivitySubscriptionEnabled } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { Namespaces } from '../../../../stash' +import { Namespaces } from '../../../../stash.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.notification.putActivitySubscription, { diff --git a/packages/bsky/src/api/app/bsky/notification/putPreferences.ts b/packages/bsky/src/api/app/bsky/notification/putPreferences.ts index 13887ee0928..5fe187eeb8d 100644 --- a/packages/bsky/src/api/app/bsky/notification/putPreferences.ts +++ b/packages/bsky/src/api/app/bsky/notification/putPreferences.ts @@ -1,5 +1,5 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/notification/putPreferencesV2.ts b/packages/bsky/src/api/app/bsky/notification/putPreferencesV2.ts index 810e00f9d46..101490035f8 100644 --- a/packages/bsky/src/api/app/bsky/notification/putPreferencesV2.ts +++ b/packages/bsky/src/api/app/bsky/notification/putPreferencesV2.ts @@ -1,11 +1,11 @@ import assert from 'node:assert' import { Un$Typed } from '@atproto/lex' import { Server, UpstreamFailureError } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { GetNotificationPreferencesResponse } from '../../../../proto/bsky_pb' -import { Namespaces } from '../../../../stash' -import { protobufToLex } from './util' +import { GetNotificationPreferencesResponse } from '../../../../proto/bsky_pb.js' +import { Namespaces } from '../../../../stash.js' +import { protobufToLex } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.notification.putPreferencesV2, { diff --git a/packages/bsky/src/api/app/bsky/notification/registerPush.ts b/packages/bsky/src/api/app/bsky/notification/registerPush.ts index cce6e21e31e..6d5aefe5dab 100644 --- a/packages/bsky/src/api/app/bsky/notification/registerPush.ts +++ b/packages/bsky/src/api/app/bsky/notification/registerPush.ts @@ -3,9 +3,9 @@ import { MethodNotImplementedError, Server, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertLexPlatform, lexPlatformToProtoPlatform } from './util' +import { assertLexPlatform, lexPlatformToProtoPlatform } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.notification.registerPush, { diff --git a/packages/bsky/src/api/app/bsky/notification/unregisterPush.ts b/packages/bsky/src/api/app/bsky/notification/unregisterPush.ts index 5ec267fcb0c..2bec79ac5e2 100644 --- a/packages/bsky/src/api/app/bsky/notification/unregisterPush.ts +++ b/packages/bsky/src/api/app/bsky/notification/unregisterPush.ts @@ -3,9 +3,9 @@ import { MethodNotImplementedError, Server, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { assertLexPlatform, lexPlatformToProtoPlatform } from './util' +import { assertLexPlatform, lexPlatformToProtoPlatform } from './util.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.notification.unregisterPush, { diff --git a/packages/bsky/src/api/app/bsky/notification/updateSeen.ts b/packages/bsky/src/api/app/bsky/notification/updateSeen.ts index d189a91799d..101c123f478 100644 --- a/packages/bsky/src/api/app/bsky/notification/updateSeen.ts +++ b/packages/bsky/src/api/app/bsky/notification/updateSeen.ts @@ -1,7 +1,7 @@ import { Struct, Timestamp } from '@bufbuild/protobuf' import { v3 as murmurV3 } from 'murmurhash' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/app/bsky/notification/util.ts b/packages/bsky/src/api/app/bsky/notification/util.ts index 777c7d74a82..f8e7ade7ae1 100644 --- a/packages/bsky/src/api/app/bsky/notification/util.ts +++ b/packages/bsky/src/api/app/bsky/notification/util.ts @@ -6,8 +6,8 @@ import { NotificationInclude, NotificationPreference, NotificationPreferences, -} from '../../../../proto/bsky_pb' -import { AppPlatform } from '../../../../proto/courier_pb' +} from '../../../../proto/bsky_pb.js' +import { AppPlatform } from '../../../../proto/courier_pb.js' type DeepPartial = T extends object ? { diff --git a/packages/bsky/src/api/app/bsky/unspecced/getAgeAssuranceState.ts b/packages/bsky/src/api/app/bsky/unspecced/getAgeAssuranceState.ts index 7555975c00a..fedeb50bf8f 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getAgeAssuranceState.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getAgeAssuranceState.ts @@ -1,8 +1,8 @@ import { DatetimeString } from '@atproto/syntax' import { Server, UpstreamFailureError } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' -import { ActorInfo } from '../../../../proto/bsky_pb' +import { ActorInfo } from '../../../../proto/bsky_pb.js' export default function (server: Server, ctx: AppContext) { server.add(app.bsky.unspecced.getAgeAssuranceState, { diff --git a/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts b/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts index fd29010eff0..23c1057c2dd 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getConfig.ts @@ -1,5 +1,5 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' // THIS IS A TEMPORARY UNSPECCED ROUTE diff --git a/packages/bsky/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts b/packages/bsky/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts index e435ddcc9bb..6054419b680 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts @@ -2,12 +2,12 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { Client } from '@atproto/lex' import { AtUri, AtUriString, DidString } from '@atproto/syntax' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFn, @@ -15,8 +15,8 @@ import { RulesFn, SkeletonFn, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getOnboardingSuggestedStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts index 8a3d94b5b16..9494603b886 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getPopularFeedGenerators.ts @@ -1,10 +1,10 @@ import { mapDefined } from '@atproto/common' import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { parseString } from '../../../../hydration/util' +import { AppContext } from '../../../../context.js' +import { parseString } from '../../../../hydration/util.js' import { app } from '../../../../lexicons/index.js' -import { clearlyBadCursor, resHeaders } from '../../../util' +import { clearlyBadCursor, resHeaders } from '../../../util.js' // THIS IS A TEMPORARY UNSPECCED ROUTE // @TODO currently mirrors getSuggestedFeeds and ignores the "query" param. diff --git a/packages/bsky/src/api/app/bsky/unspecced/getPostThreadOtherV2.ts b/packages/bsky/src/api/app/bsky/unspecced/getPostThreadOtherV2.ts index 1af92b36844..0c1156da11d 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getPostThreadOtherV2.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getPostThreadOtherV2.ts @@ -1,9 +1,13 @@ import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { ServerConfig } from '../../../../config' -import { AppContext } from '../../../../context' -import { Code, DataPlaneClient, isDataplaneError } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { ServerConfig } from '../../../../config.js' +import { AppContext } from '../../../../context.js' +import { + Code, + DataPlaneClient, + isDataplaneError, +} from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,9 +15,9 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' // No parents for hidden replies (it would be the anchor post). const ABOVE = 0 diff --git a/packages/bsky/src/api/app/bsky/unspecced/getPostThreadV2.ts b/packages/bsky/src/api/app/bsky/unspecced/getPostThreadV2.ts index 403822ccede..7659de9b0e8 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getPostThreadV2.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getPostThreadV2.ts @@ -1,9 +1,13 @@ import { AtUriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { ServerConfig } from '../../../../config' -import { AppContext } from '../../../../context' -import { Code, DataPlaneClient, isDataplaneError } from '../../../../data-plane' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { ServerConfig } from '../../../../config.js' +import { AppContext } from '../../../../context.js' +import { + Code, + DataPlaneClient, + isDataplaneError, +} from '../../../../data-plane/index.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -11,10 +15,10 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { postUriToThreadgateUri } from '../../../../util/uris' -import { Views } from '../../../../views' -import { resHeaders } from '../../../util' +} from '../../../../pipeline.js' +import { postUriToThreadgateUri } from '../../../../util/uris.js' +import { Views } from '../../../../views/index.js' +import { resHeaders } from '../../../util.js' export default function (server: Server, ctx: AppContext) { const getPostThread = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedFeeds.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedFeeds.ts index 6586ff276f2..1d9c867b1e0 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedFeeds.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedFeeds.ts @@ -1,8 +1,8 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { AtUriString, Client } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -10,8 +10,8 @@ import { SkeletonFnInput, createPipeline, noRules, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getFeeds = createPipeline(skeleton, hydration, noRules, presentation) diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedOnboardingUsers.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedOnboardingUsers.ts index 1081658d048..38e29f0acf0 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedOnboardingUsers.ts @@ -1,21 +1,21 @@ import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' -import { app } from '../../../../lexicons' +} from '../../../../hydration/hydrator.js' +import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, PresentationFnInput, RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getSuggestedOnboardingUsers = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts index a2633cdf9ed..0811aa4440b 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedStarterPacks.ts @@ -2,12 +2,12 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { Client } from '@atproto/lex' import { AtUri, AtUriString, DidString } from '@atproto/syntax' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -15,8 +15,8 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getSuggestedStarterPacks = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsers.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsers.ts index 864712801a5..f2f7397c552 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsers.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsers.ts @@ -1,12 +1,12 @@ import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,8 +14,8 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getSuggestedUsers = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts index 83eb6c7699f..a017593f666 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForDiscover.ts @@ -1,12 +1,12 @@ import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,8 +14,8 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getSuggestedUsersForDiscover = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts index 27965219e71..f78b0f21848 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForExplore.ts @@ -1,12 +1,12 @@ import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,8 +14,8 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getSuggestedUsersForExplore = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts index 377bb03d56b..e3f0eea8aa3 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts @@ -1,12 +1,12 @@ import { dedupeStrs, mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFnInput, @@ -14,8 +14,8 @@ import { RulesFnInput, SkeletonFnInput, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getSuggestedUsersForSeeMore = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts index e6d42d0c8fc..e9eea4dd326 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getTaggedSuggestions.ts @@ -1,6 +1,6 @@ import { UriString } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' // THIS IS A TEMPORARY UNSPECCED ROUTE diff --git a/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts b/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts index caffc84d9e6..4d5e7b619e9 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getTrendingTopics.ts @@ -1,8 +1,8 @@ import { noUndefinedVals } from '@atproto/common' import { Client } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator' +import { AppContext } from '../../../../context.js' +import { HydrateCtx, Hydrator } from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFn, @@ -10,8 +10,8 @@ import { RulesFn, SkeletonFn, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getTrendingTopics = createPipeline( diff --git a/packages/bsky/src/api/app/bsky/unspecced/getTrends.ts b/packages/bsky/src/api/app/bsky/unspecced/getTrends.ts index bafac98ff32..58c64e722e8 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/getTrends.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/getTrends.ts @@ -1,12 +1,12 @@ import { mapDefined, noUndefinedVals } from '@atproto/common' import { Client, DidString } from '@atproto/lex' import { MethodNotImplementedError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { HydrateCtx, Hydrator, mergeManyStates, -} from '../../../../hydration/hydrator' +} from '../../../../hydration/hydrator.js' import { app } from '../../../../lexicons/index.js' import { HydrationFn, @@ -14,8 +14,8 @@ import { RulesFn, SkeletonFn, createPipeline, -} from '../../../../pipeline' -import { Views } from '../../../../views' +} from '../../../../pipeline.js' +import { Views } from '../../../../views/index.js' export default function (server: Server, ctx: AppContext) { const getTrends = createPipeline(skeleton, hydration, noBlocks, presentation) diff --git a/packages/bsky/src/api/app/bsky/unspecced/initAgeAssurance.ts b/packages/bsky/src/api/app/bsky/unspecced/initAgeAssurance.ts index da812d6d3ba..37faaa703cd 100644 --- a/packages/bsky/src/api/app/bsky/unspecced/initAgeAssurance.ts +++ b/packages/bsky/src/api/app/bsky/unspecced/initAgeAssurance.ts @@ -6,13 +6,13 @@ import { MethodNotImplementedError, Server, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' -import { KwsExternalPayloadError } from '../../../../kws' +import { AppContext } from '../../../../context.js' +import { KwsExternalPayloadError } from '../../../../kws.js' import { app } from '../../../../lexicons/index.js' -import { httpLogger as log } from '../../../../logger' -import { ActorInfo } from '../../../../proto/bsky_pb' -import { KwsExternalPayload } from '../../../kws/types' -import { createStashEvent, getClientUa } from '../../../kws/util' +import { httpLogger as log } from '../../../../logger.js' +import { ActorInfo } from '../../../../proto/bsky_pb.js' +import { KwsExternalPayload } from '../../../kws/types.js' +import { createStashEvent, getClientUa } from '../../../kws/util.js' type InputSchema = app.bsky.unspecced.initAgeAssurance.$InputBody diff --git a/packages/bsky/src/api/blob-dispatcher.ts b/packages/bsky/src/api/blob-dispatcher.ts index 3baa89a0c1e..b448c435c13 100644 --- a/packages/bsky/src/api/blob-dispatcher.ts +++ b/packages/bsky/src/api/blob-dispatcher.ts @@ -1,7 +1,7 @@ import { Agent, Dispatcher, Pool, RetryAgent } from 'undici' import { isUnicastIp, unicastLookup } from '@atproto-labs/fetch-node' -import { ServerConfig } from '../config' -import { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry' +import { ServerConfig } from '../config.js' +import { RETRYABLE_HTTP_STATUS_CODES } from '../util/retry.js' export function createBlobDispatcher(cfg: ServerConfig): Dispatcher { const baseDispatcher = new Agent({ diff --git a/packages/bsky/src/api/blob-resolver.ts b/packages/bsky/src/api/blob-resolver.ts index 9c2e1cac1b7..f1780762129 100644 --- a/packages/bsky/src/api/blob-resolver.ts +++ b/packages/bsky/src/api/blob-resolver.ts @@ -15,19 +15,23 @@ import { buildProxiedContentEncoding, formatAcceptHeader, } from '@atproto-labs/xrpc-utils' -import { ServerConfig } from '../config' -import { AppContext } from '../context' +import { ServerConfig } from '../config.js' +import { AppContext } from '../context.js' import { Code, DataPlaneClient, getServiceEndpoint, isDataplaneError, unpackIdentityServices, -} from '../data-plane' -import { parseCid } from '../hydration/util' -import { httpLogger as log } from '../logger' -import { Middleware, proxyResponseHeaders, responseSignal } from '../util/http' -import { BSKY_USER_AGENT } from './util' +} from '../data-plane/index.js' +import { parseCid } from '../hydration/util.js' +import { httpLogger as log } from '../logger.js' +import { + Middleware, + proxyResponseHeaders, + responseSignal, +} from '../util/http.js' +import { BSKY_USER_AGENT } from './util.js' export function createMiddleware(ctx: AppContext): Middleware { return async (req, res, next) => { diff --git a/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts b/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts index c0c74c19747..62edd88947a 100644 --- a/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts +++ b/packages/bsky/src/api/com/atproto/admin/getAccountInfos.ts @@ -1,7 +1,7 @@ import { mapDefined } from '@atproto/common' import { DatetimeString, INVALID_HANDLE } from '@atproto/syntax' import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts b/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts index 24d1957c09a..34375bfd5f4 100644 --- a/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts +++ b/packages/bsky/src/api/com/atproto/admin/getSubjectStatus.ts @@ -1,5 +1,5 @@ import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts b/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts index 9b34cf38c28..ea9afa77c53 100644 --- a/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts +++ b/packages/bsky/src/api/com/atproto/admin/updateSubjectStatus.ts @@ -4,7 +4,7 @@ import { InvalidRequestError, Server, } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts b/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts index 48d6d3a0630..4de64a18224 100644 --- a/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts +++ b/packages/bsky/src/api/com/atproto/identity/resolveHandle.ts @@ -1,5 +1,5 @@ import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/label/queryLabels.ts b/packages/bsky/src/api/com/atproto/label/queryLabels.ts index 64b0b9c7cf2..fdf4c39cbfc 100644 --- a/packages/bsky/src/api/com/atproto/label/queryLabels.ts +++ b/packages/bsky/src/api/com/atproto/label/queryLabels.ts @@ -1,6 +1,6 @@ import { isUriString } from '@atproto/lex' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/repo/getRecord.ts b/packages/bsky/src/api/com/atproto/repo/getRecord.ts index 74d426ece1f..aa3f84a3986 100644 --- a/packages/bsky/src/api/com/atproto/repo/getRecord.ts +++ b/packages/bsky/src/api/com/atproto/repo/getRecord.ts @@ -1,6 +1,6 @@ import { AtUri } from '@atproto/syntax' import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, ctx: AppContext) { diff --git a/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts b/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts index 5b6ed84ca4a..c6839f099fb 100644 --- a/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts +++ b/packages/bsky/src/api/com/atproto/temp/fetchLabels.ts @@ -1,5 +1,5 @@ import { InvalidRequestError, Server } from '@atproto/xrpc-server' -import { AppContext } from '../../../../context' +import { AppContext } from '../../../../context.js' import { com } from '../../../../lexicons/index.js' export default function (server: Server, _ctx: AppContext) { diff --git a/packages/bsky/src/api/external.ts b/packages/bsky/src/api/external.ts index 0629156292a..7023f6432a2 100644 --- a/packages/bsky/src/api/external.ts +++ b/packages/bsky/src/api/external.ts @@ -1,7 +1,7 @@ import { Router } from 'express' -import { AppContext } from '../context' -import * as aaApi from './age-assurance' -import * as kwsApi from './kws' +import { AppContext } from '../context.js' +import * as aaApi from './age-assurance/index.js' +import * as kwsApi from './kws/index.js' export const createRouter = (ctx: AppContext): Router => { const router = Router() diff --git a/packages/bsky/src/api/health.ts b/packages/bsky/src/api/health.ts index b113c586ec1..99eda41d036 100644 --- a/packages/bsky/src/api/health.ts +++ b/packages/bsky/src/api/health.ts @@ -1,5 +1,5 @@ import { Router } from 'express' -import { AppContext } from '../context' +import { AppContext } from '../context.js' export const createRouter = (ctx: AppContext): Router => { const router = Router() diff --git a/packages/bsky/src/api/index.ts b/packages/bsky/src/api/index.ts index 1c6a9f20c58..94a05d60c74 100644 --- a/packages/bsky/src/api/index.ts +++ b/packages/bsky/src/api/index.ts @@ -1,111 +1,111 @@ import { Server } from '@atproto/xrpc-server' -import { AppContext } from '../context' -import getProfile from './app/bsky/actor/getProfile' -import getProfiles from './app/bsky/actor/getProfiles' -import getSuggestions from './app/bsky/actor/getSuggestions' -import searchActors from './app/bsky/actor/searchActors' -import searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead' -import aaBegin from './app/bsky/ageassurance/begin' -import aaGetConfig from './app/bsky/ageassurance/getConfig' -import aaGetState from './app/bsky/ageassurance/getState' -import createBookmark from './app/bsky/bookmark/createBookmark' -import deleteBookmark from './app/bsky/bookmark/deleteBookmark' -import getBookmarks from './app/bsky/bookmark/getBookmarks' -import dismissMatch from './app/bsky/contact/dismissMatch' -import getMatches from './app/bsky/contact/getMatches' -import getSyncStatus from './app/bsky/contact/getSyncStatus' -import importContacts from './app/bsky/contact/importContacts' -import removeData from './app/bsky/contact/removeData' -import sendNotification from './app/bsky/contact/sendNotification' -import startPhoneVerification from './app/bsky/contact/startPhoneVerification' -import verifyPhone from './app/bsky/contact/verifyPhone' -import createDraft from './app/bsky/draft/createDraft' -import deleteDraft from './app/bsky/draft/deleteDraft' -import getDrafts from './app/bsky/draft/getDrafts' -import updateDraft from './app/bsky/draft/updateDraft' -import getActorFeeds from './app/bsky/feed/getActorFeeds' -import getActorLikes from './app/bsky/feed/getActorLikes' -import getAuthorFeed from './app/bsky/feed/getAuthorFeed' -import getFeed from './app/bsky/feed/getFeed' -import getFeedGenerator from './app/bsky/feed/getFeedGenerator' -import getFeedGenerators from './app/bsky/feed/getFeedGenerators' -import getLikes from './app/bsky/feed/getLikes' -import getListFeed from './app/bsky/feed/getListFeed' -import getPostThread from './app/bsky/feed/getPostThread' -import getPosts from './app/bsky/feed/getPosts' -import getQuotes from './app/bsky/feed/getQuotes' -import getRepostedBy from './app/bsky/feed/getRepostedBy' -import getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds' -import getTimeline from './app/bsky/feed/getTimeline' -import searchPosts from './app/bsky/feed/searchPosts' -import getActorStarterPacks from './app/bsky/graph/getActorStarterPacks' -import getBlocks from './app/bsky/graph/getBlocks' -import getFollowers from './app/bsky/graph/getFollowers' -import getFollows from './app/bsky/graph/getFollows' -import getKnownFollowers from './app/bsky/graph/getKnownFollowers' -import getList from './app/bsky/graph/getList' -import getListBlocks from './app/bsky/graph/getListBlocks' -import getListMutes from './app/bsky/graph/getListMutes' -import getLists from './app/bsky/graph/getLists' -import getListsWithMembership from './app/bsky/graph/getListsWithMembership' -import getMutes from './app/bsky/graph/getMutes' -import getRelationships from './app/bsky/graph/getRelationships' -import getStarterPack from './app/bsky/graph/getStarterPack' -import getStarterPacks from './app/bsky/graph/getStarterPacks' -import getStarterPacksWithMembership from './app/bsky/graph/getStarterPacksWithMembership' -import getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor' -import muteActor from './app/bsky/graph/muteActor' -import muteActorList from './app/bsky/graph/muteActorList' -import muteThread from './app/bsky/graph/muteThread' -import searchStarterPacks from './app/bsky/graph/searchStarterPacks' -import unmuteActor from './app/bsky/graph/unmuteActor' -import unmuteActorList from './app/bsky/graph/unmuteActorList' -import unmuteThread from './app/bsky/graph/unmuteThread' -import getLabelerServices from './app/bsky/labeler/getServices' -import getPreferences from './app/bsky/notification/getPreferences' -import getUnreadCount from './app/bsky/notification/getUnreadCount' -import listActivitySubscriptions from './app/bsky/notification/listActivitySubscriptions' -import listNotifications from './app/bsky/notification/listNotifications' -import putActivitySubscription from './app/bsky/notification/putActivitySubscription' -import putPreferences from './app/bsky/notification/putPreferences' -import putPreferencesV2 from './app/bsky/notification/putPreferencesV2' -import registerPush from './app/bsky/notification/registerPush' -import unregisterPush from './app/bsky/notification/unregisterPush' -import updateSeen from './app/bsky/notification/updateSeen' -import getAgeAssuranceState from './app/bsky/unspecced/getAgeAssuranceState' -import getConfig from './app/bsky/unspecced/getConfig' -import getOnboardingSuggestedStarterPacks from './app/bsky/unspecced/getOnboardingSuggestedStarterPacks' -import getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators' -import getPostThreadOtherV2 from './app/bsky/unspecced/getPostThreadOtherV2' -import getPostThreadV2 from './app/bsky/unspecced/getPostThreadV2' -import getUnspeccedSuggestedFeeds from './app/bsky/unspecced/getSuggestedFeeds' -import getSuggestedOnboardingUsers from './app/bsky/unspecced/getSuggestedOnboardingUsers' -import getSuggestedStarterPacks from './app/bsky/unspecced/getSuggestedStarterPacks' -import getSuggestedUsers from './app/bsky/unspecced/getSuggestedUsers' -import getSuggestedUsersForDiscover from './app/bsky/unspecced/getSuggestedUsersForDiscover' -import getSuggestedUsersForExplore from './app/bsky/unspecced/getSuggestedUsersForExplore' -import getSuggestedUsersForSeeMore from './app/bsky/unspecced/getSuggestedUsersForSeeMore' -import getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions' -import getTrendingTopics from './app/bsky/unspecced/getTrendingTopics' -import getTrends from './app/bsky/unspecced/getTrends' -import initAgeAssurance from './app/bsky/unspecced/initAgeAssurance' -import getAccountInfos from './com/atproto/admin/getAccountInfos' -import getSubjectStatus from './com/atproto/admin/getSubjectStatus' -import updateSubjectStatus from './com/atproto/admin/updateSubjectStatus' -import resolveHandle from './com/atproto/identity/resolveHandle' -import queryLabels from './com/atproto/label/queryLabels' -import getRecord from './com/atproto/repo/getRecord' -import fetchLabels from './com/atproto/temp/fetchLabels' +import { AppContext } from '../context.js' +import getProfile from './app/bsky/actor/getProfile.js' +import getProfiles from './app/bsky/actor/getProfiles.js' +import getSuggestions from './app/bsky/actor/getSuggestions.js' +import searchActors from './app/bsky/actor/searchActors.js' +import searchActorsTypeahead from './app/bsky/actor/searchActorsTypeahead.js' +import aaBegin from './app/bsky/ageassurance/begin.js' +import aaGetConfig from './app/bsky/ageassurance/getConfig.js' +import aaGetState from './app/bsky/ageassurance/getState.js' +import createBookmark from './app/bsky/bookmark/createBookmark.js' +import deleteBookmark from './app/bsky/bookmark/deleteBookmark.js' +import getBookmarks from './app/bsky/bookmark/getBookmarks.js' +import dismissMatch from './app/bsky/contact/dismissMatch.js' +import getMatches from './app/bsky/contact/getMatches.js' +import getSyncStatus from './app/bsky/contact/getSyncStatus.js' +import importContacts from './app/bsky/contact/importContacts.js' +import removeData from './app/bsky/contact/removeData.js' +import sendNotification from './app/bsky/contact/sendNotification.js' +import startPhoneVerification from './app/bsky/contact/startPhoneVerification.js' +import verifyPhone from './app/bsky/contact/verifyPhone.js' +import createDraft from './app/bsky/draft/createDraft.js' +import deleteDraft from './app/bsky/draft/deleteDraft.js' +import getDrafts from './app/bsky/draft/getDrafts.js' +import updateDraft from './app/bsky/draft/updateDraft.js' +import getActorFeeds from './app/bsky/feed/getActorFeeds.js' +import getActorLikes from './app/bsky/feed/getActorLikes.js' +import getAuthorFeed from './app/bsky/feed/getAuthorFeed.js' +import getFeed from './app/bsky/feed/getFeed.js' +import getFeedGenerator from './app/bsky/feed/getFeedGenerator.js' +import getFeedGenerators from './app/bsky/feed/getFeedGenerators.js' +import getLikes from './app/bsky/feed/getLikes.js' +import getListFeed from './app/bsky/feed/getListFeed.js' +import getPostThread from './app/bsky/feed/getPostThread.js' +import getPosts from './app/bsky/feed/getPosts.js' +import getQuotes from './app/bsky/feed/getQuotes.js' +import getRepostedBy from './app/bsky/feed/getRepostedBy.js' +import getSuggestedFeeds from './app/bsky/feed/getSuggestedFeeds.js' +import getTimeline from './app/bsky/feed/getTimeline.js' +import searchPosts from './app/bsky/feed/searchPosts.js' +import getActorStarterPacks from './app/bsky/graph/getActorStarterPacks.js' +import getBlocks from './app/bsky/graph/getBlocks.js' +import getFollowers from './app/bsky/graph/getFollowers.js' +import getFollows from './app/bsky/graph/getFollows.js' +import getKnownFollowers from './app/bsky/graph/getKnownFollowers.js' +import getList from './app/bsky/graph/getList.js' +import getListBlocks from './app/bsky/graph/getListBlocks.js' +import getListMutes from './app/bsky/graph/getListMutes.js' +import getLists from './app/bsky/graph/getLists.js' +import getListsWithMembership from './app/bsky/graph/getListsWithMembership.js' +import getMutes from './app/bsky/graph/getMutes.js' +import getRelationships from './app/bsky/graph/getRelationships.js' +import getStarterPack from './app/bsky/graph/getStarterPack.js' +import getStarterPacks from './app/bsky/graph/getStarterPacks.js' +import getStarterPacksWithMembership from './app/bsky/graph/getStarterPacksWithMembership.js' +import getSuggestedFollowsByActor from './app/bsky/graph/getSuggestedFollowsByActor.js' +import muteActor from './app/bsky/graph/muteActor.js' +import muteActorList from './app/bsky/graph/muteActorList.js' +import muteThread from './app/bsky/graph/muteThread.js' +import searchStarterPacks from './app/bsky/graph/searchStarterPacks.js' +import unmuteActor from './app/bsky/graph/unmuteActor.js' +import unmuteActorList from './app/bsky/graph/unmuteActorList.js' +import unmuteThread from './app/bsky/graph/unmuteThread.js' +import getLabelerServices from './app/bsky/labeler/getServices.js' +import getPreferences from './app/bsky/notification/getPreferences.js' +import getUnreadCount from './app/bsky/notification/getUnreadCount.js' +import listActivitySubscriptions from './app/bsky/notification/listActivitySubscriptions.js' +import listNotifications from './app/bsky/notification/listNotifications.js' +import putActivitySubscription from './app/bsky/notification/putActivitySubscription.js' +import putPreferences from './app/bsky/notification/putPreferences.js' +import putPreferencesV2 from './app/bsky/notification/putPreferencesV2.js' +import registerPush from './app/bsky/notification/registerPush.js' +import unregisterPush from './app/bsky/notification/unregisterPush.js' +import updateSeen from './app/bsky/notification/updateSeen.js' +import getAgeAssuranceState from './app/bsky/unspecced/getAgeAssuranceState.js' +import getConfig from './app/bsky/unspecced/getConfig.js' +import getOnboardingSuggestedStarterPacks from './app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js' +import getPopularFeedGenerators from './app/bsky/unspecced/getPopularFeedGenerators.js' +import getPostThreadOtherV2 from './app/bsky/unspecced/getPostThreadOtherV2.js' +import getPostThreadV2 from './app/bsky/unspecced/getPostThreadV2.js' +import getUnspeccedSuggestedFeeds from './app/bsky/unspecced/getSuggestedFeeds.js' +import getSuggestedOnboardingUsers from './app/bsky/unspecced/getSuggestedOnboardingUsers.js' +import getSuggestedStarterPacks from './app/bsky/unspecced/getSuggestedStarterPacks.js' +import getSuggestedUsers from './app/bsky/unspecced/getSuggestedUsers.js' +import getSuggestedUsersForDiscover from './app/bsky/unspecced/getSuggestedUsersForDiscover.js' +import getSuggestedUsersForExplore from './app/bsky/unspecced/getSuggestedUsersForExplore.js' +import getSuggestedUsersForSeeMore from './app/bsky/unspecced/getSuggestedUsersForSeeMore.js' +import getTaggedSuggestions from './app/bsky/unspecced/getTaggedSuggestions.js' +import getTrendingTopics from './app/bsky/unspecced/getTrendingTopics.js' +import getTrends from './app/bsky/unspecced/getTrends.js' +import initAgeAssurance from './app/bsky/unspecced/initAgeAssurance.js' +import getAccountInfos from './com/atproto/admin/getAccountInfos.js' +import getSubjectStatus from './com/atproto/admin/getSubjectStatus.js' +import updateSubjectStatus from './com/atproto/admin/updateSubjectStatus.js' +import resolveHandle from './com/atproto/identity/resolveHandle.js' +import queryLabels from './com/atproto/label/queryLabels.js' +import getRecord from './com/atproto/repo/getRecord.js' +import fetchLabels from './com/atproto/temp/fetchLabels.js' -export * as health from './health' +export * as health from './health.js' -export * as wellKnown from './well-known' +export * as wellKnown from './well-known.js' -export * as blobResolver from './blob-resolver' +export * as blobResolver from './blob-resolver.js' -export * as external from './external' +export * as external from './external.js' -export * as sitemap from './sitemap' +export * as sitemap from './sitemap.js' export default function (server: Server, ctx: AppContext) { // app.bsky diff --git a/packages/bsky/src/api/kws/api.ts b/packages/bsky/src/api/kws/api.ts index 296e9fcf63f..44e628304af 100644 --- a/packages/bsky/src/api/kws/api.ts +++ b/packages/bsky/src/api/kws/api.ts @@ -1,19 +1,19 @@ import express, { RequestHandler } from 'express' -import { httpLogger as log } from '../../logger' -import { AGE_ASSURANCE_CONFIG } from '../age-assurance/const' +import { httpLogger as log } from '../../logger.js' +import { AGE_ASSURANCE_CONFIG } from '../age-assurance/const.js' import { KWSExternalPayloadVersion, parseKWSExternalPayloadV1WithV2Compat, -} from '../age-assurance/kws/external-payload' -import { createEvent } from '../age-assurance/stash' -import { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util' -import { AppContextWithKwsClient } from './types' +} from '../age-assurance/kws/external-payload.js' +import { createEvent } from '../age-assurance/stash.js' +import { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util.js' +import { AppContextWithKwsClient } from './types.js' import { createStashEvent, getClientUa, parseStatus, validateSignature, -} from './util' +} from './util.js' function parseQueryParams( ctx: AppContextWithKwsClient, diff --git a/packages/bsky/src/api/kws/index.ts b/packages/bsky/src/api/kws/index.ts index 7575d19ee42..d67108118b1 100644 --- a/packages/bsky/src/api/kws/index.ts +++ b/packages/bsky/src/api/kws/index.ts @@ -1,8 +1,8 @@ import { Router, raw } from 'express' -import { AppContext } from '../../context' -import { verificationHandler } from './api' -import { AppContextWithKwsClient } from './types' -import { webhookAuth, webhookHandler } from './webhook' +import { AppContext } from '../../context.js' +import { verificationHandler } from './api.js' +import { AppContextWithKwsClient } from './types.js' +import { webhookAuth, webhookHandler } from './webhook.js' export const createRouter = (ctx: AppContext): Router => { assertAppContextWithAgeAssuranceClient(ctx) diff --git a/packages/bsky/src/api/kws/types.ts b/packages/bsky/src/api/kws/types.ts index 2bc58c7bd37..420ba93cdc9 100644 --- a/packages/bsky/src/api/kws/types.ts +++ b/packages/bsky/src/api/kws/types.ts @@ -1,7 +1,7 @@ import { z } from 'zod' -import { KwsConfig, ServerConfig } from '../../config' -import { AppContext } from '../../context' -import { KwsClient } from '../../kws' +import { KwsConfig, ServerConfig } from '../../config.js' +import { AppContext } from '../../context.js' +import { KwsClient } from '../../kws.js' export type AppContextWithKwsClient = AppContext & { kwsClient: KwsClient diff --git a/packages/bsky/src/api/kws/util.ts b/packages/bsky/src/api/kws/util.ts index feb19a57b99..0ad6b03bd65 100644 --- a/packages/bsky/src/api/kws/util.ts +++ b/packages/bsky/src/api/kws/util.ts @@ -2,15 +2,15 @@ import crypto from 'node:crypto' import express from 'express' import { TID } from '@atproto/common' import { DatetimeString } from '@atproto/syntax' -import { AppContext } from '../../context' +import { AppContext } from '../../context.js' import { app } from '../../lexicons/index.js' -import { Namespaces } from '../../stash' +import { Namespaces } from '../../stash.js' import { KwsExternalPayload, KwsStatus, externalPayloadSchema, statusSchema, -} from './types' +} from './types.js' export const createStashEvent = async ( ctx: AppContext, diff --git a/packages/bsky/src/api/kws/webhook.ts b/packages/bsky/src/api/kws/webhook.ts index f3f72bf8fc3..3a0262080c8 100644 --- a/packages/bsky/src/api/kws/webhook.ts +++ b/packages/bsky/src/api/kws/webhook.ts @@ -1,18 +1,22 @@ import express, { RequestHandler } from 'express' -import { httpLogger as log } from '../../logger' -import { AGE_ASSURANCE_CONFIG } from '../age-assurance/const' +import { httpLogger as log } from '../../logger.js' +import { AGE_ASSURANCE_CONFIG } from '../age-assurance/const.js' import { KWSExternalPayloadVersion, parseKWSExternalPayloadV1WithV2Compat, -} from '../age-assurance/kws/external-payload' -import { createEvent } from '../age-assurance/stash' -import { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util' +} from '../age-assurance/kws/external-payload.js' +import { createEvent } from '../age-assurance/stash.js' +import { computeAgeAssuranceAccessOrThrow } from '../age-assurance/util.js' import { AppContextWithKwsClient, KwsWebhookBody, webhookBodyIntermediateSchema, -} from './types' -import { createStashEvent, kwsWwwAuthenticate, validateSignature } from './util' +} from './types.js' +import { + createStashEvent, + kwsWwwAuthenticate, + validateSignature, +} from './util.js' export const webhookAuth = ({ secret }: { secret: string }): RequestHandler => diff --git a/packages/bsky/src/api/sitemap.ts b/packages/bsky/src/api/sitemap.ts index 3530c61d624..b6b268be7ee 100644 --- a/packages/bsky/src/api/sitemap.ts +++ b/packages/bsky/src/api/sitemap.ts @@ -2,9 +2,9 @@ import { Readable } from 'node:stream' import { Timestamp } from '@bufbuild/protobuf' import { Code, ConnectError } from '@connectrpc/connect' import express, { RequestHandler, Router } from 'express' -import { AppContext } from '../context' -import { httpLogger as log } from '../logger' -import { SitemapPageType } from '../proto/bsky_pb' +import { AppContext } from '../context.js' +import { httpLogger as log } from '../logger.js' +import { SitemapPageType } from '../proto/bsky_pb.js' export const createRouter = (ctx: AppContext): Router => { const router = Router() diff --git a/packages/bsky/src/api/util.ts b/packages/bsky/src/api/util.ts index e15cfe08499..943ec24dd4e 100644 --- a/packages/bsky/src/api/util.ts +++ b/packages/bsky/src/api/util.ts @@ -1,4 +1,4 @@ -import { ParsedLabelers, formatLabelerHeader } from '../util' +import { ParsedLabelers, formatLabelerHeader } from '../util.js' export const BSKY_USER_AGENT = 'BskyAppView' export const ATPROTO_CONTENT_LABELERS = 'Atproto-Content-Labelers' diff --git a/packages/bsky/src/api/well-known.ts b/packages/bsky/src/api/well-known.ts index cfd5b552e1d..8e276e48e57 100644 --- a/packages/bsky/src/api/well-known.ts +++ b/packages/bsky/src/api/well-known.ts @@ -1,6 +1,6 @@ import { Router } from 'express' import { didWebToUrl, isDidWeb } from '@atproto/did' -import { AppContext } from '../context' +import { AppContext } from '../context.js' export const createRouter = (ctx: AppContext): Router => { const router = Router() diff --git a/packages/bsky/src/auth-verifier.ts b/packages/bsky/src/auth-verifier.ts index a0225c55320..61272f27211 100644 --- a/packages/bsky/src/auth-verifier.ts +++ b/packages/bsky/src/auth-verifier.ts @@ -18,8 +18,8 @@ import { getKeyAsDidKey, isDataplaneError, unpackIdentityKeys, -} from './data-plane' -import { GetIdentityByDidResponse } from './proto/bsky_pb' +} from './data-plane/index.js' +import { GetIdentityByDidResponse } from './proto/bsky_pb.js' type ReqCtx = { req: express.Request diff --git a/packages/bsky/src/bsync.ts b/packages/bsky/src/bsync.ts index 83e0bc7b12b..9652481cb52 100644 --- a/packages/bsky/src/bsync.ts +++ b/packages/bsky/src/bsync.ts @@ -9,7 +9,7 @@ import { ConnectTransportOptions, createConnectTransport, } from '@connectrpc/connect-node' -import { Service } from './proto/bsync_connect' +import { Service } from './proto/bsync_connect.js' export type BsyncClient = PromiseClient diff --git a/packages/bsky/src/cache/read-through.ts b/packages/bsky/src/cache/read-through.ts index aa2d207fae5..c34488402be 100644 --- a/packages/bsky/src/cache/read-through.ts +++ b/packages/bsky/src/cache/read-through.ts @@ -1,5 +1,5 @@ -import { cacheLogger as log } from '../logger' -import { Redis } from '../redis' +import { cacheLogger as log } from '../logger.js' +import { Redis } from '../redis.js' export type CacheItem = { val: T | null // null here is for negative caching diff --git a/packages/bsky/src/config.ts b/packages/bsky/src/config.ts index d22d990c0ed..cd08a6bd7e2 100644 --- a/packages/bsky/src/config.ts +++ b/packages/bsky/src/config.ts @@ -1,7 +1,7 @@ import assert from 'node:assert' import { noUndefinedVals } from '@atproto/common' import { DidString, isDidString } from '@atproto/lex' -import { subLogger as log } from './logger' +import { subLogger as log } from './logger.js' type LiveNowConfig = { did: DidString diff --git a/packages/bsky/src/context.ts b/packages/bsky/src/context.ts index 6aaf47792b0..2643b015992 100644 --- a/packages/bsky/src/context.ts +++ b/packages/bsky/src/context.ts @@ -5,23 +5,23 @@ import { Dispatcher } from 'undici' import { Keypair } from '@atproto/crypto' import { IdResolver } from '@atproto/identity' import { Client } from '@atproto/lex' -import { AuthVerifier } from './auth-verifier' -import { BsyncClient } from './bsync' -import { ServerConfig } from './config' -import { CourierClient } from './courier' -import { DataPlaneClient, HostList } from './data-plane/client' -import { FeatureGatesClient } from './feature-gates' -import { Hydrator } from './hydration/hydrator' -import { KwsClient } from './kws' -import { httpLogger as log } from './logger' -import { RolodexClient } from './rolodex' -import { StashClient } from './stash' +import { AuthVerifier } from './auth-verifier.js' +import { BsyncClient } from './bsync.js' +import { ServerConfig } from './config.js' +import { CourierClient } from './courier.js' +import { DataPlaneClient, HostList } from './data-plane/client/index.js' +import { FeatureGatesClient } from './feature-gates/index.js' +import { Hydrator } from './hydration/hydrator.js' +import { KwsClient } from './kws.js' +import { httpLogger as log } from './logger.js' +import { RolodexClient } from './rolodex.js' +import { StashClient } from './stash.js' import { ParsedLabelers, defaultLabelerHeader, parseLabelerHeader, -} from './util' -import { Views } from './views' +} from './util.js' +import { Views } from './views/index.js' export class AppContext { constructor( diff --git a/packages/bsky/src/courier.ts b/packages/bsky/src/courier.ts index 8de5fe72229..089611fbb4f 100644 --- a/packages/bsky/src/courier.ts +++ b/packages/bsky/src/courier.ts @@ -9,7 +9,7 @@ import { ConnectTransportOptions, createConnectTransport, } from '@connectrpc/connect-node' -import { Service } from './proto/courier_connect' +import { Service } from './proto/courier_connect.js' export type CourierClient = PromiseClient diff --git a/packages/bsky/src/data-plane/bsync/index.ts b/packages/bsky/src/data-plane/bsync/index.ts index 91a8b2ed91d..5a5b08df2f3 100644 --- a/packages/bsky/src/data-plane/bsync/index.ts +++ b/packages/bsky/src/data-plane/bsync/index.ts @@ -8,16 +8,16 @@ import { TID } from '@atproto/common' import { lexParse } from '@atproto/lex' import { AtUri } from '@atproto/syntax' import { app } from '../../lexicons/index.js' -import { httpLogger } from '../../logger' -import { Service } from '../../proto/bsync_connect' +import { httpLogger } from '../../logger.js' +import { Service } from '../../proto/bsync_connect.js' import { Method, MuteOperation_Type, PutOperationRequest, -} from '../../proto/bsync_pb' -import { Namespaces } from '../../stash' -import { Database } from '../server/db' -import { countAll, excluded } from '../server/db/util' +} from '../../proto/bsync_pb.js' +import { Namespaces } from '../../stash.js' +import { Database } from '../server/db/index.js' +import { countAll, excluded } from '../server/db/util.js' export class MockBsync { constructor(public server: http.Server) {} diff --git a/packages/bsky/src/data-plane/client/hosts.ts b/packages/bsky/src/data-plane/client/hosts.ts index 065df51e1f6..12f5956a15c 100644 --- a/packages/bsky/src/data-plane/client/hosts.ts +++ b/packages/bsky/src/data-plane/client/hosts.ts @@ -1,6 +1,6 @@ import { Etcd3 } from 'etcd3' -import { EtcdMap } from '../../etcd' -import { dataplaneLogger as logger } from '../../logger' +import { EtcdMap } from '../../etcd.js' +import { dataplaneLogger as logger } from '../../logger.js' /** * Interface for a reactive list of hosts, i.e. for use with the dataplane client. diff --git a/packages/bsky/src/data-plane/client/index.ts b/packages/bsky/src/data-plane/client/index.ts index 8648ef0300d..894df7f523d 100644 --- a/packages/bsky/src/data-plane/client/index.ts +++ b/packages/bsky/src/data-plane/client/index.ts @@ -8,12 +8,12 @@ import { makeAnyClient, } from '@connectrpc/connect' import { createGrpcTransport } from '@connectrpc/connect-node' -import { Service } from '../../proto/bsky_connect' -import { HostList } from './hosts' -import { callerInterceptor } from './util' +import { Service } from '../../proto/bsky_connect.js' +import { HostList } from './hosts.js' +import { callerInterceptor } from './util.js' -export * from './hosts' -export * from './util' +export * from './hosts.js' +export * from './util.js' export type DataPlaneClient = PromiseClient type HttpVersion = '1.1' | '2' diff --git a/packages/bsky/src/data-plane/client/util.test.ts b/packages/bsky/src/data-plane/client/util.test.ts index 7b54794bcbe..fc2325f2394 100644 --- a/packages/bsky/src/data-plane/client/util.test.ts +++ b/packages/bsky/src/data-plane/client/util.test.ts @@ -1,39 +1,29 @@ -/// -import { callerInterceptor } from './util' +import { + StreamRequest, + StreamResponse, + UnaryRequest, + UnaryResponse, +} from '@connectrpc/connect' +import { describe, expect, it, vi } from 'vitest' +import { callerInterceptor } from './util.js' describe('callerInterceptor', () => { it('sets x-atlantis-caller header on the request', async () => { - const interceptor = callerInterceptor('appview') - const expectedResponse = { status: 'ok' } - const next = jest.fn().mockResolvedValue(expectedResponse) - - const req = { header: new Headers() } - const handler = interceptor(next) - const res = await handler(req as any) - - expect(req.header.get('x-atlantis-caller')).toBe('appview') - expect(next).toHaveBeenCalledWith(req) - expect(res).toBe(expectedResponse) - }) - - it('uses the provided caller value', async () => { - const interceptor = callerInterceptor('feed-generator') - const next = jest.fn().mockResolvedValue({}) + const fakeRequest = { header: new Headers({ 'x-other': 'value' }) } as + | UnaryRequest + | StreamRequest + const fakeResponse = {} as UnaryResponse | StreamResponse + const fakeHandler = vi.fn(async (_req: UnaryRequest | StreamRequest) => { + return fakeResponse + }) - const req = { header: new Headers() } - await interceptor(next)(req as any) - - expect(req.header.get('x-atlantis-caller')).toBe('feed-generator') - }) - - it('does not overwrite other existing headers', async () => { const interceptor = callerInterceptor('appview') - const next = jest.fn().mockResolvedValue({}) - - const req = { header: new Headers({ 'x-other': 'value' }) } - await interceptor(next)(req as any) + const next = interceptor(fakeHandler) + const res = await next(fakeRequest) - expect(req.header.get('x-atlantis-caller')).toBe('appview') - expect(req.header.get('x-other')).toBe('value') + expect(fakeRequest.header.get('x-atlantis-caller')).toBe('appview') + expect(fakeRequest.header.get('x-other')).toBe('value') + expect(fakeHandler).toHaveBeenCalledWith(fakeRequest) + expect(res).toBe(fakeResponse) }) }) diff --git a/packages/bsky/src/data-plane/index.ts b/packages/bsky/src/data-plane/index.ts index 31fe4b0dde3..aa10b7f7e63 100644 --- a/packages/bsky/src/data-plane/index.ts +++ b/packages/bsky/src/data-plane/index.ts @@ -1,3 +1,3 @@ -export * from './server' -export * from './client' -export * from './bsync' +export * from './server/index.js' +export * from './client/index.js' +export * from './bsync/index.js' diff --git a/packages/bsky/src/data-plane/server/background.ts b/packages/bsky/src/data-plane/server/background.ts index a0a8f97d9a0..c72a3f30fa0 100644 --- a/packages/bsky/src/data-plane/server/background.ts +++ b/packages/bsky/src/data-plane/server/background.ts @@ -1,6 +1,6 @@ import PQueue from 'p-queue' -import { dbLogger } from '../../logger' -import { Database } from './db' +import { dbLogger } from '../../logger.js' +import { Database } from './db/index.js' // A simple queue for in-process, out-of-band/backgrounded work diff --git a/packages/bsky/src/data-plane/server/db/database-schema.ts b/packages/bsky/src/data-plane/server/db/database-schema.ts index fbedb69944a..0bfe10d4c25 100644 --- a/packages/bsky/src/data-plane/server/db/database-schema.ts +++ b/packages/bsky/src/data-plane/server/db/database-schema.ts @@ -1,47 +1,47 @@ import { Kysely } from 'kysely' -import * as activitySubscription from './tables/activity-subscription' -import * as actor from './tables/actor' -import * as actorBlock from './tables/actor-block' -import * as actorState from './tables/actor-state' -import * as actorSync from './tables/actor-sync' -import * as algo from './tables/algo' -import * as blobTakedown from './tables/blob-takedown' -import * as bookmark from './tables/bookmark' -import * as didCache from './tables/did-cache' -import * as draft from './tables/draft' -import * as duplicateRecord from './tables/duplicate-record' -import * as feedGenerator from './tables/feed-generator' -import * as feedItem from './tables/feed-item' -import * as follow from './tables/follow' -import * as label from './tables/label' -import * as labeler from './tables/labeler' -import * as like from './tables/like' -import * as list from './tables/list' -import * as listBlock from './tables/list-block' -import * as listItem from './tables/list-item' -import * as listMute from './tables/list-mute' -import * as mute from './tables/mute' -import * as notification from './tables/notification' -import * as notificationPushToken from './tables/notification-push-token' -import * as post from './tables/post' -import * as postAgg from './tables/post-agg' -import * as postEmbed from './tables/post-embed' -import * as postgate from './tables/post-gate' -import * as privateData from './tables/private-data' -import * as profile from './tables/profile' -import * as profileAgg from './tables/profile-agg' -import * as quote from './tables/quote' -import * as record from './tables/record' -import * as repost from './tables/repost' -import * as starterPack from './tables/starter-pack' -import * as subscription from './tables/subscription' -import * as suggestedFeed from './tables/suggested-feed' -import * as suggestedFollow from './tables/suggested-follow' -import * as taggedSuggestion from './tables/tagged-suggestion' -import * as threadgate from './tables/thread-gate' -import * as threadMute from './tables/thread-mute' -import * as verification from './tables/verification' -import * as viewParam from './tables/view-param' +import * as activitySubscription from './tables/activity-subscription.js' +import * as actorBlock from './tables/actor-block.js' +import * as actorState from './tables/actor-state.js' +import * as actorSync from './tables/actor-sync.js' +import * as actor from './tables/actor.js' +import * as algo from './tables/algo.js' +import * as blobTakedown from './tables/blob-takedown.js' +import * as bookmark from './tables/bookmark.js' +import * as didCache from './tables/did-cache.js' +import * as draft from './tables/draft.js' +import * as duplicateRecord from './tables/duplicate-record.js' +import * as feedGenerator from './tables/feed-generator.js' +import * as feedItem from './tables/feed-item.js' +import * as follow from './tables/follow.js' +import * as label from './tables/label.js' +import * as labeler from './tables/labeler.js' +import * as like from './tables/like.js' +import * as listBlock from './tables/list-block.js' +import * as listItem from './tables/list-item.js' +import * as listMute from './tables/list-mute.js' +import * as list from './tables/list.js' +import * as mute from './tables/mute.js' +import * as notificationPushToken from './tables/notification-push-token.js' +import * as notification from './tables/notification.js' +import * as postAgg from './tables/post-agg.js' +import * as postEmbed from './tables/post-embed.js' +import * as postgate from './tables/post-gate.js' +import * as post from './tables/post.js' +import * as privateData from './tables/private-data.js' +import * as profileAgg from './tables/profile-agg.js' +import * as profile from './tables/profile.js' +import * as quote from './tables/quote.js' +import * as record from './tables/record.js' +import * as repost from './tables/repost.js' +import * as starterPack from './tables/starter-pack.js' +import * as subscription from './tables/subscription.js' +import * as suggestedFeed from './tables/suggested-feed.js' +import * as suggestedFollow from './tables/suggested-follow.js' +import * as taggedSuggestion from './tables/tagged-suggestion.js' +import * as threadgate from './tables/thread-gate.js' +import * as threadMute from './tables/thread-mute.js' +import * as verification from './tables/verification.js' +import * as viewParam from './tables/view-param.js' export type DatabaseSchemaType = duplicateRecord.PartialDB & profile.PartialDB & diff --git a/packages/bsky/src/data-plane/server/db/db.ts b/packages/bsky/src/data-plane/server/db/db.ts index 067b1ca16d5..22ce1d02e26 100644 --- a/packages/bsky/src/data-plane/server/db/db.ts +++ b/packages/bsky/src/data-plane/server/db/db.ts @@ -13,11 +13,11 @@ import { } from 'kysely' import { Pool as PgPool, types as pgTypes } from 'pg' import TypedEmitter from 'typed-emitter' -import { dbLogger } from '../../../logger' -import { DatabaseSchema, DatabaseSchemaType } from './database-schema' -import * as migrations from './migrations' -import { CtxMigrationProvider } from './migrations/provider' -import { PgOptions } from './types' +import { dbLogger } from '../../../logger.js' +import { DatabaseSchema, DatabaseSchemaType } from './database-schema.js' +import * as migrations from './migrations/index.js' +import { CtxMigrationProvider } from './migrations/provider.js' +import { PgOptions } from './types.js' export type { DatabaseSchema } diff --git a/packages/bsky/src/data-plane/server/db/index.ts b/packages/bsky/src/data-plane/server/db/index.ts index 89e9e77cb08..bb447a040c0 100644 --- a/packages/bsky/src/data-plane/server/db/index.ts +++ b/packages/bsky/src/data-plane/server/db/index.ts @@ -1,2 +1,2 @@ -export * from './db' -export type { DatabaseSchema } from './db' +export * from './db.js' +export type { DatabaseSchema } from './db.js' diff --git a/packages/bsky/src/data-plane/server/db/migrations/index.ts b/packages/bsky/src/data-plane/server/db/migrations/index.ts index 19da646d2af..1752a483610 100644 --- a/packages/bsky/src/data-plane/server/db/migrations/index.ts +++ b/packages/bsky/src/data-plane/server/db/migrations/index.ts @@ -2,58 +2,58 @@ // It's important that every migration is exported from here with the proper name. We'd simplify // this with kysely's FileMigrationProvider, but it doesn't play nicely with the build process. -export * as _20230309T045948368Z from './20230309T045948368Z-init' -export * as _20230408T152211201Z from './20230408T152211201Z-notification-init' -export * as _20230417T210628672Z from './20230417T210628672Z-moderation-init' -export * as _20230420T211446071Z from './20230420T211446071Z-did-cache' -export * as _20230427T194702079Z from './20230427T194702079Z-notif-record-index' -export * as _20230605T144730094Z from './20230605T144730094Z-post-profile-aggs' -export * as _20230607T211442112Z from './20230607T211442112Z-feed-generator-init' -export * as _20230608T155101190Z from './20230608T155101190Z-algo-whats-hot-view' -export * as _20230608T201813132Z from './20230608T201813132Z-mute-lists' -export * as _20230608T205147239Z from './20230608T205147239Z-mutes' -export * as _20230609T153623961Z from './20230609T153623961Z-blocks' -export * as _20230609T232122649Z from './20230609T232122649Z-actor-deletion-indexes' -export * as _20230610T203555962Z from './20230610T203555962Z-suggested-follows' -export * as _20230611T215300060Z from './20230611T215300060Z-actor-state' -export * as _20230620T161134972Z from './20230620T161134972Z-post-langs' -export * as _20230627T212437895Z from './20230627T212437895Z-optional-handle' -export * as _20230629T220835893Z from './20230629T220835893Z-remove-post-hierarchy' -export * as _20230703T045536691Z from './20230703T045536691Z-feed-and-label-indices' -export * as _20230720T164800037Z from './20230720T164800037Z-posts-cursor-idx' -export * as _20230807T035309811Z from './20230807T035309811Z-feed-item-delete-invite-for-user-idx' -export * as _20230808T172902639Z from './20230808T172902639Z-repo-rev' -export * as _20230810T203349843Z from './20230810T203349843Z-action-duration' -export * as _20230817T195936007Z from './20230817T195936007Z-native-notifications' -export * as _20230830T205507322Z from './20230830T205507322Z-suggested-feeds' -export * as _20230904T211011773Z from './20230904T211011773Z-block-lists' -export * as _20230906T222220386Z from './20230906T222220386Z-thread-gating' -export * as _20230920T213858047Z from './20230920T213858047Z-add-tags-to-post' -export * as _20230929T192920807Z from './20230929T192920807Z-record-cursor-indexes' -export * as _20231003T202833377Z from './20231003T202833377Z-create-moderation-subject-status' -export * as _20231220T225126090Z from './20231220T225126090Z-blob-takedowns' -export * as _20240124T023719200Z from './20240124T023719200Z-tagged-suggestions' -export * as _20240226T225725627Z from './20240226T225725627Z-labelers' -export * as _20240530T170337073Z from './20240530T170337073Z-account-deactivation' -export * as _20240606T171229898Z from './20240606T171229898Z-thread-mutes' -export * as _20240606T222548219Z from './20240606T222548219Z-starter-packs' -export * as _20240719T203853939Z from './20240719T203853939Z-priority-notifs' -export * as _20240723T220700077Z from './20240723T220700077Z-quotes-post-aggs' -export * as _20240723T220703655Z from './20240723T220703655Z-quotes' -export * as _20240801T193939827Z from './20240801T193939827Z-post-gate' -export * as _20240808T224251220Z from './20240808T224251220Z-post-gate-flags' -export * as _20240829T211238293Z from './20240829T211238293Z-simplify-actor-sync' -export * as _20240831T134810923Z from './20240831T134810923Z-pinned-posts' -export * as _20241114T153108102Z from './20241114T153108102Z-add-starter-packs-name' -export * as _20250116T222618297Z from './20250116T222618297Z-post-embed-video' -export * as _20250207T174822012Z from './20250207T174822012Z-add-label-exp' -export * as _20250404T163421487Z from './20250404T163421487Z-verifications' -export * as _20250526T023712742Z from './20250526T023712742Z-like-repost-via' -export * as _20250528T221913281Z from './20250528T221913281Z-add-record-tags' -export * as _20250602T190357447Z from './20250602T190357447Z-add-private-data' -export * as _20250611T140649895Z from './20250611T140649895Z-add-activity-subscription' -export * as _20250627T025331240Z from './20250627T025331240Z-add-actor-age-assurance-columns' -export * as _20250812T183735692Z from './20250812T183735692Z-add-bookmarks' -export * as _20250813T174955711Z from './20250813T174955711Z-add-post-agg-bookmarks' -export * as _20251120T004738098Z from './20251120T004738098Z-update-actor-age-assurance-v2' -export * as _20260112T133951271Z from './20260112T133951271Z-add-drafts' +export * as _20230309T045948368Z from './20230309T045948368Z-init.js' +export * as _20230408T152211201Z from './20230408T152211201Z-notification-init.js' +export * as _20230417T210628672Z from './20230417T210628672Z-moderation-init.js' +export * as _20230420T211446071Z from './20230420T211446071Z-did-cache.js' +export * as _20230427T194702079Z from './20230427T194702079Z-notif-record-index.js' +export * as _20230605T144730094Z from './20230605T144730094Z-post-profile-aggs.js' +export * as _20230607T211442112Z from './20230607T211442112Z-feed-generator-init.js' +export * as _20230608T155101190Z from './20230608T155101190Z-algo-whats-hot-view.js' +export * as _20230608T201813132Z from './20230608T201813132Z-mute-lists.js' +export * as _20230608T205147239Z from './20230608T205147239Z-mutes.js' +export * as _20230609T153623961Z from './20230609T153623961Z-blocks.js' +export * as _20230609T232122649Z from './20230609T232122649Z-actor-deletion-indexes.js' +export * as _20230610T203555962Z from './20230610T203555962Z-suggested-follows.js' +export * as _20230611T215300060Z from './20230611T215300060Z-actor-state.js' +export * as _20230620T161134972Z from './20230620T161134972Z-post-langs.js' +export * as _20230627T212437895Z from './20230627T212437895Z-optional-handle.js' +export * as _20230629T220835893Z from './20230629T220835893Z-remove-post-hierarchy.js' +export * as _20230703T045536691Z from './20230703T045536691Z-feed-and-label-indices.js' +export * as _20230720T164800037Z from './20230720T164800037Z-posts-cursor-idx.js' +export * as _20230807T035309811Z from './20230807T035309811Z-feed-item-delete-invite-for-user-idx.js' +export * as _20230808T172902639Z from './20230808T172902639Z-repo-rev.js' +export * as _20230810T203349843Z from './20230810T203349843Z-action-duration.js' +export * as _20230817T195936007Z from './20230817T195936007Z-native-notifications.js' +export * as _20230830T205507322Z from './20230830T205507322Z-suggested-feeds.js' +export * as _20230904T211011773Z from './20230904T211011773Z-block-lists.js' +export * as _20230906T222220386Z from './20230906T222220386Z-thread-gating.js' +export * as _20230920T213858047Z from './20230920T213858047Z-add-tags-to-post.js' +export * as _20230929T192920807Z from './20230929T192920807Z-record-cursor-indexes.js' +export * as _20231003T202833377Z from './20231003T202833377Z-create-moderation-subject-status.js' +export * as _20231220T225126090Z from './20231220T225126090Z-blob-takedowns.js' +export * as _20240124T023719200Z from './20240124T023719200Z-tagged-suggestions.js' +export * as _20240226T225725627Z from './20240226T225725627Z-labelers.js' +export * as _20240530T170337073Z from './20240530T170337073Z-account-deactivation.js' +export * as _20240606T171229898Z from './20240606T171229898Z-thread-mutes.js' +export * as _20240606T222548219Z from './20240606T222548219Z-starter-packs.js' +export * as _20240719T203853939Z from './20240719T203853939Z-priority-notifs.js' +export * as _20240723T220700077Z from './20240723T220700077Z-quotes-post-aggs.js' +export * as _20240723T220703655Z from './20240723T220703655Z-quotes.js' +export * as _20240801T193939827Z from './20240801T193939827Z-post-gate.js' +export * as _20240808T224251220Z from './20240808T224251220Z-post-gate-flags.js' +export * as _20240829T211238293Z from './20240829T211238293Z-simplify-actor-sync.js' +export * as _20240831T134810923Z from './20240831T134810923Z-pinned-posts.js' +export * as _20241114T153108102Z from './20241114T153108102Z-add-starter-packs-name.js' +export * as _20250116T222618297Z from './20250116T222618297Z-post-embed-video.js' +export * as _20250207T174822012Z from './20250207T174822012Z-add-label-exp.js' +export * as _20250404T163421487Z from './20250404T163421487Z-verifications.js' +export * as _20250526T023712742Z from './20250526T023712742Z-like-repost-via.js' +export * as _20250528T221913281Z from './20250528T221913281Z-add-record-tags.js' +export * as _20250602T190357447Z from './20250602T190357447Z-add-private-data.js' +export * as _20250611T140649895Z from './20250611T140649895Z-add-activity-subscription.js' +export * as _20250627T025331240Z from './20250627T025331240Z-add-actor-age-assurance-columns.js' +export * as _20250812T183735692Z from './20250812T183735692Z-add-bookmarks.js' +export * as _20250813T174955711Z from './20250813T174955711Z-add-post-agg-bookmarks.js' +export * as _20251120T004738098Z from './20251120T004738098Z-update-actor-age-assurance-v2.js' +export * as _20260112T133951271Z from './20260112T133951271Z-add-drafts.js' diff --git a/packages/bsky/src/data-plane/server/db/pagination.ts b/packages/bsky/src/data-plane/server/db/pagination.ts index 324adf7b74a..97d2468d432 100644 --- a/packages/bsky/src/data-plane/server/db/pagination.ts +++ b/packages/bsky/src/data-plane/server/db/pagination.ts @@ -1,7 +1,7 @@ import { sql } from 'kysely' import { ensureValidRecordKey } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' -import { AnyQb, DbRef } from './util' +import { AnyQb, DbRef } from './util.js' type KeysetCursor = { primary: string; secondary: string } type KeysetLabeledResult = { diff --git a/packages/bsky/src/data-plane/server/db/util.ts b/packages/bsky/src/data-plane/server/db/util.ts index ae9dddbf4b0..02fd31d3629 100644 --- a/packages/bsky/src/data-plane/server/db/util.ts +++ b/packages/bsky/src/data-plane/server/db/util.ts @@ -9,7 +9,7 @@ import { SqliteQueryCompiler, sql, } from 'kysely' -import { DatabaseSchema, DatabaseSchemaType } from './database-schema' +import { DatabaseSchema, DatabaseSchemaType } from './database-schema.js' export const actorWhereClause = (actor: string) => { if (actor.startsWith('did:')) { diff --git a/packages/bsky/src/data-plane/server/index.ts b/packages/bsky/src/data-plane/server/index.ts index e310b131a8a..0a6ef961c6a 100644 --- a/packages/bsky/src/data-plane/server/index.ts +++ b/packages/bsky/src/data-plane/server/index.ts @@ -3,12 +3,12 @@ import http from 'node:http' import { expressConnectMiddleware } from '@connectrpc/connect-express' import express from 'express' import { IdResolver, MemoryCache } from '@atproto/identity' -import { Database, DatabaseSchema } from './db' -import createRoutes from './routes' +import { Database, DatabaseSchema } from './db/index.js' +import createRoutes from './routes/index.js' export type { DatabaseSchema } -export { RepoSubscription } from './subscription' +export { RepoSubscription } from './subscription.js' export class DataPlaneServer { constructor( diff --git a/packages/bsky/src/data-plane/server/indexing/index.ts b/packages/bsky/src/data-plane/server/indexing/index.ts index 960fc01e081..6f80c5b0560 100644 --- a/packages/bsky/src/data-plane/server/indexing/index.ts +++ b/packages/bsky/src/data-plane/server/indexing/index.ts @@ -10,31 +10,31 @@ import { verifyRepo, } from '@atproto/repo' import { AtUri, DidString } from '@atproto/syntax' -import { com } from '../../../lexicons' -import { subLogger } from '../../../logger' -import { retryXrpc } from '../../../util/retry' -import { BackgroundQueue } from '../background' -import { Database } from '../db' -import { Actor } from '../db/tables/actor' -import * as Block from './plugins/block' -import * as ChatDeclaration from './plugins/chat-declaration' -import * as FeedGenerator from './plugins/feed-generator' -import * as Follow from './plugins/follow' -import * as GermDeclaration from './plugins/germ-declaration' -import * as Labeler from './plugins/labeler' -import * as Like from './plugins/like' -import * as List from './plugins/list' -import * as ListBlock from './plugins/list-block' -import * as ListItem from './plugins/list-item' -import * as NotifDeclaration from './plugins/notif-declaration' -import * as Post from './plugins/post' -import * as Postgate from './plugins/post-gate' -import * as Profile from './plugins/profile' -import * as Repost from './plugins/repost' -import * as StarterPack from './plugins/starter-pack' -import * as Status from './plugins/status' -import * as Threadgate from './plugins/thread-gate' -import * as Verification from './plugins/verification' +import { com } from '../../../lexicons/index.js' +import { subLogger } from '../../../logger.js' +import { retryXrpc } from '../../../util/retry.js' +import { BackgroundQueue } from '../background.js' +import { Database } from '../db/index.js' +import { Actor } from '../db/tables/actor.js' +import * as Block from './plugins/block.js' +import * as ChatDeclaration from './plugins/chat-declaration.js' +import * as FeedGenerator from './plugins/feed-generator.js' +import * as Follow from './plugins/follow.js' +import * as GermDeclaration from './plugins/germ-declaration.js' +import * as Labeler from './plugins/labeler.js' +import * as Like from './plugins/like.js' +import * as ListBlock from './plugins/list-block.js' +import * as ListItem from './plugins/list-item.js' +import * as List from './plugins/list.js' +import * as NotifDeclaration from './plugins/notif-declaration.js' +import * as Postgate from './plugins/post-gate.js' +import * as Post from './plugins/post.js' +import * as Profile from './plugins/profile.js' +import * as Repost from './plugins/repost.js' +import * as StarterPack from './plugins/starter-pack.js' +import * as Status from './plugins/status.js' +import * as Threadgate from './plugins/thread-gate.js' +import * as Verification from './plugins/verification.js' export class IndexingService { records: { diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/block.ts b/packages/bsky/src/data-plane/server/indexing/plugins/block.ts index 2b49a5a8c7b..e2c2e955e26 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/block.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/block.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedBlock = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts b/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts index fd40dbbc5e5..52d2ed1a606 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/chat-declaration.ts @@ -1,10 +1,10 @@ import { Cid } from '@atproto/lex' import { AtUri } from '@atproto/syntax' -import { chat } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { chat } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' // @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts b/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts index 04267962ef3..28dbd1777be 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/feed-generator.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid, getBlobCidString } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedFeedGenerator = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts b/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts index 3f33a13abf0..1c7ff10a3ad 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/follow.ts @@ -1,12 +1,12 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { countAll, excluded } from '../../db/util' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { countAll, excluded } from '../../db/util.js' +import { RecordProcessor } from '../processor.js' type IndexedFollow = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/germ-declaration.ts b/packages/bsky/src/data-plane/server/indexing/plugins/germ-declaration.ts index 48647b14fdf..9783dff8d01 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/germ-declaration.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/germ-declaration.ts @@ -1,10 +1,10 @@ import { Cid } from '@atproto/lex' import { AtUri } from '@atproto/syntax' import { com } from '../../../../lexicons/index.js' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' // @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts b/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts index 9e09a7eb9f9..f41ae032908 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/labeler.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedLabeler = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/like.ts b/packages/bsky/src/data-plane/server/indexing/plugins/like.ts index b7972cc89b5..f2085607a1c 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/like.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/like.ts @@ -1,13 +1,13 @@ import { Insertable, Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { Notification } from '../../db/tables/notification' -import { countAll, excluded } from '../../db/util' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { Notification } from '../../db/tables/notification.js' +import { countAll, excluded } from '../../db/util.js' +import { RecordProcessor } from '../processor.js' type Notif = Insertable type IndexedLike = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts b/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts index 32dfc782170..aeca7ea273e 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/list-block.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedListBlock = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts b/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts index ff06cff1ae1..c2d33205bb2 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/list-item.ts @@ -2,11 +2,11 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedListItem = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/list.ts b/packages/bsky/src/data-plane/server/indexing/plugins/list.ts index 01ae60b7645..1829df6d909 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/list.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/list.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid, getBlobCidString } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedList = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/notif-declaration.ts b/packages/bsky/src/data-plane/server/indexing/plugins/notif-declaration.ts index a38cd03bb84..18544c59167 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/notif-declaration.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/notif-declaration.ts @@ -1,10 +1,10 @@ import { Cid } from '@atproto/lex' import { AtUri } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' // @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts b/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts index 12747cd8131..112cabf1b8f 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/post-gate.ts @@ -1,11 +1,11 @@ import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedGate = DatabaseSchemaType['post_gate'] diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/post.ts b/packages/bsky/src/data-plane/server/indexing/plugins/post.ts index 9981585163a..944b8a43cd0 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/post.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/post.ts @@ -1,26 +1,26 @@ import { Insertable, Selectable, sql } from 'kysely' import { $Typed, Cid, getBlobCidString, lexParse } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' +import { app } from '../../../../lexicons/index.js' import { postUriToPostgateUri, postUriToThreadgateUri, uriToDid, -} from '../../../../util/uris' -import { RecordWithMedia } from '../../../../views/types' -import { parsePostgate } from '../../../../views/util' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { Notification } from '../../db/tables/notification' -import { countAll, excluded } from '../../db/util' +} from '../../../../util/uris.js' +import { RecordWithMedia } from '../../../../views/types.js' +import { parsePostgate } from '../../../../views/util.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { Notification } from '../../db/tables/notification.js' +import { countAll, excluded } from '../../db/util.js' import { getAncestorsAndSelfQb, getDescendentsQb, invalidReplyRoot as checkInvalidReplyRoot, violatesThreadGate as checkViolatesThreadGate, -} from '../../util' -import { RecordProcessor } from '../processor' +} from '../../util.js' +import { RecordProcessor } from '../processor.js' type Notif = Insertable type Post = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts b/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts index de0d571f9ca..4963948d6c6 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/profile.ts @@ -1,10 +1,10 @@ import { Cid, getBlobCidString } from '@atproto/lex' import { AtUri } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedProfile = DatabaseSchemaType['profile'] diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts b/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts index 0f4b6bec741..20ee7e6f5c9 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/repost.ts @@ -1,13 +1,13 @@ import { Insertable, Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { Notification } from '../../db/tables/notification' -import { countAll, excluded } from '../../db/util' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { Notification } from '../../db/tables/notification.js' +import { countAll, excluded } from '../../db/util.js' +import { RecordProcessor } from '../processor.js' type Notif = Insertable type IndexedRepost = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts b/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts index 049bca9ba4f..5b05b0e75c9 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/starter-pack.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedStarterPack = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/status.ts b/packages/bsky/src/data-plane/server/indexing/plugins/status.ts index afcd1a6dbc4..837688da7b2 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/status.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/status.ts @@ -1,10 +1,10 @@ import { Cid } from '@atproto/lex' import { AtUri } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' // @NOTE this indexer is a placeholder to ensure it gets indexed in the generic records table diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts b/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts index d85d29be121..6263db4ecdd 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/thread-gate.ts @@ -1,11 +1,11 @@ import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' import { InvalidRequestError } from '@atproto/xrpc-server' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedGate = DatabaseSchemaType['thread_gate'] diff --git a/packages/bsky/src/data-plane/server/indexing/plugins/verification.ts b/packages/bsky/src/data-plane/server/indexing/plugins/verification.ts index 60ed8915c48..0cfc809750f 100644 --- a/packages/bsky/src/data-plane/server/indexing/plugins/verification.ts +++ b/packages/bsky/src/data-plane/server/indexing/plugins/verification.ts @@ -1,11 +1,11 @@ import { Selectable } from 'kysely' import { Cid } from '@atproto/lex' import { AtUri, normalizeDatetimeAlways } from '@atproto/syntax' -import { app } from '../../../../lexicons' -import { BackgroundQueue } from '../../background' -import { Database } from '../../db' -import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema' -import { RecordProcessor } from '../processor' +import { app } from '../../../../lexicons/index.js' +import { BackgroundQueue } from '../../background.js' +import { DatabaseSchema, DatabaseSchemaType } from '../../db/database-schema.js' +import { Database } from '../../db/index.js' +import { RecordProcessor } from '../processor.js' type IndexedVerification = Selectable diff --git a/packages/bsky/src/data-plane/server/indexing/processor.ts b/packages/bsky/src/data-plane/server/indexing/processor.ts index 4b6035ee4ae..d543a4bc7f3 100644 --- a/packages/bsky/src/data-plane/server/indexing/processor.ts +++ b/packages/bsky/src/data-plane/server/indexing/processor.ts @@ -2,10 +2,10 @@ import { Insertable } from 'kysely' import { chunkArray } from '@atproto/common' import { Cid, l, lexParse, lexStringify, parseCid } from '@atproto/lex' import { AtUri } from '@atproto/syntax' -import { BackgroundQueue } from '../background' -import { Database } from '../db' -import { DatabaseSchema } from '../db/database-schema' -import { Notification } from '../db/tables/notification' +import { BackgroundQueue } from '../background.js' +import { DatabaseSchema } from '../db/database-schema.js' +import { Database } from '../db/index.js' +import { Notification } from '../db/tables/notification.js' // @NOTE re: insertions and deletions. Due to how record updates are handled, // (insertFn) should have the same effect as (insertFn -> deleteFn -> insertFn). diff --git a/packages/bsky/src/data-plane/server/routes/activity-subscription.ts b/packages/bsky/src/data-plane/server/routes/activity-subscription.ts index 1c476c8cf08..e75c64a26a3 100644 --- a/packages/bsky/src/data-plane/server/routes/activity-subscription.ts +++ b/packages/bsky/src/data-plane/server/routes/activity-subscription.ts @@ -1,14 +1,14 @@ import { PlainMessage } from '@bufbuild/protobuf' import { ServiceImpl } from '@connectrpc/connect' import { keyBy } from '@atproto/common' -import { Service } from '../../../proto/bsky_connect' +import { Service } from '../../../proto/bsky_connect.js' import { ActivitySubscription, GetActivitySubscriptionsByActorAndSubjectsResponse, -} from '../../../proto/bsky_pb' -import { Namespaces } from '../../../stash' -import { Database } from '../db' -import { StashKeyKey } from '../db/pagination' +} from '../../../proto/bsky_pb.js' +import { Namespaces } from '../../../stash.js' +import { Database } from '../db/index.js' +import { StashKeyKey } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getActivitySubscriptionsByActorAndSubjects(req) { diff --git a/packages/bsky/src/data-plane/server/routes/blocks.ts b/packages/bsky/src/data-plane/server/routes/blocks.ts index 54ec900b280..ac6cb4c7b38 100644 --- a/packages/bsky/src/data-plane/server/routes/blocks.ts +++ b/packages/bsky/src/data-plane/server/routes/blocks.ts @@ -1,7 +1,7 @@ import { ServiceImpl } from '@connectrpc/connect' -import { Service } from '../../../proto/bsky_connect' -import { Database } from '../db' -import { TimeCidKeyset, paginate } from '../db/pagination' +import { Service } from '../../../proto/bsky_connect.js' +import { Database } from '../db/index.js' +import { TimeCidKeyset, paginate } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getBidirectionalBlock(req) { diff --git a/packages/bsky/src/data-plane/server/routes/bookmarks.ts b/packages/bsky/src/data-plane/server/routes/bookmarks.ts index 3bf60bfbc74..0c1e4aec69f 100644 --- a/packages/bsky/src/data-plane/server/routes/bookmarks.ts +++ b/packages/bsky/src/data-plane/server/routes/bookmarks.ts @@ -1,14 +1,14 @@ import { PlainMessage, Timestamp } from '@bufbuild/protobuf' import { ServiceImpl } from '@connectrpc/connect' import { keyBy } from '@atproto/common' -import { Service } from '../../../proto/bsky_connect' +import { Service } from '../../../proto/bsky_connect.js' import { Bookmark, GetBookmarksByActorAndSubjectsResponse, -} from '../../../proto/bsky_pb' -import { Namespaces } from '../../../stash' -import { Database } from '../db' -import { StashKeyKey } from '../db/pagination' +} from '../../../proto/bsky_pb.js' +import { Namespaces } from '../../../stash.js' +import { Database } from '../db/index.js' +import { StashKeyKey } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getActorBookmarks(req) { diff --git a/packages/bsky/src/data-plane/server/routes/drafts.ts b/packages/bsky/src/data-plane/server/routes/drafts.ts index 31c7241047e..5f8aa942772 100644 --- a/packages/bsky/src/data-plane/server/routes/drafts.ts +++ b/packages/bsky/src/data-plane/server/routes/drafts.ts @@ -1,9 +1,9 @@ import { PlainMessage, Timestamp } from '@bufbuild/protobuf' import { ServiceImpl } from '@connectrpc/connect' -import { Service } from '../../../proto/bsky_connect' -import { DraftInfo } from '../../../proto/bsky_pb' -import { Database } from '../db' -import { IsoUpdatedAtKey } from '../db/pagination' +import { Service } from '../../../proto/bsky_connect.js' +import { DraftInfo } from '../../../proto/bsky_pb.js' +import { Database } from '../db/index.js' +import { IsoUpdatedAtKey } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getActorDrafts(req) { diff --git a/packages/bsky/src/data-plane/server/routes/feed-gens.ts b/packages/bsky/src/data-plane/server/routes/feed-gens.ts index 129229f923f..87ea57c38ec 100644 --- a/packages/bsky/src/data-plane/server/routes/feed-gens.ts +++ b/packages/bsky/src/data-plane/server/routes/feed-gens.ts @@ -1,7 +1,7 @@ import { ServiceImpl } from '@connectrpc/connect' -import { Service } from '../../../proto/bsky_connect' -import { Database } from '../db' -import { TimeCidKeyset, paginate } from '../db/pagination' +import { Service } from '../../../proto/bsky_connect.js' +import { Database } from '../db/index.js' +import { TimeCidKeyset, paginate } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getActorFeeds(req) { diff --git a/packages/bsky/src/data-plane/server/routes/feeds.ts b/packages/bsky/src/data-plane/server/routes/feeds.ts index 4a0135d748d..5c4f15dfde8 100644 --- a/packages/bsky/src/data-plane/server/routes/feeds.ts +++ b/packages/bsky/src/data-plane/server/routes/feeds.ts @@ -1,8 +1,8 @@ import { ServiceImpl } from '@connectrpc/connect' -import { Service } from '../../../proto/bsky_connect' -import { FeedType } from '../../../proto/bsky_pb' -import { Database } from '../db' -import { TimeCidKeyset, paginate } from '../db/pagination' +import { Service } from '../../../proto/bsky_connect.js' +import { FeedType } from '../../../proto/bsky_pb.js' +import { Database } from '../db/index.js' +import { TimeCidKeyset, paginate } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getAuthorFeed(req) { diff --git a/packages/bsky/src/data-plane/server/routes/follows.ts b/packages/bsky/src/data-plane/server/routes/follows.ts index 9038807fdac..253bce0a082 100644 --- a/packages/bsky/src/data-plane/server/routes/follows.ts +++ b/packages/bsky/src/data-plane/server/routes/follows.ts @@ -1,9 +1,9 @@ import { ServiceImpl } from '@connectrpc/connect' import { keyBy } from '@atproto/common' -import { Service } from '../../../proto/bsky_connect' -import { FollowsFollowing } from '../../../proto/bsky_pb' -import { Database } from '../db' -import { TimeCidKeyset, paginate } from '../db/pagination' +import { Service } from '../../../proto/bsky_connect.js' +import { FollowsFollowing } from '../../../proto/bsky_pb.js' +import { Database } from '../db/index.js' +import { TimeCidKeyset, paginate } from '../db/pagination.js' export default (db: Database): Partial> => ({ async getActorFollowsActors(req) { diff --git a/packages/bsky/src/data-plane/server/routes/identity.ts b/packages/bsky/src/data-plane/server/routes/identity.ts index 007ace4fe88..5a647df9b03 100644 --- a/packages/bsky/src/data-plane/server/routes/identity.ts +++ b/packages/bsky/src/data-plane/server/routes/identity.ts @@ -1,8 +1,8 @@ import { Timestamp } from '@bufbuild/protobuf' import { Code, ConnectError, ServiceImpl } from '@connectrpc/connect' import { DidDocument, IdResolver, getDid, getHandle } from '@atproto/identity' -import { Service } from '../../../proto/bsky_connect' -import { Database } from '../db' +import { Service } from '../../../proto/bsky_connect.js' +import { Database } from '../db/index.js' export default ( _db: Database, diff --git a/packages/bsky/src/data-plane/server/routes/index.ts b/packages/bsky/src/data-plane/server/routes/index.ts index 581cc5bf180..0afbabf4c43 100644 --- a/packages/bsky/src/data-plane/server/routes/index.ts +++ b/packages/bsky/src/data-plane/server/routes/index.ts @@ -1,33 +1,33 @@ import { ConnectRouter } from '@connectrpc/connect' import { IdResolver } from '@atproto/identity' -import { Service } from '../../../proto/bsky_connect' -import { Database } from '../db' -import activitySubscription from './activity-subscription' -import blocks from './blocks' -import bookmarks from './bookmarks' -import drafts from './drafts' -import feedGens from './feed-gens' -import feeds from './feeds' -import follows from './follows' -import identity from './identity' -import interactions from './interactions' -import labels from './labels' -import likes from './likes' -import lists from './lists' -import moderation from './moderation' -import mutes from './mutes' -import notifs from './notifs' -import profile from './profile' -import quotes from './quotes' -import records from './records' -import relationships from './relationships' -import reposts from './reposts' -import search from './search' -import sitemap from './sitemap' -import starterPacks from './starter-packs' -import suggestions from './suggestions' -import sync from './sync' -import threads from './threads' +import { Service } from '../../../proto/bsky_connect.js' +import { Database } from '../db/index.js' +import activitySubscription from './activity-subscription.js' +import blocks from './blocks.js' +import bookmarks from './bookmarks.js' +import drafts from './drafts.js' +import feedGens from './feed-gens.js' +import feeds from './feeds.js' +import follows from './follows.js' +import identity from './identity.js' +import interactions from './interactions.js' +import labels from './labels.js' +import likes from './likes.js' +import lists from './lists.js' +import moderation from './moderation.js' +import mutes from './mutes.js' +import notifs from './notifs.js' +import profile from './profile.js' +import quotes from './quotes.js' +import records from './records.js' +import relationships from './relationships.js' +import reposts from './reposts.js' +import search from './search.js' +import sitemap from './sitemap.js' +import starterPacks from './starter-packs.js' +import suggestions from './suggestions.js' +import sync from './sync.js' +import threads from './threads.js' export default (db: Database, idResolver: IdResolver) => (router: ConnectRouter) => diff --git a/packages/bsky/src/data-plane/server/routes/interactions.ts b/packages/bsky/src/data-plane/server/routes/interactions.ts index 86f6f5dc47d..8eed166aef9 100644 --- a/packages/bsky/src/data-plane/server/routes/interactions.ts +++ b/packages/bsky/src/data-plane/server/routes/interactions.ts @@ -1,8 +1,8 @@ import { ServiceImpl } from '@connectrpc/connect' import { DAY, keyBy } from '@atproto/common' -import { Service } from '../../../proto/bsky_connect' -import { Database } from '../db' -import { countAll } from '../db/util' +import { Service } from '../../../proto/bsky_connect.js' +import { Database } from '../db/index.js' +import { countAll } from '../db/util.js' export default (db: Database): Partial> => ({ async getInteractionCounts(req) { diff --git a/packages/bsky/src/data-plane/server/routes/labels.ts b/packages/bsky/src/data-plane/server/routes/labels.ts index 9c1e5438731..6413cdd6509 100644 --- a/packages/bsky/src/data-plane/server/routes/labels.ts +++ b/packages/bsky/src/data-plane/server/routes/labels.ts @@ -2,9 +2,9 @@ import { ServiceImpl } from '@connectrpc/connect' import { Selectable, sql } from 'kysely' import * as ui8 from 'uint8arrays' import { noUndefinedVals } from '@atproto/common' -import { Service } from '../../../proto/bsky_connect' -import { Database } from '../db' -import { Label } from '../db/tables/label' +import { Service } from '../../../proto/bsky_connect.js' +import { Database } from '../db/index.js' +import { Label } from '../db/tables/label.js' type LabelRow = Selectable

= ( req: IncomingMessage | ExpressRequest, diff --git a/packages/xrpc-server/tests/_util.ts b/packages/xrpc-server/tests/_util.ts index c71e23bbf65..fc2520f67ea 100644 --- a/packages/xrpc-server/tests/_util.ts +++ b/packages/xrpc-server/tests/_util.ts @@ -13,7 +13,7 @@ import { Options, Server, StreamConfigOrHandler, -} from '../src' +} from '../src/index.js' // @ts-expect-error Symbol.asyncDispose ??= Symbol.for('nodejs.asyncDispose') diff --git a/packages/xrpc-server/tests/auth.test.ts b/packages/xrpc-server/tests/auth.test.ts index aade6dd6778..6a0a402d78a 100644 --- a/packages/xrpc-server/tests/auth.test.ts +++ b/packages/xrpc-server/tests/auth.test.ts @@ -7,13 +7,13 @@ import { MINUTE } from '@atproto/common' import { Secp256k1Keypair } from '@atproto/crypto' import { LexiconDoc } from '@atproto/lexicon' import { XRPCError, XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' +import * as xrpcServer from '../src/index.js' import { basicAuthHeaders, closeServer, createBasicAuth, createServer, -} from './_util' +} from './_util.js' const LEXICONS: LexiconDoc[] = [ { diff --git a/packages/xrpc-server/tests/errors.test.ts b/packages/xrpc-server/tests/errors.test.ts index aa2cbba9513..c91b5481f71 100644 --- a/packages/xrpc-server/tests/errors.test.ts +++ b/packages/xrpc-server/tests/errors.test.ts @@ -2,8 +2,8 @@ import * as http from 'node:http' import { AddressInfo } from 'node:net' import { LexiconDoc } from '@atproto/lexicon' import { XRPCError, XRPCInvalidResponseError, XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' -import { closeServer, createServer } from './_util' +import * as xrpcServer from '../src/index.js' +import { closeServer, createServer } from './_util.js' const UPSTREAM_LEXICONS: LexiconDoc[] = [ { diff --git a/packages/xrpc-server/tests/frames.test.ts b/packages/xrpc-server/tests/frames.test.ts index 9eb26791354..4737a3aaec7 100644 --- a/packages/xrpc-server/tests/frames.test.ts +++ b/packages/xrpc-server/tests/frames.test.ts @@ -1,6 +1,6 @@ import { encode } from '@atproto/lex-cbor' import { ui8Equals } from '@atproto/lex-data' -import { ErrorFrame, Frame, FrameType, MessageFrame } from '../src' +import { ErrorFrame, Frame, FrameType, MessageFrame } from '../src/index.js' describe('Frames', () => { it('creates and parses message frame.', async () => { diff --git a/packages/xrpc-server/tests/ipld.test.ts b/packages/xrpc-server/tests/ipld.test.ts index d79a2605c42..209150e97af 100644 --- a/packages/xrpc-server/tests/ipld.test.ts +++ b/packages/xrpc-server/tests/ipld.test.ts @@ -4,8 +4,8 @@ import { AddressInfo } from 'node:net' import { CID } from 'multiformats/cid' import { LexiconDoc } from '@atproto/lexicon' import { XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' -import { closeServer, createServer } from './_util' +import * as xrpcServer from '../src/index.js' +import { closeServer, createServer } from './_util.js' const LEXICONS: LexiconDoc[] = [ { diff --git a/packages/xrpc-server/tests/parameters.test.ts b/packages/xrpc-server/tests/parameters.test.ts index 2aac189f215..d46e709e59b 100644 --- a/packages/xrpc-server/tests/parameters.test.ts +++ b/packages/xrpc-server/tests/parameters.test.ts @@ -2,13 +2,13 @@ import * as http from 'node:http' import { AddressInfo } from 'node:net' import { LexiconDoc } from '@atproto/lexicon' import { XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' +import * as xrpcServer from '../src/index.js' import { buildAddLexicons, buildMethodLexicons, closeServer, createServer, -} from './_util' +} from './_util.js' const LEXICONS: LexiconDoc[] = [ { diff --git a/packages/xrpc-server/tests/parsing.test.ts b/packages/xrpc-server/tests/parsing.test.ts index 3b6806fe5e1..42abfd92e92 100644 --- a/packages/xrpc-server/tests/parsing.test.ts +++ b/packages/xrpc-server/tests/parsing.test.ts @@ -1,4 +1,4 @@ -import { parseUrlNsid } from '../src/util' +import { parseUrlNsid } from '../src/util.js' const testValid = (url: string, expected: string) => { expect(parseUrlNsid(url)).toBe(expected) diff --git a/packages/xrpc-server/tests/procedures.test.ts b/packages/xrpc-server/tests/procedures.test.ts index d9ef7a4832f..ea205583d15 100644 --- a/packages/xrpc-server/tests/procedures.test.ts +++ b/packages/xrpc-server/tests/procedures.test.ts @@ -4,13 +4,13 @@ import { AddressInfo } from 'node:net' import { Readable } from 'node:stream' import { LexiconDoc } from '@atproto/lexicon' import { XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' +import * as xrpcServer from '../src/index.js' import { buildAddLexicons, buildMethodLexicons, closeServer, createServer, -} from './_util' +} from './_util.js' const LEXICONS = [ { diff --git a/packages/xrpc-server/tests/queries.test.ts b/packages/xrpc-server/tests/queries.test.ts index f4c6edf35be..383903328cb 100644 --- a/packages/xrpc-server/tests/queries.test.ts +++ b/packages/xrpc-server/tests/queries.test.ts @@ -2,13 +2,13 @@ import * as http from 'node:http' import { AddressInfo } from 'node:net' import { LexiconDoc } from '@atproto/lexicon' import { XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' +import * as xrpcServer from '../src/index.js' import { buildAddLexicons, buildMethodLexicons, closeServer, createServer, -} from './_util' +} from './_util.js' const LEXICONS = [ { diff --git a/packages/xrpc-server/tests/rate-limiter.test.ts b/packages/xrpc-server/tests/rate-limiter.test.ts index 69b19e7d985..ca064e6fad8 100644 --- a/packages/xrpc-server/tests/rate-limiter.test.ts +++ b/packages/xrpc-server/tests/rate-limiter.test.ts @@ -3,9 +3,9 @@ import { AddressInfo } from 'node:net' import { MINUTE } from '@atproto/common' import { LexiconDoc } from '@atproto/lexicon' import { XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' -import { MemoryRateLimiter } from '../src' -import { closeServer, createServer } from './_util' +import * as xrpcServer from '../src/index.js' +import { MemoryRateLimiter } from '../src/index.js' +import { closeServer, createServer } from './_util.js' const LEXICONS: LexiconDoc[] = [ { diff --git a/packages/xrpc-server/tests/responses.test.ts b/packages/xrpc-server/tests/responses.test.ts index 344e689b91a..8b0f3202f38 100644 --- a/packages/xrpc-server/tests/responses.test.ts +++ b/packages/xrpc-server/tests/responses.test.ts @@ -3,8 +3,8 @@ import { AddressInfo } from 'node:net' import { byteIterableToStream } from '@atproto/common' import { LexiconDoc } from '@atproto/lexicon' import { XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' -import { closeServer, createServer } from './_util' +import * as xrpcServer from '../src/index.js' +import { closeServer, createServer } from './_util.js' const LEXICONS: LexiconDoc[] = [ { diff --git a/packages/xrpc-server/tests/stream.test.ts b/packages/xrpc-server/tests/stream.test.ts index faae93e564b..dcf2fc965a6 100644 --- a/packages/xrpc-server/tests/stream.test.ts +++ b/packages/xrpc-server/tests/stream.test.ts @@ -10,7 +10,7 @@ import { XrpcStreamServer, byFrame, byMessage, -} from '../src' +} from '../src/index.js' describe('Stream', () => { const wait = (ms) => new Promise((res) => setTimeout(res, ms)) diff --git a/packages/xrpc-server/tests/subscriptions.test.ts b/packages/xrpc-server/tests/subscriptions.test.ts index 6552e514c54..ec8952a3b59 100644 --- a/packages/xrpc-server/tests/subscriptions.test.ts +++ b/packages/xrpc-server/tests/subscriptions.test.ts @@ -3,8 +3,14 @@ import { AddressInfo } from 'node:net' import { WebSocket, createWebSocketStream } from 'ws' import { wait } from '@atproto/common' import { LexiconDoc, Lexicons } from '@atproto/lexicon' -import { ErrorFrame, Frame, MessageFrame, Subscription, byFrame } from '../src' -import * as xrpcServer from '../src' +import { + ErrorFrame, + Frame, + MessageFrame, + Subscription, + byFrame, +} from '../src/index.js' +import * as xrpcServer from '../src/index.js' import { basicAuthHeaders, buildAddLexicons, @@ -12,7 +18,7 @@ import { closeServer, createBasicAuth, createServer, -} from './_util' +} from './_util.js' const LEXICONS = [ { diff --git a/packages/xrpc/src/client.ts b/packages/xrpc/src/client.ts index 009563500a8..11d98bdc019 100644 --- a/packages/xrpc/src/client.ts +++ b/packages/xrpc/src/client.ts @@ -1,7 +1,7 @@ import { LexiconDoc, Lexicons } from '@atproto/lexicon' -import { CallOptions, QueryParams } from './types' -import { combineHeaders } from './util' -import { XrpcClient } from './xrpc-client' +import { CallOptions, QueryParams } from './types.js' +import { combineHeaders } from './util.js' +import { XrpcClient } from './xrpc-client.js' /** @deprecated Use {@link XrpcClient} instead */ export class Client { diff --git a/packages/xrpc/src/fetch-handler.ts b/packages/xrpc/src/fetch-handler.ts index 76a0b877930..b59ee058afa 100644 --- a/packages/xrpc/src/fetch-handler.ts +++ b/packages/xrpc/src/fetch-handler.ts @@ -1,5 +1,5 @@ -import { Gettable } from './types' -import { combineHeaders } from './util' +import { Gettable } from './types.js' +import { combineHeaders } from './util.js' export type FetchHandler = ( this: void, diff --git a/packages/xrpc/src/index.ts b/packages/xrpc/src/index.ts index f14bb111c25..37ff21df0ae 100644 --- a/packages/xrpc/src/index.ts +++ b/packages/xrpc/src/index.ts @@ -1,10 +1,10 @@ -export * from './client' -export * from './fetch-handler' -export * from './types' -export * from './util' -export * from './xrpc-client' +export * from './client.js' +export * from './fetch-handler.js' +export * from './types.js' +export * from './util.js' +export * from './xrpc-client.js' -import { Client } from './client' +import { Client } from './client.js' /** @deprecated create a local {@link XrpcClient} instance instead */ const defaultInst = new Client() export default defaultInst diff --git a/packages/xrpc/src/util.ts b/packages/xrpc/src/util.ts index 6fd21f885ca..7210f8f42f1 100644 --- a/packages/xrpc/src/util.ts +++ b/packages/xrpc/src/util.ts @@ -12,7 +12,7 @@ import { ResponseType, XRPCError, errorResponseBody, -} from './types' +} from './types.js' const ReadableStream = globalThis.ReadableStream || diff --git a/packages/xrpc/src/xrpc-client.ts b/packages/xrpc/src/xrpc-client.ts index cab2c003ebd..9e877ffb125 100644 --- a/packages/xrpc/src/xrpc-client.ts +++ b/packages/xrpc/src/xrpc-client.ts @@ -4,7 +4,7 @@ import { FetchHandlerObject, FetchHandlerOptions, buildFetchHandler, -} from './fetch-handler' +} from './fetch-handler.js' import { CallOptions, Gettable, @@ -14,7 +14,7 @@ import { XRPCInvalidResponseError, XRPCResponse, httpResponseCodeToEnum, -} from './types' +} from './types.js' import { combineHeaders, constructMethodCallHeaders, @@ -23,7 +23,7 @@ import { getMethodSchemaHTTPMethod, httpResponseBodyParse, isErrorResponseBody, -} from './util' +} from './util.js' export class XrpcClient { readonly fetchHandler: FetchHandler diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d3b55098ee..6de76f438da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,7 +29,7 @@ importers: version: 0.2.24(@swc/core@1.11.18) '@types/jest': specifier: ^28.1.4 - version: 28.1.4 + version: 28.1.8 '@types/node': specifier: ^22.0.0 version: 22.19.17 @@ -64,8 +64,8 @@ importers: specifier: ^5.1.3 version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) node-gyp: specifier: ^9.3.1 version: 9.3.1 @@ -122,8 +122,8 @@ importers: specifier: ^28.1.3 version: 28.1.3 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) prettier: specifier: ^3.2.5 version: 3.2.5 @@ -321,9 +321,6 @@ importers: '@did-plc/server': specifier: ^0.0.1 version: 0.0.1 - '@jest/globals': - specifier: '28' - version: 28.1.3 '@types/cors': specifier: ^2.8.12 version: 2.8.12 @@ -339,15 +336,15 @@ importers: '@types/qs': specifier: ^6.9.7 version: 6.9.7 - jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 + vitest: + specifier: ^4.0.16 + version: 4.0.16(@types/node@22.19.17) packages/bsync: dependencies: @@ -398,8 +395,8 @@ importers: specifier: ^5.1.1 version: 5.1.1 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) @@ -426,8 +423,8 @@ importers: version: 8.21.0 devDependencies: jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -451,8 +448,8 @@ importers: version: 3.24.2 devDependencies: jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -473,8 +470,8 @@ importers: specifier: workspace:^ version: link:../common jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -562,8 +559,8 @@ importers: specifier: ^0.2.24 version: 0.2.24(@swc/core@1.13.3) jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -593,8 +590,8 @@ importers: specifier: ^6.1.2 version: 6.1.2 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1136,8 +1133,8 @@ importers: version: 3.24.2 devDependencies: jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1166,12 +1163,12 @@ importers: '@atproto/lex-cbor': specifier: workspace:^ version: link:../lex/lex-cbor - jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 + vitest: + specifier: ^4.0.16 + version: 4.0.16(@types/node@22.19.17) packages/oauth/jwk: dependencies: @@ -1353,13 +1350,13 @@ importers: version: 3.45.1 expo: specifier: '*' - version: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + version: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) expo-web-browser: specifier: ^15.0.8 version: 15.0.8(expo@54.0.12)(react-native@0.81.4) react-native: specifier: '*' - version: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + version: 0.81.4(@babel/core@7.29.0)(react@19.2.0) react-native-mmkv: specifier: ^3.3.3 version: 3.3.3(react-native@0.81.4)(react@19.2.0) @@ -1624,8 +1621,8 @@ importers: version: link:../../syntax devDependencies: jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -1749,8 +1746,8 @@ importers: specifier: ^6.9.7 version: 6.9.7 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) ts-node: specifier: ^10.8.2 version: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) @@ -1933,8 +1930,8 @@ importers: specifier: ^6.1.2 version: 6.1.2 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) puppeteer: specifier: ^23.11.1 version: 23.11.1(typescript@6.0.3) @@ -1976,8 +1973,8 @@ importers: version: 3.24.2 devDependencies: jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -2013,8 +2010,8 @@ importers: specifier: ^8.5.4 version: 8.5.4 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -2085,8 +2082,8 @@ importers: specifier: ^6.1.2 version: 6.1.2 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -2177,8 +2174,8 @@ importers: specifier: ^6.1.2 version: 6.1.2 jest: - specifier: ^28.1.2 - version: 28.1.2(@types/node@22.19.17)(ts-node@10.8.2) + specifier: ^30.0.0 + version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) jose: specifier: ^4.15.4 version: 4.15.4 @@ -2986,14 +2983,6 @@ packages: '@babel/highlight': 7.22.10 dev: false - /@babel/code-frame@7.22.10: - resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.10 - chalk: 2.4.2 - dev: true - /@babel/code-frame@7.27.1: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -3002,6 +2991,14 @@ packages: js-tokens: 4.0.0 picocolors: 1.1.1 + /@babel/code-frame@7.29.0: + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + /@babel/compat-data@7.26.8: resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} @@ -3009,44 +3006,48 @@ packages: /@babel/compat-data@7.28.4: resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} engines: {node: '>=6.9.0'} + dev: false + + /@babel/compat-data@7.29.3: + resolution: {integrity: sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==} + engines: {node: '>=6.9.0'} - /@babel/core@7.18.6: - resolution: {integrity: sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==} + /@babel/core@7.26.9: + resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.18.6) + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) '@babel/helpers': 7.26.9 '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 '@babel/types': 7.28.4 - convert-source-map: 1.9.0 + convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /@babel/core@7.26.9: - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + /@babel/core@7.29.0: + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -3071,7 +3072,17 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + /@babel/generator@7.29.1: + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -3080,7 +3091,7 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 dev: false /@babel/helper-compilation-targets@7.26.5: @@ -3102,18 +3113,29 @@ packages: browserslist: 4.26.3 lru-cache: 5.1.1 semver: 6.3.1 + dev: false + + /@babel/helper-compilation-targets@7.28.6: + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.29.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.3 + lru-cache: 5.1.1 + semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.26.9): + /@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.29.0): resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/traverse': 7.28.4 semver: 6.3.1 @@ -3121,26 +3143,26 @@ packages: - supports-color dev: false - /@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.26.9): + /@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 dev: false - /@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.26.9): + /@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.29.0): resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.10 @@ -3156,8 +3178,8 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color dev: false @@ -3166,8 +3188,8 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -3176,7 +3198,17 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-module-imports@7.28.6: + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -3193,52 +3225,55 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.28.3(@babel/core@7.18.6): + /@babel/helper-module-transforms@7.28.3(@babel/core@7.29.0): resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - dev: true + dev: false - /@babel/helper-module-transforms@7.28.3(@babel/core@7.26.9): - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + /@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - dev: false /@babel/helper-optimise-call-expression@7.27.1: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 dev: false /@babel/helper-plugin-utils@7.27.1: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.9): + /@babel/helper-plugin-utils@7.28.6: + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + /@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 '@babel/traverse': 7.28.4 @@ -3246,16 +3281,16 @@ packages: - supports-color dev: false - /@babel/helper-replace-supers@7.27.1(@babel/core@7.26.9): + /@babel/helper-replace-supers@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color dev: false @@ -3264,8 +3299,8 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color dev: false @@ -3304,7 +3339,7 @@ packages: dependencies: '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color dev: false @@ -3314,7 +3349,14 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 + + /@babel/helpers@7.29.2: + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 /@babel/highlight@7.22.10: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} @@ -3323,6 +3365,7 @@ packages: '@babel/helper-validator-identifier': 7.27.1 chalk: 2.4.2 js-tokens: 4.0.0 + dev: false /@babel/parser@7.26.9: resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} @@ -3336,7 +3379,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 /@babel/parser@7.28.5: resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} @@ -3345,127 +3388,145 @@ packages: dependencies: '@babel/types': 7.28.5 - /@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.26.9): + /@babel/parser@7.29.3: + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.29.0 + + /@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.29.0): resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.26.9): + /@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.18.6): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.9): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.18.6): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.9): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.9): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.18.6): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.9): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 + dev: true - /@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.26.9): + /@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.9): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-syntax-export-default-from@7.27.1(@babel/core@7.26.9): + /@babel/plugin-syntax-export-default-from@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-syntax-flow@7.27.1(@babel/core@7.26.9): + /@babel/plugin-syntax-flow@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.18.6): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + /@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0): + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.9): @@ -3475,15 +3536,15 @@ packages: dependencies: '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 + dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.18.6): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.9): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -3492,126 +3553,134 @@ packages: dependencies: '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.26.9): + /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.27.1 - dev: false + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.18.6): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.9): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.18.6): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.9): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.18.6): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.9): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.18.6): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.9): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.18.6): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.9): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.18.6): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.9): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.18.6): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.18.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: true @@ -3623,6 +3692,16 @@ packages: dependencies: '@babel/core': 7.26.9 '@babel/helper-plugin-utils': 7.27.1 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.27.1 /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.26.9): resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} @@ -3631,164 +3710,174 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + dev: true + + /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.0): + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 - /@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.26.9): + /@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.29.0): resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.9) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.9) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.26.9): + /@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.29.0): resolution: {integrity: sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.26.9): + /@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.29.0): resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-classes@7.28.4(@babel/core@7.26.9): + /@babel/plugin-transform-classes@7.28.4(@babel/core@7.29.0): resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.9) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.0) '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 dev: false - /@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.26.9): + /@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.29.0): resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.29.0) dev: false - /@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.28.4 @@ -3796,331 +3885,331 @@ packages: - supports-color dev: false - /@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.26.9): + /@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.29.0): resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.9) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.26.9): + /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0): resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.26.9): + /@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.29.0): resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.26.9) - '@babel/types': 7.28.4 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.26.9): + /@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.29.0): resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-runtime@7.28.3(@babel/core@7.26.9): + /@babel/plugin-transform-runtime@7.28.3(@babel/core@7.29.0): resolution: {integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.9) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.26.9) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.26.9) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-spread@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/plugin-transform-typescript@7.28.0(@babel/core@7.26.9): + /@babel/plugin-transform-typescript@7.28.0(@babel/core@7.29.0): resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.26.9) + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.9): + /@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 dev: false - /@babel/preset-react@7.27.1(@babel/core@7.26.9): + /@babel/preset-react@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false - /@babel/preset-typescript@7.27.1(@babel/core@7.26.9): + /@babel/preset-typescript@7.27.1(@babel/core@7.29.0): resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.26.9) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false @@ -4141,7 +4230,15 @@ packages: dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 + + /@babel/template@7.28.6: + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 /@babel/traverse@7.26.9: resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} @@ -4163,11 +4260,25 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.29.0: + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.3 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -4193,6 +4304,13 @@ packages: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + /@babel/types@7.29.0: + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -4699,12 +4817,28 @@ packages: - pg-native - supports-color + /@emnapi/core@1.10.0: + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + requiresBuild: true + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + dev: true + optional: true + /@emnapi/runtime@1.4.5: resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} requiresBuild: true dependencies: tslib: 2.8.1 - dev: false + optional: true + + /@emnapi/wasi-threads@1.2.1: + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true optional: true /@esbuild/aix-ppc64@0.21.5: @@ -5252,7 +5386,7 @@ packages: connect: 3.7.0 debug: 4.4.3 env-editor: 0.4.2 - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) expo-server: 1.0.0 freeport-async: 2.0.0 getenv: 2.0.0 @@ -5268,7 +5402,7 @@ packages: progress: 2.0.3 prompts: 2.4.2 qrcode-terminal: 0.11.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) require-from-string: 2.0.2 requireg: 0.2.2 resolve: 1.22.4 @@ -5368,7 +5502,7 @@ packages: dependencies: chalk: 4.1.2 react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /@expo/env@2.0.7: @@ -5461,7 +5595,7 @@ packages: debug: 4.4.3 dotenv: 16.4.7 dotenv-expand: 11.0.7 - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) getenv: 2.0.0 glob: 10.4.5 hermes-parser: 0.29.1 @@ -5536,7 +5670,7 @@ packages: '@expo/json-file': 10.0.7 '@react-native/normalize-colors': 0.81.4 debug: 4.4.3 - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) resolve-from: 5.0.0 semver: 7.6.3 xml2js: 0.6.0 @@ -5572,7 +5706,7 @@ packages: dependencies: expo-font: 14.0.8(expo@54.0.12)(react-native@0.81.4)(react@19.2.0) react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /@expo/ws-tunnel@1.0.6: @@ -5966,57 +6100,58 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - /@jest/console@28.1.3: - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/console@30.4.1: + resolution: {integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/types': 28.1.3 + '@jest/types': 30.4.1 '@types/node': 22.19.17 chalk: 4.1.2 - jest-message-util: 28.1.3 - jest-util: 28.1.3 + jest-message-util: 30.4.1 + jest-util: 30.4.1 slash: 3.0.0 dev: true - /@jest/core@28.1.3(ts-node@10.8.2): - resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/core@30.4.2(ts-node@10.8.2): + resolution: {integrity: sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true dependencies: - '@jest/console': 28.1.3 - '@jest/reporters': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/console': 30.4.1 + '@jest/pattern': 30.4.0 + '@jest/reporters': 30.4.1 + '@jest/test-result': 30.4.1 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 '@types/node': 22.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 + ci-info: 4.4.0 + exit-x: 0.2.2 + fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-changed-files: 28.1.3 - jest-config: 28.1.3(@types/node@22.19.17)(ts-node@10.8.2) - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-resolve-dependencies: 28.1.3 - jest-runner: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - jest-watcher: 28.1.3 - micromatch: 4.0.5 - pretty-format: 28.1.3 - rimraf: 3.0.2 + jest-changed-files: 30.4.1 + jest-config: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) + jest-haste-map: 30.4.1 + jest-message-util: 30.4.1 + jest-regex-util: 30.4.0 + jest-resolve: 30.4.1 + jest-resolve-dependencies: 30.4.2 + jest-runner: 30.4.2 + jest-runtime: 30.4.2 + jest-snapshot: 30.4.1 + jest-util: 30.4.1 + jest-validate: 30.4.1 + jest-watcher: 30.4.1 + pretty-format: 30.4.1 slash: 3.0.0 - strip-ansi: 6.0.1 transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register - supports-color - ts-node dev: true @@ -6035,6 +6170,11 @@ packages: '@jest/types': 29.6.3 dev: false + /@jest/diff-sequences@30.4.0: + resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dev: true + /@jest/environment@28.1.3: resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6055,6 +6195,16 @@ packages: jest-mock: 29.7.0 dev: false + /@jest/environment@30.4.1: + resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/fake-timers': 30.4.1 + '@jest/types': 30.4.1 + '@types/node': 22.19.17 + jest-mock: 30.4.1 + dev: true + /@jest/expect-utils@28.1.3: resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6062,6 +6212,13 @@ packages: jest-get-type: 28.0.2 dev: true + /@jest/expect-utils@30.4.1: + resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/get-type': 30.1.0 + dev: true + /@jest/expect@28.1.3: resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6072,6 +6229,16 @@ packages: - supports-color dev: true + /@jest/expect@30.4.1: + resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + expect: 30.4.1 + jest-snapshot: 30.4.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/fake-timers@28.1.3: resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6096,6 +6263,23 @@ packages: jest-util: 29.7.0 dev: false + /@jest/fake-timers@30.4.1: + resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/types': 30.4.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 22.19.17 + jest-message-util: 30.4.1 + jest-mock: 30.4.1 + jest-util: 30.4.1 + dev: true + + /@jest/get-type@30.1.0: + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dev: true + /@jest/globals@28.1.3: resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6107,9 +6291,29 @@ packages: - supports-color dev: true - /@jest/reporters@28.1.3: - resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/globals@30.4.1: + resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/environment': 30.4.1 + '@jest/expect': 30.4.1 + '@jest/types': 30.4.1 + jest-mock: 30.4.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/pattern@30.4.0: + resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@types/node': 22.19.17 + jest-regex-util: 30.4.0 + dev: true + + /@jest/reporters@30.4.1: + resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -6117,29 +6321,27 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/console': 30.4.1 + '@jest/test-result': 30.4.1 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 '@jridgewell/trace-mapping': 0.3.31 '@types/node': 22.19.17 chalk: 4.1.2 collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 + exit-x: 0.2.2 + glob: 10.5.0 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - jest-worker: 28.1.3 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.4.1 + jest-util: 30.4.1 + jest-worker: 30.4.1 slash: 3.0.0 string-length: 4.0.2 - strip-ansi: 6.0.1 - terminal-link: 2.1.1 v8-to-istanbul: 9.1.0 transitivePeerDependencies: - supports-color @@ -6158,32 +6360,49 @@ packages: dependencies: '@sinclair/typebox': 0.27.8 - /@jest/source-map@28.1.2: - resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/schemas@30.4.1: + resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@sinclair/typebox': 0.34.49 + dev: true + + /@jest/snapshot-utils@30.4.1: + resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/types': 30.4.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + dev: true + + /@jest/source-map@30.0.1: + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 dev: true - /@jest/test-result@28.1.3: - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/test-result@30.4.1: + resolution: {integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/console': 28.1.3 - '@jest/types': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.4 + '@jest/console': 30.4.1 + '@jest/types': 30.4.1 + '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 dev: true - /@jest/test-sequencer@28.1.3: - resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/test-sequencer@30.4.1: + resolution: {integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/test-result': 28.1.3 + '@jest/test-result': 30.4.1 graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 + jest-haste-map: 30.4.1 slash: 3.0.0 dev: true @@ -6191,7 +6410,7 @@ packages: resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@jest/types': 28.1.3 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 @@ -6233,6 +6452,28 @@ packages: - supports-color dev: false + /@jest/transform@30.4.1: + resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@babel/core': 7.29.0 + '@jest/types': 30.4.1 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.4.1 + jest-regex-util: 30.4.0 + jest-util: 30.4.1 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -6267,6 +6508,19 @@ packages: '@types/yargs': 17.0.35 chalk: 4.1.2 + /@jest/types@30.4.1: + resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/pattern': 30.4.0 + '@jest/schemas': 30.4.1 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.19.17 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + dev: true + /@jridgewell/gen-mapping@0.3.13: resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} dependencies: @@ -6290,6 +6544,12 @@ packages: '@jridgewell/trace-mapping': 0.3.31 dev: true + /@jridgewell/remapping@2.3.5: + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -6540,6 +6800,16 @@ packages: moo: 0.5.2 dev: true + /@napi-rs/wasm-runtime@0.2.12: + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + requiresBuild: true + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.2 + dev: true + optional: true + /@noble/curves@1.8.0: resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} engines: {node: ^14.21.3 || >=16} @@ -6586,7 +6856,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.6.3 + semver: 7.7.4 dev: true /@npmcli/move-file@2.0.1: @@ -6695,7 +6965,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} requiresBuild: true - dev: false optional: true /@pkgr/core@0.1.1: @@ -6703,6 +6972,11 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dev: true + /@pkgr/core@0.2.9: + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false @@ -7240,79 +7514,79 @@ packages: engines: {node: '>= 20.19.4'} dev: false - /@react-native/babel-plugin-codegen@0.81.4(@babel/core@7.26.9): + /@react-native/babel-plugin-codegen@0.81.4(@babel/core@7.29.0): resolution: {integrity: sha512-6ztXf2Tl2iWznyI/Da/N2Eqymt0Mnn69GCLnEFxFbNdk0HxHPZBNWU9shTXhsLWOL7HATSqwg/bB1+3kY1q+mA==} engines: {node: '>= 20.19.4'} dependencies: '@babel/traverse': 7.28.4 - '@react-native/codegen': 0.81.4(@babel/core@7.26.9) + '@react-native/codegen': 0.81.4(@babel/core@7.29.0) transitivePeerDependencies: - '@babel/core' - supports-color dev: false - /@react-native/babel-preset@0.81.4(@babel/core@7.26.9): + /@react-native/babel-preset@0.81.4(@babel/core@7.29.0): resolution: {integrity: sha512-VYj0c/cTjQJn/RJ5G6P0L9wuYSbU9yGbPYDHCKstlQZQWkk+L9V8ZDbxdJBTIei9Xl3KPQ1odQ4QaeW+4v+AZg==} engines: {node: '>= 20.19.4'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.26.9) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.26.9) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.26.9) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.9) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.26.9) - '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.26.9) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) '@babel/template': 7.27.2 - '@react-native/babel-plugin-codegen': 0.81.4(@babel/core@7.26.9) + '@react-native/babel-plugin-codegen': 0.81.4(@babel/core@7.29.0) babel-plugin-syntax-hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.9) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color dev: false - /@react-native/codegen@0.81.4(@babel/core@7.26.9): + /@react-native/codegen@0.81.4(@babel/core@7.29.0): resolution: {integrity: sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==} engines: {node: '>= 20.19.4'} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/parser': 7.28.4 glob: 7.2.3 hermes-parser: 0.29.1 @@ -7400,7 +7674,7 @@ packages: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /@rollup/rollup-android-arm-eabi@4.34.9: @@ -7566,6 +7840,10 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@sinclair/typebox@0.34.49: + resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} + dev: true + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} dependencies: @@ -7576,7 +7854,6 @@ packages: resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 - dev: false /@sinonjs/fake-timers@10.3.0: resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} @@ -7584,6 +7861,12 @@ packages: '@sinonjs/commons': 3.0.1 dev: false + /@sinonjs/fake-timers@15.4.0: + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true + /@sinonjs/fake-timers@9.1.2: resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} dependencies: @@ -8609,6 +8892,14 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true + /@tybys/wasm-util@0.10.2: + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + requiresBuild: true + dependencies: + tslib: 2.8.1 + dev: true + optional: true + /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: @@ -8621,18 +8912,18 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.29.0 /@types/babel__traverse@7.20.7: resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.29.0 /@types/bn.js@5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} @@ -8720,6 +9011,10 @@ packages: /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: @@ -8730,10 +9025,16 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.0 - /@types/jest@28.1.4: - resolution: {integrity: sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA==} + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} dependencies: - jest-matcher-utils: 28.1.3 + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest@28.1.8: + resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} + dependencies: + expect: 28.1.3 pretty-format: 28.1.3 dev: true @@ -8846,6 +9147,11 @@ packages: /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: false + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true /@types/uuid@9.0.8: resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -9039,7 +9345,160 @@ packages: /@ungap/structured-clone@1.3.0: resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - dev: false + + /@unrs/resolver-binding-android-arm-eabi@1.11.1: + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-android-arm64@1.11.1: + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-arm64@1.11.1: + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-darwin-x64@1.11.1: + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-freebsd-x64@1.11.1: + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1: + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm-musleabihf@1.11.1: + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-gnu@1.11.1: + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-arm64-musl@1.11.1: + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-ppc64-gnu@1.11.1: + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-gnu@1.11.1: + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-riscv64-musl@1.11.1: + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-s390x-gnu@1.11.1: + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-gnu@1.11.1: + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-linux-x64-musl@1.11.1: + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-wasm32-wasi@1.11.1: + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + dev: true + optional: true + + /@unrs/resolver-binding-win32-arm64-msvc@1.11.1: + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-ia32-msvc@1.11.1: + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@unrs/resolver-binding-win32-x64-msvc@1.11.1: + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true /@urql/core@5.2.0: resolution: {integrity: sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==} @@ -9315,6 +9774,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: false /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -9541,41 +10001,41 @@ packages: requiresBuild: true dev: true - /babel-jest@28.1.3(@babel/core@7.18.6): - resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /babel-jest@29.7.0(@babel/core@7.29.0): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.18.6 - '@jest/transform': 28.1.3 + '@babel/core': 7.29.0 + '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 28.1.3(@babel/core@7.18.6) + babel-preset-jest: 29.6.3(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true + dev: false - /babel-jest@29.7.0(@babel/core@7.26.9): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /babel-jest@30.4.1(@babel/core@7.29.0): + resolution: {integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.8.0 + '@babel/core': ^7.11.0 || ^8.0.0-0 dependencies: - '@babel/core': 7.26.9 - '@jest/transform': 29.7.0 + '@babel/core': 7.29.0 + '@jest/transform': 30.4.1 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.9) + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.4.0(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: false + dev: true /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} @@ -9589,14 +10049,17 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-jest-hoist@28.1.3: - resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color dev: true /babel-plugin-jest-hoist@29.6.3: @@ -9604,11 +10067,18 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 dev: false + /babel-plugin-jest-hoist@30.4.0: + resolution: {integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@types/babel__core': 7.20.5 + dev: true + /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -9618,38 +10088,38 @@ packages: resolve: 1.22.4 dev: true - /babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.26.9): + /babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.29.0): resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/compat-data': 7.28.4 - '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.26.9): + /babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.29.0) core-js-compat: 3.45.1 transitivePeerDependencies: - supports-color dev: false - /babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.26.9): + /babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.29.0): resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.9) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.29.0) transitivePeerDependencies: - supports-color dev: false @@ -9670,34 +10140,14 @@ packages: hermes-parser: 0.29.1 dev: false - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.26.9): + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.0): resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} dependencies: - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - '@babel/core' dev: false - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.18.6): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.6 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.18.6) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.18.6) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.18.6) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.18.6) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.18.6) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.18.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.18.6) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.18.6) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.6) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.18.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.18.6) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.18.6) - dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.26.9): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -9716,8 +10166,52 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.9) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.9) + dev: true - /babel-preset-expo@54.0.3(@babel/core@7.26.9)(@babel/runtime@7.22.10)(expo@54.0.12)(react-refresh@0.14.2): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.29.0): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + dev: false + + /babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + dev: true + + /babel-preset-expo@54.0.3(@babel/core@7.29.0)(@babel/runtime@7.22.10)(expo@54.0.12)(react-refresh@0.14.2): resolution: {integrity: sha512-zC6g96Mbf1bofnCI8yI0VKAp8/ER/gpfTsWOpQvStbHU+E4jFZ294n3unW8Hf6nNP4NoeNq9Zc6Prp0vwhxbow==} peerDependencies: '@babel/runtime': ^7.20.0 @@ -9730,28 +10224,28 @@ packages: optional: true dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.26.9) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.26.9) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.26.9) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.9) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.9) - '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.26.9) - '@babel/preset-react': 7.27.1(@babel/core@7.26.9) - '@babel/preset-typescript': 7.27.1(@babel/core@7.26.9) + '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.29.0) + '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-export-default-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.29.0) + '@babel/preset-react': 7.27.1(@babel/core@7.29.0) + '@babel/preset-typescript': 7.27.1(@babel/core@7.29.0) '@babel/runtime': 7.22.10 - '@react-native/babel-preset': 0.81.4(@babel/core@7.26.9) + '@react-native/babel-preset': 0.81.4(@babel/core@7.29.0) babel-plugin-react-compiler: 19.1.0-rc.3 babel-plugin-react-native-web: 0.21.1 babel-plugin-syntax-hermes-parser: 0.29.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.9) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0) debug: 4.4.3 - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) react-refresh: 0.14.2 resolve-from: 5.0.0 transitivePeerDependencies: @@ -9759,28 +10253,28 @@ packages: - supports-color dev: false - /babel-preset-jest@28.1.3(@babel/core@7.18.6): - resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.6 - babel-plugin-jest-hoist: 28.1.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.18.6) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.26.9): + /babel-preset-jest@29.6.3(@babel/core@7.29.0): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.26.9) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.29.0) dev: false + /babel-preset-jest@30.4.0(@babel/core@7.29.0): + resolution: {integrity: sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + dependencies: + '@babel/core': 7.29.0 + babel-plugin-jest-hoist: 30.4.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -9995,13 +10489,6 @@ packages: balanced-match: 4.0.4 dev: true - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - /braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -10191,6 +10678,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: false /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -10285,12 +10773,17 @@ packages: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} + /ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + dev: true + /cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: false /cjs-module-lexer@2.2.0: resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} - dev: false /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -10371,6 +10864,7 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: false /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -10380,6 +10874,7 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -10815,8 +11310,13 @@ packages: mimic-response: 3.1.0 dev: false - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + /dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true dev: true /deep-extend@0.6.0: @@ -11058,8 +11558,8 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} dev: true @@ -11621,7 +12121,7 @@ packages: eslint: '>=6.0.0' dependencies: eslint: 8.57.0 - semver: 7.6.3 + semver: 7.7.4 dev: true /eslint-config-prettier@9.1.0(eslint@8.57.0): @@ -11944,7 +12444,7 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -11955,8 +12455,8 @@ packages: strip-final-newline: 2.0.0 dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + /exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} dev: true @@ -11981,6 +12481,18 @@ packages: jest-util: 28.1.3 dev: true + /expect@30.4.1: + resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/expect-utils': 30.4.1 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.4.1 + jest-message-util: 30.4.1 + jest-mock: 30.4.1 + jest-util: 30.4.1 + dev: true + /expo-asset@12.0.9(expo@54.0.12)(react-native@0.81.4)(react@19.2.0): resolution: {integrity: sha512-vrdRoyhGhBmd0nJcssTSk1Ypx3Mbn/eXaaBCQVkL0MJ8IOZpAObAjfD5CTy8+8RofcHEQdh3wwZVCs7crvfOeg==} peerDependencies: @@ -11989,10 +12501,10 @@ packages: react-native: '*' dependencies: '@expo/image-utils': 0.8.7 - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) expo-constants: 18.0.9(expo@54.0.12)(react-native@0.81.4) react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) transitivePeerDependencies: - supports-color dev: false @@ -12005,8 +12517,8 @@ packages: dependencies: '@expo/config': 12.0.10 '@expo/env': 2.0.7 - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) transitivePeerDependencies: - supports-color dev: false @@ -12017,8 +12529,8 @@ packages: expo: '*' react-native: '*' dependencies: - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /expo-font@14.0.8(expo@54.0.12)(react-native@0.81.4)(react@19.2.0): @@ -12028,10 +12540,10 @@ packages: react: '*' react-native: '*' dependencies: - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) fontfaceobserver: 2.3.0 react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /expo-keep-awake@15.0.7(expo@54.0.12)(react@19.2.0): @@ -12040,7 +12552,7 @@ packages: expo: '*' react: '*' dependencies: - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) react: 19.2.0 dev: false @@ -12064,7 +12576,7 @@ packages: dependencies: invariant: 2.2.4 react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /expo-server@1.0.0: @@ -12078,11 +12590,11 @@ packages: expo: '*' react-native: '*' dependencies: - expo: 54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0) - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + expo: 54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false - /expo@54.0.12(@babel/core@7.26.9)(react-native@0.81.4)(react@19.2.0): + /expo@54.0.12(@babel/core@7.29.0)(react-native@0.81.4)(react@19.2.0): resolution: {integrity: sha512-BVvG1A9BlKAOBwczMi7XThOLzI3TUShkV/yRnAMGvQP5SQFDq7UojkZLLG285gg3OvkoqjMUE0tZvVXbvuI4tA==} hasBin: true peerDependencies: @@ -12109,7 +12621,7 @@ packages: '@expo/metro-config': 54.0.6(expo@54.0.12) '@expo/vector-icons': 15.0.2(expo-font@14.0.8)(react-native@0.81.4)(react@19.2.0) '@ungap/structured-clone': 1.3.0 - babel-preset-expo: 54.0.3(@babel/core@7.26.9)(@babel/runtime@7.22.10)(expo@54.0.12)(react-refresh@0.14.2) + babel-preset-expo: 54.0.3(@babel/core@7.29.0)(@babel/runtime@7.22.10)(expo@54.0.12)(react-refresh@0.14.2) expo-asset: 12.0.9(expo@54.0.12)(react-native@0.81.4)(react@19.2.0) expo-constants: 18.0.9(expo@54.0.12)(react-native@0.81.4) expo-file-system: 19.0.16(expo@54.0.12)(react-native@0.81.4) @@ -12119,7 +12631,7 @@ packages: expo-modules-core: 3.0.20(react-native@0.81.4)(react@19.2.0) pretty-format: 29.7.0 react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -12318,7 +12830,7 @@ packages: pend: 1.2.0 dev: true - /fdir@6.4.3(picomatch@4.0.2): + /fdir@6.4.3(picomatch@4.0.3): resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 @@ -12326,7 +12838,7 @@ packages: picomatch: optional: true dependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 dev: false /fdir@6.5.0(picomatch@4.0.3): @@ -12367,13 +12879,6 @@ packages: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - /fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -12761,6 +13266,19 @@ packages: path-scurry: 1.11.1 dev: false + /glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + dev: true + /glob@11.0.1: resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} engines: {node: 20 || >=22} @@ -12895,6 +13413,7 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: false /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -13205,8 +13724,8 @@ packages: module-details-from-path: 1.0.4 dev: false - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + /import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true dependencies: @@ -13630,6 +14149,7 @@ packages: /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} + dev: false /istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -13639,7 +14159,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -13647,24 +14167,26 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + /istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 + semver: 7.7.4 + transitivePeerDependencies: + - supports-color dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} dependencies: - debug: 4.4.3 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color + make-dir: 4.0.0 + supports-color: 7.2.0 dev: true /istanbul-lib-source-maps@5.0.6: @@ -13678,14 +14200,6 @@ packages: - supports-color dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - /istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} @@ -13709,7 +14223,6 @@ packages: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: false /jackspeak@4.1.0: resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} @@ -13718,44 +14231,47 @@ packages: '@isaacs/cliui': 8.0.2 dev: true - /jest-changed-files@28.1.3: - resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-changed-files@30.4.1: + resolution: {integrity: sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: execa: 5.1.1 + jest-util: 30.4.1 p-limit: 3.1.0 dev: true - /jest-circus@28.1.3: - resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-circus@30.4.2: + resolution: {integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/expect': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 30.4.1 + '@jest/expect': 30.4.1 + '@jest/test-result': 30.4.1 + '@jest/types': 30.4.1 '@types/node': 22.19.17 chalk: 4.1.2 co: 4.6.0 - dedent: 0.7.0 + dedent: 1.7.2 is-generator-fn: 2.1.0 - jest-each: 28.1.3 - jest-matcher-utils: 28.1.3 - jest-message-util: 28.1.3 - jest-runtime: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-each: 30.4.1 + jest-matcher-utils: 30.4.1 + jest-message-util: 30.4.1 + jest-runtime: 30.4.2 + jest-snapshot: 30.4.1 + jest-util: 30.4.1 p-limit: 3.1.0 - pretty-format: 28.1.3 + pretty-format: 30.4.1 + pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: true - /jest-cli@28.1.3(@types/node@22.19.17)(ts-node@10.8.2): - resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-cli@30.4.2(@types/node@22.19.17)(ts-node@10.8.2): + resolution: {integrity: sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -13763,61 +14279,66 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3(ts-node@10.8.2) - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/core': 30.4.2(ts-node@10.8.2) + '@jest/test-result': 30.4.1 + '@jest/types': 30.4.1 chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 28.1.3(@types/node@22.19.17)(ts-node@10.8.2) - jest-util: 28.1.3 - jest-validate: 28.1.3 - prompts: 2.4.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) + jest-util: 30.4.1 + jest-validate: 30.4.1 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' + - babel-plugin-macros + - esbuild-register - supports-color - ts-node dev: true - /jest-config@28.1.3(@types/node@22.19.17)(ts-node@10.8.2): - resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-config@30.4.2(@types/node@22.19.17)(ts-node@10.8.2): + resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' + esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': optional: true + esbuild-register: + optional: true ts-node: optional: true dependencies: - '@babel/core': 7.18.6 - '@jest/test-sequencer': 28.1.3 - '@jest/types': 28.1.3 + '@babel/core': 7.29.0 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.4.0 + '@jest/test-sequencer': 30.4.1 + '@jest/types': 30.4.1 '@types/node': 22.19.17 - babel-jest: 28.1.3(@babel/core@7.18.6) + babel-jest: 30.4.1(@babel/core@7.29.0) chalk: 4.1.2 - ci-info: 3.8.0 + ci-info: 4.4.0 deepmerge: 4.3.1 - glob: 7.2.3 + glob: 10.5.0 graceful-fs: 4.2.11 - jest-circus: 28.1.3 - jest-environment-node: 28.1.3 - jest-get-type: 28.0.2 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-runner: 28.1.3 - jest-util: 28.1.3 - jest-validate: 28.1.3 - micromatch: 4.0.8 + jest-circus: 30.4.2 + jest-docblock: 30.4.0 + jest-environment-node: 30.4.1 + jest-regex-util: 30.4.0 + jest-resolve: 30.4.1 + jest-runner: 30.4.2 + jest-util: 30.4.1 + jest-validate: 30.4.1 parse-json: 5.2.0 - pretty-format: 28.1.3 + pretty-format: 30.4.1 slash: 3.0.0 strip-json-comments: 3.1.1 ts-node: 10.8.2(@swc/core@1.11.18)(@types/node@22.19.17)(typescript@6.0.3) transitivePeerDependencies: + - babel-plugin-macros - supports-color dev: true @@ -13831,11 +14352,14 @@ packages: pretty-format: 28.1.3 dev: true - /jest-docblock@28.1.1: - resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-diff@30.4.1: + resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - detect-newline: 3.1.0 + '@jest/diff-sequences': 30.4.0 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.4.1 dev: true /jest-docblock@29.7.0: @@ -13845,27 +14369,22 @@ packages: detect-newline: 3.1.0 dev: false - /jest-each@28.1.3: - resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-docblock@30.4.0: + resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/types': 28.1.3 - chalk: 4.1.2 - jest-get-type: 28.0.2 - jest-util: 28.1.3 - pretty-format: 28.1.3 + detect-newline: 3.1.0 dev: true - /jest-environment-node@28.1.3: - resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-each@30.4.1: + resolution: {integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 22.19.17 - jest-mock: 28.1.3 - jest-util: 28.1.3 + '@jest/get-type': 30.1.0 + '@jest/types': 30.4.1 + chalk: 4.1.2 + jest-util: 30.4.1 + pretty-format: 30.4.1 dev: true /jest-environment-node@29.7.0: @@ -13880,6 +14399,19 @@ packages: jest-util: 29.7.0 dev: false + /jest-environment-node@30.4.1: + resolution: {integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/environment': 30.4.1 + '@jest/fake-timers': 30.4.1 + '@jest/types': 30.4.1 + '@types/node': 22.19.17 + jest-mock: 30.4.1 + jest-util: 30.4.1 + jest-validate: 30.4.1 + dev: true + /jest-get-type@28.0.2: resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13927,12 +14459,30 @@ packages: fsevents: 2.3.3 dev: false - /jest-leak-detector@28.1.3: - resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-haste-map@30.4.1: + resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - jest-get-type: 28.0.2 - pretty-format: 28.1.3 + '@jest/types': 30.4.1 + '@types/node': 22.19.17 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.4.0 + jest-util: 30.4.1 + jest-worker: 30.4.1 + picomatch: 4.0.3 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-leak-detector@30.4.1: + resolution: {integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/get-type': 30.1.0 + pretty-format: 30.4.1 dev: true /jest-matcher-utils@28.1.3: @@ -13945,13 +14495,23 @@ packages: pretty-format: 28.1.3 dev: true + /jest-matcher-utils@30.4.1: + resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.4.1 + pretty-format: 30.4.1 + dev: true + /jest-message-util@28.1.3: resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@babel/code-frame': 7.22.10 + '@babel/code-frame': 7.29.0 '@jest/types': 28.1.3 - '@types/stack-utils': 2.0.1 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -13975,6 +14535,22 @@ packages: stack-utils: 2.0.6 dev: false + /jest-message-util@30.4.1: + resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@babel/code-frame': 7.29.0 + '@jest/types': 30.4.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.4.1 + picomatch: 4.0.3 + pretty-format: 30.4.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + /jest-mock@28.1.3: resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13992,7 +14568,16 @@ packages: jest-util: 29.7.0 dev: false - /jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): + /jest-mock@30.4.1: + resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/types': 30.4.1 + '@types/node': 22.19.17 + jest-util: 30.4.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -14001,7 +14586,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 28.1.3 + jest-resolve: 30.4.1 dev: true /jest-regex-util@28.0.2: @@ -14014,84 +14599,89 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: false - /jest-resolve-dependencies@28.1.3: - resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-regex-util@30.4.0: + resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dev: true + + /jest-resolve-dependencies@30.4.2: + resolution: {integrity: sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - jest-regex-util: 28.0.2 - jest-snapshot: 28.1.3 + jest-regex-util: 30.4.0 + jest-snapshot: 30.4.1 transitivePeerDependencies: - supports-color dev: true - /jest-resolve@28.1.3: - resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-resolve@30.4.1: + resolution: {integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) - jest-util: 28.1.3 - jest-validate: 28.1.3 - resolve: 1.22.4 - resolve.exports: 1.1.1 + jest-haste-map: 30.4.1 + jest-pnp-resolver: 1.2.3(jest-resolve@30.4.1) + jest-util: 30.4.1 + jest-validate: 30.4.1 slash: 3.0.0 + unrs-resolver: 1.11.1 dev: true - /jest-runner@28.1.3: - resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-runner@30.4.2: + resolution: {integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/console': 28.1.3 - '@jest/environment': 28.1.3 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/console': 30.4.1 + '@jest/environment': 30.4.1 + '@jest/test-result': 30.4.1 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 '@types/node': 22.19.17 chalk: 4.1.2 - emittery: 0.10.2 + emittery: 0.13.1 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 28.1.1 - jest-environment-node: 28.1.3 - jest-haste-map: 28.1.3 - jest-leak-detector: 28.1.3 - jest-message-util: 28.1.3 - jest-resolve: 28.1.3 - jest-runtime: 28.1.3 - jest-util: 28.1.3 - jest-watcher: 28.1.3 - jest-worker: 28.1.3 + jest-docblock: 30.4.0 + jest-environment-node: 30.4.1 + jest-haste-map: 30.4.1 + jest-leak-detector: 30.4.1 + jest-message-util: 30.4.1 + jest-resolve: 30.4.1 + jest-runtime: 30.4.2 + jest-util: 30.4.1 + jest-watcher: 30.4.1 + jest-worker: 30.4.1 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color dev: true - /jest-runtime@28.1.3: - resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-runtime@30.4.2: + resolution: {integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/environment': 28.1.3 - '@jest/fake-timers': 28.1.3 - '@jest/globals': 28.1.3 - '@jest/source-map': 28.1.2 - '@jest/test-result': 28.1.3 - '@jest/transform': 28.1.3 - '@jest/types': 28.1.3 + '@jest/environment': 30.4.1 + '@jest/fake-timers': 30.4.1 + '@jest/globals': 30.4.1 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.4.1 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 + '@types/node': 22.19.17 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 + cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.2 - execa: 5.1.1 - glob: 7.2.3 + glob: 10.5.0 graceful-fs: 4.2.11 - jest-haste-map: 28.1.3 - jest-message-util: 28.1.3 - jest-mock: 28.1.3 - jest-regex-util: 28.0.2 - jest-resolve: 28.1.3 - jest-snapshot: 28.1.3 - jest-util: 28.1.3 + jest-haste-map: 30.4.1 + jest-message-util: 30.4.1 + jest-mock: 30.4.1 + jest-regex-util: 30.4.0 + jest-resolve: 30.4.1 + jest-snapshot: 30.4.1 + jest-util: 30.4.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: @@ -14129,6 +14719,35 @@ packages: - supports-color dev: true + /jest-snapshot@30.4.1: + resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) + '@babel/types': 7.29.0 + '@jest/expect-utils': 30.4.1 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.4.1 + '@jest/transform': 30.4.1 + '@jest/types': 30.4.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + chalk: 4.1.2 + expect: 30.4.1 + graceful-fs: 4.2.11 + jest-diff: 30.4.1 + jest-matcher-utils: 30.4.1 + jest-message-util: 30.4.1 + jest-util: 30.4.1 + pretty-format: 30.4.1 + semver: 7.7.4 + synckit: 0.11.12 + transitivePeerDependencies: + - supports-color + dev: true + /jest-util@28.1.3: resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -14153,16 +14772,16 @@ packages: picomatch: 2.3.1 dev: false - /jest-validate@28.1.3: - resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-util@30.4.1: + resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/types': 28.1.3 - camelcase: 6.3.0 + '@jest/types': 30.4.1 + '@types/node': 22.19.17 chalk: 4.1.2 - jest-get-type: 28.0.2 - leven: 3.1.0 - pretty-format: 28.1.3 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.3 dev: true /jest-validate@29.7.0: @@ -14176,17 +14795,29 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 - /jest-watcher@28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-validate@30.4.1: + resolution: {integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} dependencies: - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 + '@jest/get-type': 30.1.0 + '@jest/types': 30.4.1 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.4.1 + dev: true + + /jest-watcher@30.4.1: + resolution: {integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/test-result': 30.4.1 + '@jest/types': 30.4.1 '@types/node': 22.19.17 ansi-escapes: 4.3.2 chalk: 4.1.2 - emittery: 0.10.2 - jest-util: 28.1.3 + emittery: 0.13.1 + jest-util: 30.4.1 string-length: 4.0.2 dev: true @@ -14209,9 +14840,20 @@ packages: supports-color: 8.1.1 dev: false - /jest@28.1.2(@types/node@22.19.17)(ts-node@10.8.2): - resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /jest-worker@30.4.1: + resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@types/node': 22.19.17 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.4.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@30.4.2(@types/node@22.19.17)(ts-node@10.8.2): + resolution: {integrity: sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -14219,12 +14861,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 28.1.3(ts-node@10.8.2) - '@jest/types': 28.1.3 - import-local: 3.1.0 - jest-cli: 28.1.3(@types/node@22.19.17)(ts-node@10.8.2) + '@jest/core': 30.4.2(ts-node@10.8.2) + '@jest/types': 30.4.1 + import-local: 3.2.0 + jest-cli: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) transitivePeerDependencies: - '@types/node' + - babel-plugin-macros + - esbuild-register - supports-color - ts-node dev: true @@ -14357,6 +15001,7 @@ packages: /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + dev: false /koalas@1.0.2: resolution: {integrity: sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA==} @@ -14752,7 +15397,6 @@ packages: /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} - dev: false /lru-cache@11.0.2: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} @@ -14876,7 +15520,7 @@ packages: resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.26.9 + '@babel/core': 7.29.0 flow-enums-runtime: 0.0.6 hermes-parser: 0.32.0 nullthrows: 1.1.1 @@ -15061,7 +15705,7 @@ packages: engines: {node: '>=20.19.4'} dependencies: '@babel/traverse': 7.26.9 - '@babel/traverse--for-generate-function-map': /@babel/traverse@7.28.4 + '@babel/traverse--for-generate-function-map': /@babel/traverse@7.29.0 '@babel/types': 7.26.9 flow-enums-runtime: 0.0.6 invariant: 2.2.4 @@ -15079,7 +15723,7 @@ packages: engines: {node: '>=20.19.4'} dependencies: '@babel/traverse': 7.26.9 - '@babel/traverse--for-generate-function-map': /@babel/traverse@7.28.4 + '@babel/traverse--for-generate-function-map': /@babel/traverse@7.29.0 '@babel/types': 7.26.9 flow-enums-runtime: 0.0.6 invariant: 2.2.4 @@ -15140,8 +15784,8 @@ packages: resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.26.9 - '@babel/generator': 7.28.3 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 flow-enums-runtime: 0.0.6 @@ -15177,10 +15821,10 @@ packages: resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.26.9 - '@babel/generator': 7.28.3 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 metro: 0.83.3 metro-babel-transformer: 0.83.3 @@ -15298,14 +15942,6 @@ packages: - utf-8-validate dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - /micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -15549,6 +16185,12 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false + /napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + dev: true + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -16091,7 +16733,6 @@ packages: dependencies: lru-cache: 10.2.0 minipass: 7.1.2 - dev: false /path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} @@ -16191,11 +16832,6 @@ packages: engines: {node: '>=10'} dev: false - /picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - dev: false - /picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -16274,6 +16910,11 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + /pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + dev: true + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -16486,7 +17127,7 @@ packages: '@jest/schemas': 28.1.3 ansi-regex: 5.0.1 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 dev: true /pretty-format@29.7.0: @@ -16497,6 +17138,16 @@ packages: ansi-styles: 5.2.0 react-is: 18.2.0 + /pretty-format@30.4.1: + resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + dependencies: + '@jest/schemas': 30.4.1 + ansi-styles: 5.2.0 + react-is-18: /react-is@18.3.1 + react-is-19: /react-is@19.2.6 + dev: true + /proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -16548,6 +17199,7 @@ packages: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + dev: false /protobufjs@7.2.5: resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} @@ -16656,6 +17308,10 @@ packages: resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} dev: true + /pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + dev: true + /qrcode-terminal@0.11.0: resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} hasBin: true @@ -16755,6 +17411,14 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: true + + /react-is@19.2.6: + resolution: {integrity: sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==} + dev: true + /react-json-view@1.21.3(@types/react@19.0.10)(react-dom@19.0.0)(react@19.0.0): resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} peerDependencies: @@ -16783,7 +17447,7 @@ packages: react-native: '*' dependencies: react: 19.2.0 - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) dev: false /react-native-url-polyfill@3.0.0(react-native@0.81.4): @@ -16791,11 +17455,11 @@ packages: peerDependencies: react-native: '*' dependencies: - react-native: 0.81.4(@babel/core@7.26.9)(react@19.2.0) + react-native: 0.81.4(@babel/core@7.29.0)(react@19.2.0) whatwg-url-without-unicode: 8.0.0-3 dev: false - /react-native@0.81.4(@babel/core@7.26.9)(react@19.2.0): + /react-native@0.81.4(@babel/core@7.29.0)(react@19.2.0): resolution: {integrity: sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==} engines: {node: '>= 20.19.4'} hasBin: true @@ -16808,7 +17472,7 @@ packages: dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.81.4 - '@react-native/codegen': 0.81.4(@babel/core@7.26.9) + '@react-native/codegen': 0.81.4(@babel/core@7.29.0) '@react-native/community-cli-plugin': 0.81.4 '@react-native/gradle-plugin': 0.81.4 '@react-native/js-polyfills': 0.81.4 @@ -16817,7 +17481,7 @@ packages: abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.26.9) + babel-jest: 29.7.0(@babel/core@7.29.0) babel-plugin-syntax-hermes-parser: 0.29.1 base64-js: 1.5.1 commander: 12.1.0 @@ -17136,11 +17800,6 @@ packages: resolution: {integrity: sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==} dev: false - /resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} - dev: true - /resolve.exports@2.0.3: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} @@ -17602,6 +18261,7 @@ packages: /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -17986,6 +18646,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: false /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -18005,11 +18666,19 @@ packages: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 + dev: false /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.2.9 + dev: true + /synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -18119,6 +18788,7 @@ packages: dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 + dev: false /terser@5.44.0: resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} @@ -18196,8 +18866,8 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.3(picomatch@4.0.3) + picomatch: 4.0.3 dev: false /tinyglobby@0.2.15: @@ -18615,6 +19285,33 @@ packages: resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==} dev: true + /unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + requiresBuild: true + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + dev: true + /update-browserslist-db@1.1.3(browserslist@4.24.4): resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -19050,6 +19747,14 @@ packages: imurmurhash: 0.1.4 signal-exit: 3.0.7 + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + /ws@6.2.3: resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} peerDependencies: diff --git a/jest.setup.ts b/test.setup.ts similarity index 100% rename from jest.setup.ts rename to test.setup.ts diff --git a/vitest.config.ts b/vitest.config.ts index 6baeeea96a7..7329d626a57 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -11,6 +11,11 @@ export default defineConfig({ '**/tests/**', ], }, - projects: ['packages/lex/*', 'packages/syntax', 'packages/tap'], + projects: [ + 'packages/bsky', + 'packages/lex/*', + 'packages/syntax', + 'packages/tap', + ], }, }) From c459153395a30ce89e050892c8fab7dc98e019b9 Mon Sep 17 00:00:00 2001 From: devin ivy Date: Mon, 18 May 2026 23:09:36 -0400 Subject: [PATCH 43/87] Switch to ESM: type: module, Node16 resolution, CJS interop (#4943) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgrade multiformats from ^9 to ^13 Co-Authored-By: Claude Opus 4.6 (1M context) * Upgrade uint8arrays from 3 to ^5 Co-Authored-By: Claude Opus 4.6 (1M context) * Upgrade p-queue from ^6 to ^8 Co-Authored-By: Claude Opus 4.6 (1M context) * Upgrade jose from ^4 to ^5 in xrpc-server Co-Authored-By: Claude Opus 4.6 (1M context) * Switch to ESM: type: module, Node16 resolution, CJS interop fixes Core ESM infrastructure: - Set "type": "module" and "exports" in all package.json files - Change tsconfig base to module: Node16, target: ES2022 - Update tsconfig/tests.json and tsconfig/vitest.json for NodeNext - Add tsconfig/cjs-default-exports.d.ts for CJS interop type declarations - Remove multiformats pnpm patch (no longer needed with native ESM) - Add @jest/globals and update @types/jest to ^30 in root - Enable ESM mode in jest configs (extensionsToTreatAsEsm, SWC es6) - Add jest.varint-shim.cjs for varint CJS interop in tests - Update eslint config for ESM patterns CJS interop and source fixes: - Fix CJS default import interop (await-lock, key-encoder, typed-emitter, iso-datestring-validator, file-type, @hapi/accept, pg) - Replace __dirname with import.meta.dirname - Replace require.resolve with import.meta.resolve - Fix EventEmitter import (node:stream → node:events) - Fix node:dns/promises CJS interop - Bundle handlebars runtime into email templates - Convert service entrypoints from .js to .ts - Add explicit return type annotations for kysely (TS2883) - Set useDefineForClassFields: false Test fixes: - Add NODE_OPTIONS=--experimental-vm-modules to jest test scripts - Use jest.unstable_mockModule for ESM-compatible mocking - Fix age-assurance test types for vitest - Update crypto did.test.ts with proper decompressPubkey assertions Co-Authored-By: Claude Opus 4.6 (1M context) * Address PR #4931 feedback - errors.test.ts: use AtpAgent type directly from @atproto/api - Fix double-slash imports in moderation-mutewords and redis-cache tests - age-assurance/util.ts: add proper return type instead of any - Remove unnecessary cjs-default-exports.d.ts from api and aws tsconfigs Co-Authored-By: Claude Opus 4.6 (1M context) * ci * Revert unrelated lexicon/changelog changes from divy/esm The convoRef removal and CHANGELOG entries were from unrelated PRs that got baked into divy/esm during rebasing. Co-Authored-By: Claude Opus 4.6 (1M context) * Fix lint/type regressions from divy/esm: revert stylistic changes Revert files that had unnecessary no-unused-expressions changes, catch-var renames, and empty-object-type introductions from divy/esm. Keep eslintrc as established on divy/typescript-6. Targeted fixes: - xrpc-server/tests/bodies.test.ts: add missing .js extensions - ozone/tests/blob-divert.test.ts: add .js extension, fix ts-expect-error - pds/tests/oauth.test.ts: add ! assertion for lastCall Co-Authored-By: Claude Opus 4.6 (1M context) * Restore clobbered upstream changes, fix package.json fields - Restore files that were incorrectly overwritten with stale divy/esm versions: publish.yaml, ipld.ts, moderator-client.ts, unicast.ts, lex-client/types.ts, nodejs-buffer.ts, admonition.tsx, ozone lexicons, hydrator.ts, views/index.ts, ozone status/set services, pds account-device, jwk-jose/util.ts - Restore package.json: devEngines, pnpm.executionEnv, publish:ci script - Remove ineffective @ts-ignore directives for TS2883 Co-Authored-By: Claude Opus 4.6 (1M context) * Patch kysely@0.22.0: export internal types for Node16 declaration emit Under moduleResolution: node16, TypeScript refuses to emit declarations that reference types from non-exported subpaths. Kysely 0.22 doesn't export its internal parser types (QueryCreatorWithCommonTableExpression, QueryBuilderWithSelection, Nullable) or expose subpath access. The patch: - Adds wildcard subpath exports (./dist/esm/*, ./dist/cjs/*) so TypeScript can reference internal .d.ts paths in declarations - Re-exports missing types from the main index.d.ts - Adds a "types" condition to the exports map Also adds ToolsOzoneModerationGetReporterStats import to dev-env moderator-client for the same reason (@atproto/api internal path). Remove this patch once kysely is upgraded. Co-Authored-By: Claude Opus 4.6 (1M context) * Add @jest/globals imports for ESM test mode Under ESM mode, jest globals aren't available implicitly. Add explicit imports from @jest/globals and add the dep to identity, pds, xrpc-server, and ozone devDependencies. Co-Authored-By: Claude Opus 4.6 (1M context) * Restore @jest/globals import in pds oauth.test.ts This was clobbered when reverting from divy/esm. Without the import, jest.spyOn() fails with 'jest is not defined' under ESM mode. Co-Authored-By: Claude Opus 4.6 (1M context) * Remove lex-cbor vite bundling, clean up redundant package.json exports - lex-cbor: removed vite bundling step, build via tsc only. The bundling was added to handle cborg as ESM-only when lex-cbor itself was CJS. Now that lex-cbor is type:module, native ESM resolution handles cborg directly. Moves cborg from devDependencies to dependencies. - Remove redundant "browser" and "require" entries from lex/* package exports where they pointed to the same file as "default". Co-Authored-By: Claude Opus 4.6 (1M context) * Address PR #4943 feedback - crypto/tests/signatures.test.ts: use canonical fileURLToPath pattern for __dirname instead of import.meta.dirname - dev-env/bin.js, lex-cli/bin.js: use static import instead of dynamic import() for the dist entry shim - lex-document/src/index.ts: restore Symbol.dispose polyfill imports - core-js: switch from core-js/modules/* paths to core-js/es/* paths (more semantic, matches @types/core-js v3 conventions). Required .js extensions on imports for Node16 ESM resolution. Added per-package core-js.d.ts declarations and updated tests tsconfigs to include them - oauth-provider-ui/vite.config.mjs: prioritize "browser" condition - Add separate changeset for lex-cli generated .js extensions (BREAKING) Co-Authored-By: Claude Opus 4.6 (1M context) * fix lex-cli changeset * Remove : any return types from PDS account-manager kysely query builders The kysely patch (subpath wildcard exports + missing type re-exports) makes these functions' inferred types portable in declaration emit, so the explicit : any annotations are no longer needed. Also drops a few related any usages in destructured row params and oauth-store.ts that the inferred types now cover. Co-Authored-By: Claude Opus 4.6 (1M context) * tidy * remove need for "type-emitter" module override (#4949) * remove need for "type-emitter" module override * use helper function instead of type override to unwrap "key-encoder" * tidy * remove "cjs-default-exports" file * Add comment explaining dynamic imports in pds handles test The await import() pattern is required because jest.unstable_mockModule() must register before the dep graph loads node:dns/promises. Static imports would link everything before any code evaluates, bypassing the mock. Co-Authored-By: Claude Opus 4.6 (1M context) * Rename jest.setup.ts to test.setup.ts The setup file has nothing jest-specific in it (just loads dotenv), and it's now also used by vitest configs. Co-Authored-By: Claude Opus 4.6 (1M context) * Properly type callerInterceptor test and consolidate into single case Use actual @connectrpc/connect types (UnaryRequest, StreamRequest, etc.) instead of `as any` casts, and merge redundant test cases. Co-Authored-By: Claude Opus 4.6 (1M context) * Bump tsconfig module to Node20, use json import attribute for tlds Node24 strictly requires `with { type: 'json' }` on JSON imports under ESM. The `tlds` package's main entry is a raw JSON file, so the api package's import would fail at runtime. Bumping the tsconfig module setting to Node20 enables the import attribute syntax to pass through to emitted output, while keeping moduleResolution at node16 (the only valid value alongside nodenext/bundler). Co-Authored-By: Claude Opus 4.6 (1M context) * Fix service Docker builds and pds package.json access - Copy ./patches into all four service Docker build stages so `pnpm install --frozen-lockfile` can apply the kysely patch. - Expose ./package.json in @atproto/pds's exports so the pds service entrypoint can import it for version inheritance. Co-Authored-By: Claude Opus 4.6 (1M context) * chore: repo workflow on all prs * tidy * tidy * tidy * tidy * Preserve JSON import attributes in @swc/jest transform SWC strips `with { type: 'json' }` during module transformation by default, which causes Node 24 to hard-error on JSON imports under ESM. Enable jsc.parser.importAttributes to parse the syntax in .js files and jsc.experimental.keepImportAttributes to preserve it through emit. Co-Authored-By: Claude Opus 4.6 (1M context) * tidy --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: Matthieu Sieben --- .changeset/esm-migration.md | 65 +++++ .changeset/lex-cli-js-extensions.md | 6 + jest.varint-shim.cjs | 7 + package.json | 27 +- packages/api/jest.config.cjs | 16 +- packages/api/package.json | 15 +- packages/api/scripts/code/labels.mjs | 2 +- .../types/com/germnetwork/declaration.ts | 6 +- packages/api/src/moderation/const/labels.ts | 2 +- packages/api/src/rich-text/detection.ts | 2 +- packages/api/tests/errors.test.ts | 4 +- .../api/tests/moderation-mutewords.test.ts | 2 +- packages/aws/package.json | 13 +- packages/aws/src/kms.ts | 5 +- packages/bsky/package.json | 13 +- packages/bsky/src/api/age-assurance/util.ts | 4 +- .../api/app/bsky/notification/updateSeen.ts | 6 +- packages/bsky/src/auth-verifier.ts | 5 +- .../bsky/src/data-plane/server/background.ts | 2 +- packages/bsky/src/data-plane/server/db/db.ts | 10 +- .../bsky/src/data-plane/server/db/types.ts | 4 +- packages/bsky/src/image/util.ts | 2 +- packages/bsky/src/index.ts | 6 +- packages/bsky/src/util/http.ts | 3 +- packages/bsky/tests/entryway-auth.test.ts | 5 +- packages/bsky/tests/redis-cache.test.ts | 2 +- .../bsky/tests/views/age-assurance-v2.test.ts | 34 ++- packages/bsky/tsconfig.build.json | 3 +- packages/bsky/tsconfig.tests.json | 4 +- packages/bsky/vitest.config.ts | 8 +- packages/bsync/jest.config.cjs | 16 +- packages/bsync/package.json | 11 +- packages/bsync/src/context.ts | 8 +- packages/bsync/src/db/index.ts | 12 +- packages/bsync/src/db/types.ts | 4 +- packages/bsync/src/index.ts | 6 +- packages/common-web/jest.config.cjs | 16 +- packages/common-web/package.json | 11 +- packages/common/jest.config.cjs | 16 +- packages/common/package.json | 15 +- packages/common/src/ipld.ts | 7 +- packages/crypto/jest.config.cjs | 16 +- packages/crypto/package.json | 13 +- packages/crypto/tests/signatures.test.ts | 4 + packages/dev-env/bin.js | 5 +- packages/dev-env/package.json | 13 +- packages/dev-env/src/bin.ts | 2 +- packages/dev-env/src/mock/index.ts | 9 +- packages/dev-env/src/moderator-client.ts | 1 + packages/dev-env/src/seed/client.ts | 2 + packages/did/jest.config.cjs | 16 +- packages/did/package.json | 6 +- packages/identity/jest.config.cjs | 17 +- packages/identity/package.json | 12 +- packages/identity/src/handle/index.ts | 2 +- .../identity/tests/handle-resolver.test.ts | 8 +- packages/internal/did-resolver/package.json | 4 +- packages/internal/fetch-node/package.json | 4 +- packages/internal/fetch/package.json | 4 +- .../handle-resolver-node/package.json | 4 +- .../internal/handle-resolver/package.json | 4 +- .../internal/identity-resolver/package.json | 4 +- packages/internal/pipe/package.json | 4 +- .../package.json | 4 +- .../internal/simple-store-memory/package.json | 4 +- .../internal/simple-store-redis/package.json | 4 +- packages/internal/simple-store/package.json | 4 +- packages/internal/xrpc-utils/package.json | 4 +- packages/lex-cli/bin.js | 5 +- packages/lex-cli/package.json | 9 +- packages/lex-cli/src/codegen/lex-gen.ts | 4 +- packages/lex/lex-builder/package.json | 8 +- packages/lex/lex-cbor/package.json | 14 +- packages/lex/lex-cbor/src/encoding.ts | 2 +- packages/lex/lex-cbor/tsconfig.build.json | 1 - packages/lex/lex-cbor/vite.config.mts | 35 --- packages/lex/lex-client/package.json | 6 +- packages/lex/lex-data/package.json | 10 +- packages/lex/lex-data/src/core-js.d.ts | 2 + .../src/uint8array-from-base64.test.ts | 4 +- .../lex-data/src/uint8array-to-base64.test.ts | 4 +- packages/lex/lex-data/src/uint8array.test.ts | 4 +- packages/lex/lex-data/tsconfig.tests.json | 2 +- packages/lex/lex-document/package.json | 6 +- packages/lex/lex-document/src/core-js.d.ts | 2 + packages/lex/lex-document/src/index.ts | 4 +- packages/lex/lex-document/tsconfig.tests.json | 2 +- packages/lex/lex-installer/package.json | 6 +- packages/lex/lex-json/package.json | 6 +- .../lex/lex-password-session/package.json | 6 +- packages/lex/lex-resolver/package.json | 6 +- packages/lex/lex-schema/package.json | 6 +- .../lex/lex-schema/src/core/string-format.ts | 3 +- .../lex/lex-server/{nodejs.js => nodejs.cjs} | 0 packages/lex/lex-server/package.json | 12 +- packages/lex/lex-server/src/nodejs.ts | 5 +- .../lex/lex-server/tsconfig.examples.json | 1 + packages/lex/lex/bin/lex | 9 +- packages/lex/lex/package.json | 6 +- packages/lexicon-resolver/package.json | 4 +- packages/lexicon-resolver/src/lexicon.ts | 2 +- packages/lexicon/jest.config.cjs | 16 +- packages/lexicon/package.json | 13 +- packages/lexicon/src/validators/formats.ts | 3 +- packages/oauth/jwk-jose/package.json | 4 +- packages/oauth/jwk-webcrypto/package.json | 4 +- packages/oauth/jwk/package.json | 6 +- packages/oauth/jwk/src/util.ts | 1 - .../oauth-client-browser-example/package.json | 9 +- .../{server.js => server.cjs} | 0 .../oauth/oauth-client-browser/package.json | 4 +- .../oauth-client-browser/src/core-js.d.ts | 2 + .../oauth/oauth-client-browser/src/index.ts | 4 +- .../src/indexed-db/db-transaction.ts | 2 +- .../oauth-client-browser/src/indexed-db/db.ts | 2 +- packages/oauth/oauth-client-expo/package.json | 5 +- packages/oauth/oauth-client-node/package.json | 4 +- packages/oauth/oauth-client-node/src/util.ts | 1 - packages/oauth/oauth-client/package.json | 6 +- packages/oauth/oauth-client/src/core-js.d.ts | 1 + packages/oauth/oauth-client/src/index.ts | 2 +- .../oauth/oauth-provider-api/package.json | 4 +- packages/oauth/oauth-provider-ui/package.json | 2 +- .../oauth/oauth-provider-ui/vite.config.mjs | 2 + packages/oauth/oauth-provider/package.json | 4 +- .../oauth-provider/src/lib/http/accept.ts | 5 +- .../oauth-provider/src/lib/http/request.ts | 5 +- .../oauth/oauth-provider/src/lib/util/type.ts | 1 - .../src/router/assets/assets-manifest.ts | 4 +- .../src/router/assets/assets.ts | 2 + packages/oauth/oauth-scopes/jest.config.cjs | 11 +- packages/oauth/oauth-scopes/package.json | 6 +- packages/oauth/oauth-types/package.json | 4 +- packages/ozone/jest.config.cjs | 19 +- packages/ozone/package.json | 20 +- .../ozone/src/api/moderation/emitEvent.ts | 2 +- packages/ozone/src/db/index.ts | 12 +- packages/ozone/src/db/types.ts | 4 +- packages/ozone/src/index.ts | 6 +- packages/ozone/src/report/views.ts | 10 +- packages/ozone/src/sequencer/sequencer.ts | 8 +- .../ozone/src/tag-service/language-tagger.ts | 3 +- packages/ozone/tests/blob-divert.test.ts | 3 +- ...build.templates.js => build.templates.cjs} | 3 +- packages/pds/jest.config.cjs | 22 +- packages/pds/package.json | 27 +- .../pds/src/account-manager/oauth-store.ts | 2 +- .../account-manager/scope-reference-getter.ts | 2 +- .../pds/src/actor-store/blob/transactor.ts | 4 +- packages/pds/src/auth-verifier.ts | 5 +- packages/pds/src/background.ts | 2 +- packages/pds/src/index.ts | 6 +- packages/pds/src/mailer/index.ts | 21 +- packages/pds/src/mailer/moderation.ts | 13 +- .../scripts/sequencer-recovery/user-queues.ts | 7 +- packages/pds/src/sequencer/outbox.ts | 2 +- packages/pds/src/sequencer/sequencer.ts | 4 +- packages/pds/tests/_types.d.ts | 16 ++ packages/pds/tests/account-manager.test.ts | 3 +- packages/pds/tests/email-confirmation.test.ts | 6 +- packages/pds/tests/entryway-mock.ts | 5 +- packages/pds/tests/handles.test.ts | 22 +- packages/pds/tests/oauth.test.ts | 3 +- packages/pds/tests/plc-operations.test.ts | 9 +- packages/pds/tests/recovery.test.ts | 3 +- packages/pds/tests/sequencer.test.ts | 10 +- packages/pds/tsconfig.tests.json | 2 +- packages/repo/jest.config.cjs | 21 +- packages/repo/package.json | 13 +- packages/repo/src/car.ts | 3 +- packages/repo/tests/car.test.ts | 2 +- packages/repo/tests/commit-proofs.test.ts | 2 +- packages/sync/jest.config.cjs | 16 +- packages/sync/package.json | 13 +- packages/sync/src/runner/memory-runner.ts | 6 +- packages/sync/tests/firehose.test.ts | 8 +- packages/sync/tests/runner.test.ts | 2 +- packages/sync/tsconfig.tests.json | 2 +- .../syntax/{benchmark.js => benchmark.cjs} | 0 packages/syntax/package.json | 9 +- packages/tap/package.json | 9 +- packages/tap/src/channel.ts | 2 +- packages/ws-client/jest.config.cjs | 17 +- packages/ws-client/package.json | 11 +- packages/ws-client/src/index.ts | 3 +- packages/xrpc-server/jest.config.cjs | 17 +- packages/xrpc-server/package.json | 16 +- packages/xrpc-server/src/errors.ts | 5 +- packages/xrpc-server/src/stream/server.ts | 3 +- .../xrpc-server/src/stream/subscription.ts | 2 +- packages/xrpc-server/src/util.ts | 5 +- packages/xrpc-server/tests/auth.test.ts | 5 +- packages/xrpc-server/tests/bodies.test.ts | 7 +- packages/xrpc/package.json | 9 +- patches/kysely@0.22.0.patch | 46 +++ pnpm-lock.yaml | 265 ++++++++++-------- services/bsky/Dockerfile | 3 +- services/bsky/{api.js => api.ts} | 26 +- services/bsky/package.json | 1 + services/bsync/Dockerfile | 3 +- services/bsync/{index.js => index.ts} | 16 +- services/bsync/package.json | 1 + services/ozone/Dockerfile | 3 +- services/ozone/{api.js => api.ts} | 24 +- services/ozone/{daemon.js => daemon.ts} | 15 +- services/ozone/package.json | 1 + services/pds/Dockerfile | 3 +- services/pds/{index.js => index.ts} | 14 +- services/pds/package.json | 1 + services/pds/{run-script.js => run-script.ts} | 7 +- services/pds/{tracer.js => tracer.ts} | 25 +- tsconfig/base.json | 9 +- tsconfig/nodenext.json | 4 +- tsconfig/tests.json | 3 +- tsconfig/vitest.json | 3 +- 215 files changed, 1164 insertions(+), 717 deletions(-) create mode 100644 .changeset/esm-migration.md create mode 100644 .changeset/lex-cli-js-extensions.md create mode 100644 jest.varint-shim.cjs delete mode 100644 packages/lex/lex-cbor/vite.config.mts create mode 100644 packages/lex/lex-data/src/core-js.d.ts create mode 100644 packages/lex/lex-document/src/core-js.d.ts rename packages/lex/lex-server/{nodejs.js => nodejs.cjs} (100%) rename packages/oauth/oauth-client-browser-example/{server.js => server.cjs} (100%) create mode 100644 packages/oauth/oauth-client-browser/src/core-js.d.ts create mode 100644 packages/oauth/oauth-client/src/core-js.d.ts rename packages/pds/{build.templates.js => build.templates.cjs} (93%) create mode 100644 packages/pds/tests/_types.d.ts rename packages/syntax/{benchmark.js => benchmark.cjs} (100%) create mode 100644 patches/kysely@0.22.0.patch rename services/bsky/{api.js => api.ts} (83%) rename services/bsync/{index.js => index.ts} (69%) rename services/ozone/{api.js => api.ts} (84%) rename services/ozone/{daemon.js => daemon.ts} (59%) rename services/pds/{index.js => index.ts} (73%) rename services/pds/{run-script.js => run-script.ts} (86%) rename services/pds/{tracer.js => tracer.ts} (53%) diff --git a/.changeset/esm-migration.md b/.changeset/esm-migration.md new file mode 100644 index 00000000000..644d81ea940 --- /dev/null +++ b/.changeset/esm-migration.md @@ -0,0 +1,65 @@ +--- +'@atproto/bsky': patch +'@atproto/bsync': patch +'@atproto/ozone': patch +'@atproto/pds': patch +'@atproto/api': minor +'@atproto/aws': minor +'@atproto/common': minor +'@atproto/common-web': minor +'@atproto/crypto': minor +'@atproto/dev-env': minor +'@atproto/did': minor +'@atproto/identity': minor +'@atproto/jwk': minor +'@atproto/jwk-jose': minor +'@atproto/jwk-webcrypto': minor +'@atproto/lex': minor +'@atproto/lex-builder': minor +'@atproto/lex-cbor': minor +'@atproto/lex-cli': minor +'@atproto/lex-client': minor +'@atproto/lex-data': minor +'@atproto/lex-document': minor +'@atproto/lex-installer': minor +'@atproto/lex-json': minor +'@atproto/lex-password-session': minor +'@atproto/lex-resolver': minor +'@atproto/lex-schema': minor +'@atproto/lex-server': minor +'@atproto/lexicon': minor +'@atproto/lexicon-resolver': minor +'@atproto/oauth-client': minor +'@atproto/oauth-client-browser': minor +'@atproto/oauth-client-browser-example': minor +'@atproto/oauth-client-expo': minor +'@atproto/oauth-client-node': minor +'@atproto/oauth-provider': minor +'@atproto/oauth-provider-api': minor +'@atproto/oauth-provider-ui': minor +'@atproto/oauth-scopes': minor +'@atproto/oauth-types': minor +'@atproto/repo': minor +'@atproto/sync': minor +'@atproto/syntax': minor +'@atproto/tap': minor +'@atproto/ws-client': minor +'@atproto/xrpc': minor +'@atproto/xrpc-server': minor +'@atproto-labs/did-resolver': minor +'@atproto-labs/fetch': minor +'@atproto-labs/fetch-node': minor +'@atproto-labs/handle-resolver': minor +'@atproto-labs/handle-resolver-node': minor +'@atproto-labs/identity-resolver': minor +'@atproto-labs/pipe': minor +'@atproto-labs/rollup-plugin-bundle-manifest': minor +'@atproto-labs/simple-store': minor +'@atproto-labs/simple-store-memory': minor +'@atproto-labs/simple-store-redis': minor +'@atproto-labs/xrpc-utils': minor +--- + +**BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + +Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. diff --git a/.changeset/lex-cli-js-extensions.md b/.changeset/lex-cli-js-extensions.md new file mode 100644 index 00000000000..66141c24404 --- /dev/null +++ b/.changeset/lex-cli-js-extensions.md @@ -0,0 +1,6 @@ +--- +'@atproto/lex-cli': minor +--- + +**BREAKING:** Generated lexicon code now uses `.js` extensions on relative imports (e.g. `from '../lexicons.js'` instead of `from '../lexicons'`), enabling compatibility with Node16/NodeNext module resolution under ESM. Consumers using classic `node` or `bundler` resolution should be unaffected. + diff --git a/jest.varint-shim.cjs b/jest.varint-shim.cjs new file mode 100644 index 00000000000..1f5bc89c758 --- /dev/null +++ b/jest.varint-shim.cjs @@ -0,0 +1,7 @@ +// Shim for varint that works around cjs-module-lexer not detecting +// comma-first style exports (which prevents Jest ESM interop from +// exposing named exports in SyntheticModule). +const _varint = require('./node_modules/.pnpm/varint@6.0.0/node_modules/varint/index.js') +exports.encode = _varint.encode +exports.decode = _varint.decode +exports.encodingLength = _varint.encodingLength diff --git a/package.json b/package.json index 9f1372cfda8..740223a3534 100644 --- a/package.json +++ b/package.json @@ -15,15 +15,6 @@ "onFail": "error" } }, - "pnpm": { - "executionEnv": { - "nodeVersion": ">=22" - }, - "overrides": { - "cookie": "^0.7.2", - "opentelemetry-plugin-better-sqlite3>@opentelemetry/core": "^1.30.0" - } - }, "scripts": { "lint:fix": "pnpm lint --fix", "lint": "NODE_OPTIONS=--max_old_space_size=4096 eslint . --ext .ts,.js,.tsx,.jsx", @@ -51,9 +42,10 @@ "@atproto/dev-env": "workspace:^", "@changesets/changelog-github": "^0.5.1", "@changesets/cli": "^2.29.7", + "@jest/globals": "^30.0.0", "@swc/core": "^1.3.42", "@swc/jest": "^0.2.24", - "@types/jest": "^28.1.4", + "@types/jest": "^30.0.0", "@types/node": "^22.0.0", "@typescript-eslint/eslint-plugin": "^8.59.2", "@typescript-eslint/parser": "^8.59.2", @@ -74,6 +66,18 @@ "typescript": "^6.0.3", "vitest": "^4.0.16" }, + "pnpm": { + "executionEnv": { + "nodeVersion": ">=22" + }, + "overrides": { + "cookie": "^0.7.2", + "opentelemetry-plugin-better-sqlite3>@opentelemetry/core": "^1.30.0" + }, + "patchedDependencies": { + "kysely@0.22.0": "patches/kysely@0.22.0.patch" + } + }, "workspace": [ "packages/*", "packages/lex/*", @@ -87,5 +91,6 @@ "packages/oauth/*", "packages/internal/*" ] - } + }, + "type": "module" } diff --git a/packages/api/jest.config.cjs b/packages/api/jest.config.cjs index fc770491a2c..9c67bcc1f44 100644 --- a/packages/api/jest.config.cjs +++ b/packages/api/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'API', - transform: { '^.+\\.ts$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], testTimeout: 60000, setupFiles: ['/../../test.setup.ts'], setupFilesAfterEnv: ['/jest.setup.ts'], diff --git a/packages/api/package.json b/packages/api/package.json index 75959774983..a5348a35b53 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -17,21 +17,19 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/api" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "codegen": "lex gen-api --yes ./src/client ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/* ../../lexicons/com/germnetwork/*", "prebuild": "node ./scripts/generate-code.mjs && ([ -f ./src/client/index.ts ] || pnpm run codegen)", "build": "tsc --build tsconfig.build.json", - "test": "jest" + "test": "NODE_OPTIONS=--experimental-vm-modules jest" }, "dependencies": { "@atproto/common-web": "workspace:^", "@atproto/lexicon": "workspace:^", "@atproto/syntax": "workspace:^", "@atproto/xrpc": "workspace:^", - "await-lock": "^2.2.2", - "multiformats": "^9.9.0", + "await-lock": "^3.0.0", + "multiformats": "^13.0.0", "tlds": "^1.234.0", "zod": "^3.23.8" }, @@ -41,5 +39,12 @@ "jest": "^30.0.0", "prettier": "^3.2.5", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/api/scripts/code/labels.mjs b/packages/api/scripts/code/labels.mjs index c2dae9086a5..2d9acbcf3b5 100644 --- a/packages/api/scripts/code/labels.mjs +++ b/packages/api/scripts/code/labels.mjs @@ -56,7 +56,7 @@ async function gen() { return prettier.format( `/** this doc is generated by ./scripts/code/labels.mjs **/ - import {InterpretedLabelValueDefinition, LabelPreference} from '../types' + import {InterpretedLabelValueDefinition, LabelPreference} from '../types.js' export type KnownLabelValue = ${Array.from(knownValues) .map((value) => `"${value}"`) diff --git a/packages/api/src/client/types/com/germnetwork/declaration.ts b/packages/api/src/client/types/com/germnetwork/declaration.ts index f4be02c59f2..d68f0fb4890 100644 --- a/packages/api/src/client/types/com/germnetwork/declaration.ts +++ b/packages/api/src/client/types/com/germnetwork/declaration.ts @@ -4,7 +4,11 @@ import { type ValidationResult, BlobRef } from '@atproto/lexicon' import { CID } from 'multiformats/cid' import { validate as _validate } from '../../../lexicons.js' -import { type $Typed, is$typed as _is$typed, type OmitKey } from '../../../util.js' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../util.js' const is$typed = _is$typed, validate = _validate diff --git a/packages/api/src/moderation/const/labels.ts b/packages/api/src/moderation/const/labels.ts index c045f519ebe..7788d17bb6f 100644 --- a/packages/api/src/moderation/const/labels.ts +++ b/packages/api/src/moderation/const/labels.ts @@ -1,5 +1,5 @@ /** this doc is generated by ./scripts/code/labels.mjs **/ -import { InterpretedLabelValueDefinition, LabelPreference } from '../types' +import { InterpretedLabelValueDefinition, LabelPreference } from '../types.js' export type KnownLabelValue = | '!hide' diff --git a/packages/api/src/rich-text/detection.ts b/packages/api/src/rich-text/detection.ts index 2793b6a3afb..690e7775682 100644 --- a/packages/api/src/rich-text/detection.ts +++ b/packages/api/src/rich-text/detection.ts @@ -1,4 +1,4 @@ -import TLDs from 'tlds' +import TLDs from 'tlds' with { type: 'json' } import { AppBskyRichtextFacet } from '../client/index.js' import { UnicodeString } from './unicode.js' import { diff --git a/packages/api/tests/errors.test.ts b/packages/api/tests/errors.test.ts index ff63e4e958b..f4e0a12abf7 100644 --- a/packages/api/tests/errors.test.ts +++ b/packages/api/tests/errors.test.ts @@ -1,5 +1,5 @@ +import { AtpAgent, ComAtprotoServerCreateAccount } from '@atproto/api' import { TestNetworkNoAppView } from '@atproto/dev-env' -import { AtpAgent, ComAtprotoServerCreateAccount } from '..' describe('errors', () => { let network: TestNetworkNoAppView @@ -17,7 +17,7 @@ describe('errors', () => { }) it('constructs the correct error instance', async () => { - const res = client.api.com.atproto.server.createAccount({ + const res = client.com.atproto.server.createAccount({ handle: 'admin.blah', email: 'admin@test.com', password: 'password', diff --git a/packages/api/tests/moderation-mutewords.test.ts b/packages/api/tests/moderation-mutewords.test.ts index 43fbdae0668..ff4995d8dc7 100644 --- a/packages/api/tests/moderation-mutewords.test.ts +++ b/packages/api/tests/moderation-mutewords.test.ts @@ -1,4 +1,4 @@ -import { RichText, mock, moderatePost } from '../src//index.js' +import { RichText, mock, moderatePost } from '../src/index.js' import { matchMuteWords } from '../src/moderation/mutewords.js' describe(`matchMuteWords`, () => { diff --git a/packages/aws/package.json b/packages/aws/package.json index 1e44286aeee..76e27c1445f 100644 --- a/packages/aws/package.json +++ b/packages/aws/package.json @@ -13,8 +13,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/aws" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "build": "tsc --build tsconfig.build.json" }, @@ -32,10 +30,17 @@ "@aws-sdk/lib-storage": "3.879.0", "@noble/curves": "^1.7.0", "key-encoder": "^2.0.3", - "multiformats": "^9.9.0", - "uint8arrays": "3.0.0" + "multiformats": "^13.0.0", + "uint8arrays": "^5.0.0" }, "devDependencies": { "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/aws/src/kms.ts b/packages/aws/src/kms.ts index 7589307dd6d..4b25c60e2d8 100644 --- a/packages/aws/src/kms.ts +++ b/packages/aws/src/kms.ts @@ -1,9 +1,12 @@ import * as aws from '@aws-sdk/client-kms' import { secp256k1 as noble } from '@noble/curves/secp256k1' -import KeyEncoder from 'key-encoder' +import KeyEncoderModule from 'key-encoder' import * as ui8 from 'uint8arrays' import * as crypto from '@atproto/crypto' +// key-encoder is CJS with exports.default; Node ESM interop wraps it as { default: Class } +const KeyEncoder = ((m) => m.default ?? m)(KeyEncoderModule) + const keyEncoder = new KeyEncoder('secp256k1') export type KmsConfig = { keyId: string } & Omit< diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 6cbc2e0400a..3bf7b7c0524 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -13,8 +13,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/bsky" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "codegen": "lex build --clear --indexFile --lexicons ../../lexicons", "prebuild": "pnpm run codegen", @@ -63,14 +61,14 @@ "kysely": "^0.22.0", "leo-profanity": "^1.8.0", "murmurhash": "^2.0.1", - "p-queue": "^6.6.2", + "p-queue": "^8.0.0", "pg": "^8.10.0", "pino": "^8.21.0", "pino-http": "^8.2.1", "sharp": "^0.33.5", "structured-headers": "^1.0.1", "typed-emitter": "^2.1.0", - "uint8arrays": "3.0.0", + "uint8arrays": "^5.0.0", "undici": "^6.19.8", "zod": "3.23.8" }, @@ -88,5 +86,12 @@ "ts-node": "^10.8.2", "typescript": "^6.0.3", "vitest": "^4.0.16" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/bsky/src/api/age-assurance/util.ts b/packages/bsky/src/api/age-assurance/util.ts index 0b617519696..98b0305c6b3 100644 --- a/packages/bsky/src/api/age-assurance/util.ts +++ b/packages/bsky/src/api/age-assurance/util.ts @@ -1,4 +1,6 @@ import { + AgeAssuranceRuleID, + AppBskyAgeassuranceDefs, computeAgeAssuranceRegionAccess, getAgeAssuranceRegionConfig, } from '@atproto/api' @@ -19,7 +21,7 @@ export function computeAgeAssuranceAccessOrThrow( regionCode?: string verifiedMinimumAge: number }, -) { +): { access: AppBskyAgeassuranceDefs.Access; reason: AgeAssuranceRuleID } { const region = getAgeAssuranceRegionConfig(config, { countryCode, regionCode, diff --git a/packages/bsky/src/api/app/bsky/notification/updateSeen.ts b/packages/bsky/src/api/app/bsky/notification/updateSeen.ts index 101c123f478..6ef93e75051 100644 --- a/packages/bsky/src/api/app/bsky/notification/updateSeen.ts +++ b/packages/bsky/src/api/app/bsky/notification/updateSeen.ts @@ -1,5 +1,6 @@ import { Struct, Timestamp } from '@bufbuild/protobuf' -import { v3 as murmurV3 } from 'murmurhash' +// eslint-disable-next-line import/no-named-as-default-member +import murmur from 'murmurhash' import { Server } from '@atproto/xrpc-server' import { AppContext } from '../../../../context.js' import { app } from '../../../../lexicons/index.js' @@ -46,5 +47,6 @@ function getNotifId(viewer: string, seenAt: Date) { const key = ['mark-read-generic', viewer, seenAt.getTime().toString()].join( '::', ) - return murmurV3(key).toString(16) + // eslint-disable-next-line import/no-named-as-default-member + return murmur.v3(key).toString(16) } diff --git a/packages/bsky/src/auth-verifier.ts b/packages/bsky/src/auth-verifier.ts index 61272f27211..0ab906acf8d 100644 --- a/packages/bsky/src/auth-verifier.ts +++ b/packages/bsky/src/auth-verifier.ts @@ -1,7 +1,7 @@ import crypto, { KeyObject } from 'node:crypto' import express from 'express' import * as jose from 'jose' -import KeyEncoder from 'key-encoder' +import KeyEncoderModule from 'key-encoder' import * as ui8 from 'uint8arrays' import { SECP256K1_JWT_ALG, parseDidKey } from '@atproto/crypto' import { DidString, isDidString } from '@atproto/lex' @@ -21,6 +21,9 @@ import { } from './data-plane/index.js' import { GetIdentityByDidResponse } from './proto/bsky_pb.js' +// key-encoder is CJS with exports.default; Node ESM interop wraps it as { default: Class } +const KeyEncoder = ((m) => m.default ?? m)(KeyEncoderModule) + type ReqCtx = { req: express.Request } diff --git a/packages/bsky/src/data-plane/server/background.ts b/packages/bsky/src/data-plane/server/background.ts index c72a3f30fa0..dd51b4008de 100644 --- a/packages/bsky/src/data-plane/server/background.ts +++ b/packages/bsky/src/data-plane/server/background.ts @@ -5,7 +5,7 @@ import { Database } from './db/index.js' // A simple queue for in-process, out-of-band/backgrounded work export class BackgroundQueue { - queue = new PQueue() + queue: InstanceType = new PQueue() destroyed = false constructor(public db: Database) {} diff --git a/packages/bsky/src/data-plane/server/db/db.ts b/packages/bsky/src/data-plane/server/db/db.ts index 22ce1d02e26..7fe71f144f6 100644 --- a/packages/bsky/src/data-plane/server/db/db.ts +++ b/packages/bsky/src/data-plane/server/db/db.ts @@ -11,8 +11,12 @@ import { RootOperationNode, UnknownRow, } from 'kysely' -import { Pool as PgPool, types as pgTypes } from 'pg' -import TypedEmitter from 'typed-emitter' +// eslint-disable-next-line import/default +import pg from 'pg' +// eslint-disable-next-line import/no-named-as-default-member +const { Pool: PgPool, types: pgTypes } = pg +type PgPool = InstanceType +import type TypedEmitter from 'typed-emitter' import { dbLogger } from '../../../logger.js' import { DatabaseSchema, DatabaseSchemaType } from './database-schema.js' import * as migrations from './migrations/index.js' @@ -191,7 +195,7 @@ class LeakyTxPlugin implements KyselyPlugin { } } -type TxnEmitter = TypedEmitter +type TxnEmitter = TypedEmitter.default type TxnEvents = { commit: () => void diff --git a/packages/bsky/src/data-plane/server/db/types.ts b/packages/bsky/src/data-plane/server/db/types.ts index 6dd5f084c80..9b02b815572 100644 --- a/packages/bsky/src/data-plane/server/db/types.ts +++ b/packages/bsky/src/data-plane/server/db/types.ts @@ -1,4 +1,6 @@ -import { Pool as PgPool } from 'pg' +// eslint-disable-next-line import/default +import pg from 'pg' +type PgPool = pg.Pool export type PgOptions = { url: string diff --git a/packages/bsky/src/image/util.ts b/packages/bsky/src/image/util.ts index eb3792e505a..10f2a4f649c 100644 --- a/packages/bsky/src/image/util.ts +++ b/packages/bsky/src/image/util.ts @@ -1,4 +1,4 @@ -import { FormatEnum, OutputInfo } from 'sharp' +import type { FormatEnum, OutputInfo } from 'sharp' export type ImageMime = `image/${string}` diff --git a/packages/bsky/src/index.ts b/packages/bsky/src/index.ts index f719922f7cd..1fcb6d21c85 100644 --- a/packages/bsky/src/index.ts +++ b/packages/bsky/src/index.ts @@ -5,7 +5,11 @@ import compression from 'compression' import cors from 'cors' import { Etcd3 } from 'etcd3' import express from 'express' -import { HttpTerminator, createHttpTerminator } from 'http-terminator' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import httpTerminator from 'http-terminator' +// eslint-disable-next-line import/no-named-as-default-member +const { createHttpTerminator } = httpTerminator +type HttpTerminator = ReturnType import { DAY, SECOND } from '@atproto/common' import { Keypair } from '@atproto/crypto' import { IdResolver } from '@atproto/identity' diff --git a/packages/bsky/src/util/http.ts b/packages/bsky/src/util/http.ts index 3a5d8b53ab5..c2ab611b036 100644 --- a/packages/bsky/src/util/http.ts +++ b/packages/bsky/src/util/http.ts @@ -1,6 +1,7 @@ import { IncomingMessage, ServerResponse } from 'node:http' import createHttpError from 'http-errors' -import { IncomingHttpHeaders } from 'undici/types/header' + +type IncomingHttpHeaders = Record type NextFunction = (err?: unknown) => void diff --git a/packages/bsky/tests/entryway-auth.test.ts b/packages/bsky/tests/entryway-auth.test.ts index 05fd8d8bc45..0c217894622 100644 --- a/packages/bsky/tests/entryway-auth.test.ts +++ b/packages/bsky/tests/entryway-auth.test.ts @@ -1,7 +1,7 @@ import assert from 'node:assert' import * as nodeCrypto from 'node:crypto' import * as jose from 'jose' -import KeyEncoder from 'key-encoder' +import KeyEncoderModule from 'key-encoder' import * as ui8 from 'uint8arrays' import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { AtUri, AtpAgent } from '@atproto/api' @@ -9,6 +9,9 @@ import { MINUTE } from '@atproto/common' import * as crypto from '@atproto/crypto' import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env' +// key-encoder is CJS with exports.default; Node ESM interop wraps it as { default: Class } +const KeyEncoder = ((m) => m.default ?? m)(KeyEncoderModule) + const keyEncoder = new KeyEncoder('secp256k1') const derivePrivKey = async ( diff --git a/packages/bsky/tests/redis-cache.test.ts b/packages/bsky/tests/redis-cache.test.ts index ff32d5ec954..05c10ec9dc5 100644 --- a/packages/bsky/tests/redis-cache.test.ts +++ b/packages/bsky/tests/redis-cache.test.ts @@ -1,7 +1,7 @@ import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { wait } from '@atproto/common' -import { Redis } from '../src//index.js' import { ReadThroughCache } from '../src/cache/read-through.js' +import { Redis } from '../src/index.js' describe('redis cache', () => { let redis: Redis diff --git a/packages/bsky/tests/views/age-assurance-v2.test.ts b/packages/bsky/tests/views/age-assurance-v2.test.ts index 29d2fcb1929..35de2a12ab7 100644 --- a/packages/bsky/tests/views/age-assurance-v2.test.ts +++ b/packages/bsky/tests/views/age-assurance-v2.test.ts @@ -3,6 +3,16 @@ import { once } from 'node:events' import { Server, createServer } from 'node:http' import { AddressInfo } from 'node:net' import express, { Application, json } from 'express' +import { + afterAll, + afterEach, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from 'vitest' import { AppBskyAgeassuranceBegin, AppBskyAgeassuranceDefs, @@ -27,7 +37,7 @@ type Database = TestNetwork['bsky']['db'] const BSKY_REDIRECT_URL = 'http://bsky' -jest.mock('../../dist/api/age-assurance/const.js', () => { +vi.mock('../../dist/api/age-assurance/const.js', () => { const AGE_ASSURANCE_CONFIG: AppBskyAgeassuranceDefs.Config = { regions: [ { @@ -69,8 +79,10 @@ jest.mock('../../dist/api/age-assurance/const.js', () => { } }) -jest.mock('../../dist/api/age-assurance/kws/const.js', () => { - const actual = jest.requireActual('../../dist/api/age-assurance/kws/const.js') +vi.mock('../../dist/api/age-assurance/kws/const.js', async () => { + const actual = await vi.importActual>( + '../../dist/api/age-assurance/kws/const.js', + ) const KWS_V2_COUNTRIES = new Set(['AA']) return { ...actual, @@ -85,9 +97,9 @@ describe('age assurance v2 views', () => { let sc: SeedClient let kws: MockKwsServer - const kwsOauthMock = jest.fn() - const kwsSendAgeVerifiedFlowEmailMock = jest.fn() - const kwsSendAdultVerifiedFlowEmailMock = jest.fn() + const kwsOauthMock = vi.fn() + const kwsSendAgeVerifiedFlowEmailMock = vi.fn() + const kwsSendAdultVerifiedFlowEmailMock = vi.fn() const actor = { did: '', email: '', @@ -155,7 +167,7 @@ describe('age assurance v2 views', () => { }) afterEach(async () => { - jest.resetAllMocks() + vi.resetAllMocks() await clearPrivateData(db) await clearActorAgeAssurance(db) }) @@ -645,6 +657,8 @@ const clearActorAgeAssurance = async (db: Database) => { .execute() } +type MockHandler = (req: express.Request, res: express.Response) => void + class MockKwsServer { verificationSecret = 'verificationSecret' // unused here webhookSecret = 'webhookSecret' // unused here @@ -660,9 +674,9 @@ class MockKwsServer { sendAgeVerifiedFlowEmailMock, sendAdultVerifiedFlowEmailMock, }: { - oauthMock: jest.Mock - sendAgeVerifiedFlowEmailMock: jest.Mock - sendAdultVerifiedFlowEmailMock: jest.Mock + oauthMock: ReturnType> + sendAgeVerifiedFlowEmailMock: ReturnType> + sendAdultVerifiedFlowEmailMock: ReturnType> }) { this.app = express() .use(json()) diff --git a/packages/bsky/tsconfig.build.json b/packages/bsky/tsconfig.build.json index 944827a6f62..ed60d6901ed 100644 --- a/packages/bsky/tsconfig.build.json +++ b/packages/bsky/tsconfig.build.json @@ -5,5 +5,6 @@ "outDir": "./dist", "noUnusedLocals": false }, - "include": ["./src"] + "include": ["./src"], + "exclude": ["./src/**/*.test.ts"] } diff --git a/packages/bsky/tsconfig.tests.json b/packages/bsky/tsconfig.tests.json index 7fac0ed90d5..e99caa23589 100644 --- a/packages/bsky/tsconfig.tests.json +++ b/packages/bsky/tsconfig.tests.json @@ -1,8 +1,8 @@ { - "extends": "../../tsconfig/tests.json", + "extends": "../../tsconfig/vitest.json", "compilerOptions": { "rootDir": ".", "noUnusedLocals": false }, - "include": ["./tests"] + "include": ["./tests", "./src/**/*.test.ts"] } diff --git a/packages/bsky/vitest.config.ts b/packages/bsky/vitest.config.ts index 4ba72165717..f84a332f762 100644 --- a/packages/bsky/vitest.config.ts +++ b/packages/bsky/vitest.config.ts @@ -4,12 +4,6 @@ export default defineProject({ test: { testTimeout: 60000, setupFiles: ['../../test.setup.ts'], - exclude: [ - 'dist/**', - 'node_modules/**', - // Requires vi.mock() to intercept CJS require() in dist/, which only - // works once @atproto/bsky has "type": "module" (deferred to ESM branch) - 'tests/views/age-assurance-v2.test.ts', - ], + exclude: ['dist/**', 'node_modules/**'], }, }) diff --git a/packages/bsync/jest.config.cjs b/packages/bsync/jest.config.cjs index 1d582919652..854552f91df 100644 --- a/packages/bsync/jest.config.cjs +++ b/packages/bsync/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Bsync', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/bsync/package.json b/packages/bsync/package.json index 63ba870dd2f..f2e6de4f263 100644 --- a/packages/bsync/package.json +++ b/packages/bsync/package.json @@ -13,12 +13,10 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/bsync" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "build": "tsc --build tsconfig.build.json", "start": "node --enable-source-maps dist/bin.js", - "test": "../dev-infra/with-test-db.sh jest", + "test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-db.sh jest", "test:log": "tail -50 test.log | pino-pretty", "test:updateSnapshot": "jest --updateSnapshot", "migration:create": "ts-node ./bin/migration-create.ts", @@ -48,5 +46,12 @@ "jest": "^30.0.0", "ts-node": "^10.8.2", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/bsync/src/context.ts b/packages/bsync/src/context.ts index a1b5f894f5f..a06b4abc467 100644 --- a/packages/bsync/src/context.ts +++ b/packages/bsync/src/context.ts @@ -1,5 +1,5 @@ -import { EventEmitter } from 'node:stream' -import TypedEventEmitter from 'typed-emitter' +import { EventEmitter } from 'node:events' +import type TypedEmitter from 'typed-emitter' import { ServerConfig } from './config.js' import { Database } from './db/index.js' import { createMuteOpChannel } from './db/schema/mute_op.js' @@ -16,13 +16,13 @@ export class AppContext { db: Database cfg: ServerConfig shutdown: AbortSignal - events: TypedEventEmitter + events: TypedEmitter.default constructor(opts: AppContextOptions) { this.db = opts.db this.cfg = opts.cfg this.shutdown = opts.shutdown - this.events = new EventEmitter() as TypedEventEmitter + this.events = new EventEmitter() as TypedEmitter.default } static async fromConfig( diff --git a/packages/bsync/src/db/index.ts b/packages/bsync/src/db/index.ts index a8dfab91983..c3b4a0bae6d 100644 --- a/packages/bsync/src/db/index.ts +++ b/packages/bsync/src/db/index.ts @@ -1,5 +1,5 @@ import assert from 'node:assert' -import { EventEmitter } from 'node:stream' +import { EventEmitter } from 'node:events' import { Kysely, KyselyPlugin, @@ -11,8 +11,12 @@ import { RootOperationNode, UnknownRow, } from 'kysely' -import { Pool as PgPool, types as pgTypes } from 'pg' -import TypedEmitter from 'typed-emitter' +// eslint-disable-next-line import/default +import pg from 'pg' +// eslint-disable-next-line import/no-named-as-default-member +const { Pool: PgPool, types: pgTypes } = pg +type PgPool = InstanceType +import type TypedEmitter from 'typed-emitter' import { dbLogger } from '../logger.js' import * as migrations from './migrations/index.js' import { DbMigrationProvider } from './migrations/provider.js' @@ -187,7 +191,7 @@ class LeakyTxPlugin implements KyselyPlugin { } } -type TxnEmitter = TypedEmitter +type TxnEmitter = TypedEmitter.default type TxnEvents = { commit: () => void diff --git a/packages/bsync/src/db/types.ts b/packages/bsync/src/db/types.ts index 015dca7c20c..fe5cbfd0273 100644 --- a/packages/bsync/src/db/types.ts +++ b/packages/bsync/src/db/types.ts @@ -1,5 +1,7 @@ import { DynamicModule, RawBuilder, SelectQueryBuilder } from 'kysely' -import { Pool as PgPool } from 'pg' +// eslint-disable-next-line import/default +import pg from 'pg' +type PgPool = pg.Pool export type DbRef = RawBuilder | ReturnType diff --git a/packages/bsync/src/index.ts b/packages/bsync/src/index.ts index 3855f20b6cc..8fb85847973 100644 --- a/packages/bsync/src/index.ts +++ b/packages/bsync/src/index.ts @@ -1,7 +1,11 @@ import events from 'node:events' import http from 'node:http' import { connectNodeAdapter } from '@connectrpc/connect-node' -import { HttpTerminator, createHttpTerminator } from 'http-terminator' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import httpTerminator from 'http-terminator' +// eslint-disable-next-line import/no-named-as-default-member +const { createHttpTerminator } = httpTerminator +type HttpTerminator = ReturnType import { ServerConfig } from './config.js' import { AppContext, AppContextOptions } from './context.js' import { createMuteOpChannel } from './db/schema/mute_op.js' diff --git a/packages/common-web/jest.config.cjs b/packages/common-web/jest.config.cjs index fd4b2e46bb6..1496a57b16e 100644 --- a/packages/common-web/jest.config.cjs +++ b/packages/common-web/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Common Web', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/common-web/package.json b/packages/common-web/package.json index c5b303352b6..a29bc4cacc2 100644 --- a/packages/common-web/package.json +++ b/packages/common-web/package.json @@ -15,10 +15,8 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/common-web" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "build": "tsc --build tsconfig.build.json" }, "dependencies": { @@ -30,5 +28,12 @@ "devDependencies": { "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/common/jest.config.cjs b/packages/common/jest.config.cjs index 582cfce3b24..40e0a42a894 100644 --- a/packages/common/jest.config.cjs +++ b/packages/common/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Common', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/common/package.json b/packages/common/package.json index c4bab3a719f..997004c5c2c 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -12,10 +12,8 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/common" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "build": "tsc --build tsconfig.build.json" }, "engines": { @@ -25,12 +23,19 @@ "@atproto/common-web": "workspace:^", "@atproto/lex-cbor": "workspace:^", "@atproto/lex-data": "workspace:^", - "multiformats": "^9.9.0", + "multiformats": "^13.0.0", "pino": "^8.21.0" }, "devDependencies": { "jest": "^30.0.0", "typescript": "^6.0.3", - "uint8arrays": "3.0.0" + "uint8arrays": "^5.0.0" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/common/src/ipld.ts b/packages/common/src/ipld.ts index 862a2d8a4a8..9e8ce625d25 100644 --- a/packages/common/src/ipld.ts +++ b/packages/common/src/ipld.ts @@ -1,6 +1,7 @@ import { createHash } from 'node:crypto' import { Transform } from 'node:stream' -import { Block, ByteView, encode as encodeBlock } from 'multiformats/block' +import { encode as encodeBlock } from 'multiformats/block' +import type { BlockView, ByteView } from 'multiformats/block/interface' import { sha256 as hasher } from 'multiformats/hashes/sha2' import { cidForLex, decode, encode } from '@atproto/lex-cbor' import { @@ -33,7 +34,9 @@ export { cborDecodeLegacy as cborDecode } /** * @deprecated Use {@link encode} and {@link cidForCbor} from `@atproto/lex-cbor` instead. */ -export async function dataToCborBlock(value: T): Promise> { +export async function dataToCborBlock( + value: T, +): Promise> { return encodeBlock({ value, codec: { diff --git a/packages/crypto/jest.config.cjs b/packages/crypto/jest.config.cjs index 9c5fc409527..23f810c791e 100644 --- a/packages/crypto/jest.config.cjs +++ b/packages/crypto/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Crypto', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/crypto/package.json b/packages/crypto/package.json index 747c0c33106..3d92d0a98e8 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -13,10 +13,8 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/crypto" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "build": "tsc --build tsconfig.build.json" }, "engines": { @@ -25,11 +23,18 @@ "dependencies": { "@noble/curves": "^1.7.0", "@noble/hashes": "^1.6.1", - "uint8arrays": "3.0.0" + "uint8arrays": "^5.0.0" }, "devDependencies": { "@atproto/common": "workspace:^", "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/crypto/tests/signatures.test.ts b/packages/crypto/tests/signatures.test.ts index f384118e2fc..68a077f3962 100644 --- a/packages/crypto/tests/signatures.test.ts +++ b/packages/crypto/tests/signatures.test.ts @@ -1,4 +1,6 @@ import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' import { p256 as nobleP256 } from '@noble/curves/p256' import { secp256k1 as nobleK256 } from '@noble/curves/secp256k1' import * as uint8arrays from 'uint8arrays' @@ -16,6 +18,8 @@ import * as p256 from '../src/p256/operations.js' import { Secp256k1Keypair } from '../src/secp256k1/keypair.js' import * as secp from '../src/secp256k1/operations.js' +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + describe('signatures', () => { let vectors: TestVector[] diff --git a/packages/dev-env/bin.js b/packages/dev-env/bin.js index 255e3c0105d..b891c340715 100755 --- a/packages/dev-env/bin.js +++ b/packages/dev-env/bin.js @@ -1,12 +1,9 @@ #!/usr/bin/env node /* eslint-env node */ -/* eslint-disable @typescript-eslint/no-var-requires */ - -'use strict' // @NOTE This file exists so that pnpm can properly link the "bin" scripts when // the monorepo is being setup (during initial "pnpm install"), but was never // built. -require('./dist/bin.js') +import './dist/bin.js' diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 9f3f8229be5..280236916c6 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -12,8 +12,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/dev-env" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "bin": "bin.js", "scripts": { "build": "tsc --build tsconfig.build.json", @@ -42,12 +40,19 @@ "dotenv": "^16.0.3", "express": "^4.18.2", "get-port": "^5.1.1", - "multiformats": "^9.9.0", - "uint8arrays": "3.0.0", + "multiformats": "^13.0.0", + "uint8arrays": "^5.0.0", "undici": "^6.14.1" }, "devDependencies": { "@types/express": "^4.17.13", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/dev-env/src/bin.ts b/packages/dev-env/src/bin.ts index a9121136f31..3ac77eceef4 100755 --- a/packages/dev-env/src/bin.ts +++ b/packages/dev-env/src/bin.ts @@ -1,4 +1,4 @@ -import './env' +import './env.js' import { generateMockSetup } from './mock/index.js' import { TestNetwork } from './network.js' import { mockMailer } from './util.js' diff --git a/packages/dev-env/src/mock/index.ts b/packages/dev-env/src/mock/index.ts index 4bde0c30deb..eb507237064 100644 --- a/packages/dev-env/src/mock/index.ts +++ b/packages/dev-env/src/mock/index.ts @@ -1,5 +1,8 @@ -import { AtpAgent, COM_ATPROTO_MODERATION } from '@atproto/api' -import { ConflictingQueueError } from '@atproto/api/dist/client/types/tools/ozone/queue/createQueue' +import { + AtpAgent, + COM_ATPROTO_MODERATION, + ToolsOzoneQueueCreateQueue, +} from '@atproto/api' import { Database } from '@atproto/bsky' import { AtUri, AtUriString } from '@atproto/syntax' import { EXAMPLE_LABELER, RecordRef, TestNetwork } from '../index.js' @@ -127,7 +130,7 @@ export async function generateMockSetup(env: TestNetwork) { headers: await adminHeaders('tools.ozone.queue.createQueue'), }) } catch (err) { - if (!(err instanceof ConflictingQueueError)) { + if (!(err instanceof ToolsOzoneQueueCreateQueue.ConflictingQueueError)) { throw err } } diff --git a/packages/dev-env/src/moderator-client.ts b/packages/dev-env/src/moderator-client.ts index efd655f8424..f3c1c6c4091 100644 --- a/packages/dev-env/src/moderator-client.ts +++ b/packages/dev-env/src/moderator-client.ts @@ -2,6 +2,7 @@ import { AtpAgent, ToolsOzoneModerationDefs, ToolsOzoneModerationEmitEvent as EmitModerationEvent, + ToolsOzoneModerationGetReporterStats as _GetReporterStats, // includes types for getReporterStats() ToolsOzoneModerationQueryEvents as QueryModerationEvents, ToolsOzoneModerationQueryStatuses as QueryModerationStatuses, ToolsOzoneReportQueryReports as QueryModerationReports, diff --git a/packages/dev-env/src/seed/client.ts b/packages/dev-env/src/seed/client.ts index 3b6db8aadda..03b065c3506 100644 --- a/packages/dev-env/src/seed/client.ts +++ b/packages/dev-env/src/seed/client.ts @@ -1,5 +1,6 @@ import fs from 'node:fs/promises' import path from 'node:path' +import { fileURLToPath } from 'node:url' import { CID } from 'multiformats/cid' import { AppBskyActorProfile, @@ -26,6 +27,7 @@ let AVATAR_IMG: Uint8Array | undefined // AVATAR_PATH is defined in a non-CWD-dependant way, so this works // for any consumer of this package, even outside the atproto repo. +const __dirname = path.dirname(fileURLToPath(import.meta.url)) const AVATAR_PATH = path.resolve( __dirname, '../../assets/key-portrait-small.jpg', diff --git a/packages/did/jest.config.cjs b/packages/did/jest.config.cjs index ceb48917f9a..a030260f245 100644 --- a/packages/did/jest.config.cjs +++ b/packages/did/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'DID', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], testTimeout: 60000, setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, diff --git a/packages/did/package.json b/packages/did/package.json index 9db3793d8b2..a1e35692078 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/did" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", @@ -37,6 +35,6 @@ }, "scripts": { "build": "tsc --build tsconfig.build.json", - "test": "jest" + "test": "NODE_OPTIONS=--experimental-vm-modules jest" } } diff --git a/packages/identity/jest.config.cjs b/packages/identity/jest.config.cjs index b94e535118d..428059d3e97 100644 --- a/packages/identity/jest.config.cjs +++ b/packages/identity/jest.config.cjs @@ -1,8 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Identity', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, - transformIgnorePatterns: ['/node_modules/.pnpm/(?!(get-port)@)'], + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/identity/package.json b/packages/identity/package.json index b592810bc07..6eb2cc9916c 100644 --- a/packages/identity/package.json +++ b/packages/identity/package.json @@ -14,10 +14,8 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/identity" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "test:log": "cat test.log | pino-pretty", "build": "tsc --build tsconfig.build.json" }, @@ -31,10 +29,18 @@ "devDependencies": { "@did-plc/lib": "^0.0.1", "@did-plc/server": "^0.0.1", + "@jest/globals": "^30.0.0", "cors": "^2.8.5", "express": "^4.18.2", "get-port": "^6.1.2", "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/identity/src/handle/index.ts b/packages/identity/src/handle/index.ts index 2b1e68f3a04..7c685fe97ca 100644 --- a/packages/identity/src/handle/index.ts +++ b/packages/identity/src/handle/index.ts @@ -1,4 +1,4 @@ -import dns from 'node:dns/promises' +import * as dns from 'node:dns/promises' import { HandleResolverOpts } from '../types.js' const SUBDOMAIN = '_atproto' diff --git a/packages/identity/tests/handle-resolver.test.ts b/packages/identity/tests/handle-resolver.test.ts index dc9947d8d18..9cb7dd66ea7 100644 --- a/packages/identity/tests/handle-resolver.test.ts +++ b/packages/identity/tests/handle-resolver.test.ts @@ -1,6 +1,6 @@ -import { HandleResolver } from '../src/index.js' +import { jest } from '@jest/globals' -jest.mock('node:dns/promises', () => { +jest.unstable_mockModule('node:dns/promises', () => { return { resolveTxt: (handle: string) => { if (handle === '_atproto.simple.test') { @@ -36,8 +36,10 @@ jest.mock('node:dns/promises', () => { } }) +const { HandleResolver } = await import('../src/index.js') + describe('handle resolver', () => { - let resolver: HandleResolver + let resolver: InstanceType beforeAll(async () => { resolver = new HandleResolver() diff --git a/packages/internal/did-resolver/package.json b/packages/internal/did-resolver/package.json index bd43536c667..709cecbadb1 100644 --- a/packages/internal/did-resolver/package.json +++ b/packages/internal/did-resolver/package.json @@ -17,9 +17,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/did-resolver" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/fetch-node/package.json b/packages/internal/fetch-node/package.json index 9ccb219062d..4c31c96881d 100644 --- a/packages/internal/fetch-node/package.json +++ b/packages/internal/fetch-node/package.json @@ -14,9 +14,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/fetch-node" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/fetch/package.json b/packages/internal/fetch/package.json index 81b190f008e..7c16730518a 100644 --- a/packages/internal/fetch/package.json +++ b/packages/internal/fetch/package.json @@ -16,9 +16,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/fetch" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/handle-resolver-node/package.json b/packages/internal/handle-resolver-node/package.json index 86eba5f807b..0d4f29da8c9 100644 --- a/packages/internal/handle-resolver-node/package.json +++ b/packages/internal/handle-resolver-node/package.json @@ -16,9 +16,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/handle-resolver-node" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/handle-resolver/package.json b/packages/internal/handle-resolver/package.json index 41d3e5a7a5a..1b61ea8722e 100644 --- a/packages/internal/handle-resolver/package.json +++ b/packages/internal/handle-resolver/package.json @@ -21,9 +21,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/handle-resolver" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/identity-resolver/package.json b/packages/internal/identity-resolver/package.json index deb7d45f71f..70f806a69cd 100644 --- a/packages/internal/identity-resolver/package.json +++ b/packages/internal/identity-resolver/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/identity-resolver" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/pipe/package.json b/packages/internal/pipe/package.json index b97575f7ce2..2c1b6a6492a 100644 --- a/packages/internal/pipe/package.json +++ b/packages/internal/pipe/package.json @@ -16,9 +16,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/pipe" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/rollup-plugin-bundle-manifest/package.json b/packages/internal/rollup-plugin-bundle-manifest/package.json index 07e56b6b1da..f6cea39bc68 100644 --- a/packages/internal/rollup-plugin-bundle-manifest/package.json +++ b/packages/internal/rollup-plugin-bundle-manifest/package.json @@ -14,9 +14,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/rollup-plugin-bundle-manifest" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/simple-store-memory/package.json b/packages/internal/simple-store-memory/package.json index 641f74b4ef5..519e93d9ba4 100644 --- a/packages/internal/simple-store-memory/package.json +++ b/packages/internal/simple-store-memory/package.json @@ -17,9 +17,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/simple-store-memory" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/simple-store-redis/package.json b/packages/internal/simple-store-redis/package.json index 7f4a6cf8ad8..7bebde39c29 100644 --- a/packages/internal/simple-store-redis/package.json +++ b/packages/internal/simple-store-redis/package.json @@ -17,9 +17,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/simple-store-redis" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/simple-store/package.json b/packages/internal/simple-store/package.json index 424cb918a81..38c5a307798 100644 --- a/packages/internal/simple-store/package.json +++ b/packages/internal/simple-store/package.json @@ -16,9 +16,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/simple-store" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index 9bbc073303e..a975fb73b00 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -21,9 +21,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/internal/xrpc-utils" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/lex-cli/bin.js b/packages/lex-cli/bin.js index ad13d4c4a1d..df48e477006 100755 --- a/packages/lex-cli/bin.js +++ b/packages/lex-cli/bin.js @@ -1,12 +1,9 @@ #!/usr/bin/env node /* eslint-env node */ -/* eslint-disable @typescript-eslint/no-var-requires */ - -'use strict' // @NOTE This file exists so that pnpm can properly link the "bin" scripts when // the monorepo is being setup (during initial "pnpm install"), but was never // built. -require('./dist/index.js') +import './dist/index.js' diff --git a/packages/lex-cli/package.json b/packages/lex-cli/package.json index ec428c6d6a4..752ee5d7755 100644 --- a/packages/lex-cli/package.json +++ b/packages/lex-cli/package.json @@ -16,8 +16,6 @@ "bin": { "lex": "bin.js" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "build": "tsc --build tsconfig.build.json" }, @@ -36,5 +34,12 @@ }, "devDependencies": { "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/lex-cli/src/codegen/lex-gen.ts b/packages/lex-cli/src/codegen/lex-gen.ts index 14e78fbb767..a3526cf5b26 100644 --- a/packages/lex-cli/src/codegen/lex-gen.ts +++ b/packages/lex-cli/src/codegen/lex-gen.ts @@ -50,7 +50,7 @@ export function genCommonImports(file: SourceFile, baseNsid: string) { moduleSpecifier: `${baseNsid .split('.') .map((_str) => '..') - .join('/')}/lexicons`, + .join('/')}/lexicons.js`, }) .addNamedImports([{ name: 'validate', alias: '_validate' }]) @@ -60,7 +60,7 @@ export function genCommonImports(file: SourceFile, baseNsid: string) { moduleSpecifier: `${baseNsid .split('.') .map((_str) => '..') - .join('/')}/util`, + .join('/')}/util.js`, }) .addNamedImports([ { name: '$Typed', isTypeOnly: true }, diff --git a/packages/lex/lex-builder/package.json b/packages/lex/lex-builder/package.json index 007467578ed..d284f9ca01a 100644 --- a/packages/lex/lex-builder/package.json +++ b/packages/lex/lex-builder/package.json @@ -27,15 +27,11 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "require": "./dist/index.js", - "import": "./dist/index.js" + "default": "./dist/index.js" } }, "dependencies": { diff --git a/packages/lex/lex-cbor/package.json b/packages/lex/lex-cbor/package.json index c8cca57e853..e458a06a2f2 100644 --- a/packages/lex/lex-cbor/package.json +++ b/packages/lex/lex-cbor/package.json @@ -29,31 +29,23 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.cjs", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.mjs", - "import": "./dist/index.mjs", - "default": "./dist/index.cjs" + "default": "./dist/index.js" } }, "dependencies": { "@atproto/lex-data": "workspace:^", + "cborg": "^4.5.8", "tslib": "^2.8.1" }, "devDependencies": { "@atproto/lex-json": "workspace:^", - "cborg": "^4.5.8", - "vite": "^6.2.0", "vitest": "^4.0.16" }, "scripts": { - "dev": "vite build --watch", - "prebuild": "vite build --emptyOutDir", "build": "tsc --build tsconfig.build.json", "test": "vitest run" } diff --git a/packages/lex/lex-cbor/src/encoding.ts b/packages/lex/lex-cbor/src/encoding.ts index d9fc1afbe36..c9835618277 100644 --- a/packages/lex/lex-cbor/src/encoding.ts +++ b/packages/lex/lex-cbor/src/encoding.ts @@ -8,7 +8,7 @@ import { decodeFirst as cborgDecodeFirst, encode as cborgEncode, } from 'cborg' -import { OptionalTypeEncoder } from 'cborg/lib/encode' +import { OptionalTypeEncoder } from 'cborg/interface' import { Cid, LexValue, decodeCid, ifCid } from '@atproto/lex-data' // @NOTE "cborg" version 4 is required to support multi-decoding via the diff --git a/packages/lex/lex-cbor/tsconfig.build.json b/packages/lex/lex-cbor/tsconfig.build.json index d389b57a940..8364ce16dc3 100644 --- a/packages/lex/lex-cbor/tsconfig.build.json +++ b/packages/lex/lex-cbor/tsconfig.build.json @@ -5,7 +5,6 @@ "compilerOptions": { "noImplicitAny": true, "importHelpers": true, - "emitDeclarationOnly": true, "rootDir": "./src", "outDir": "./dist" } diff --git a/packages/lex/lex-cbor/vite.config.mts b/packages/lex/lex-cbor/vite.config.mts deleted file mode 100644 index 4dd788952e4..00000000000 --- a/packages/lex/lex-cbor/vite.config.mts +++ /dev/null @@ -1,35 +0,0 @@ -import path from 'node:path' -import { defineConfig } from 'vite' -import pkg from './package.json' with { type: 'json' } - -// We rely on a bundler to handle bundling of the "cborg" package. This is -// required because "cborg" is an ESM-only package that uses "exports" fields -// in its package.json, which causes issues when trying to import it directly -// in a CJS context without bundling. - -// Whenever this package is converted to ESM only, we can likely remove this -// bundling step. - -export default defineConfig({ - build: { - minify: false, - lib: { - entry: path.resolve(__dirname, 'src/index.ts'), - formats: ['es', 'cjs'], - fileName: (format) => { - switch (format) { - case 'es': - return 'index.mjs' - case 'cjs': - return 'index.cjs' - default: - return `index.${format}.js` - } - }, - }, - rollupOptions: { - // Only devpendencies should be bundled - external: Object.keys(pkg.dependencies), - }, - }, -}) diff --git a/packages/lex/lex-client/package.json b/packages/lex/lex-client/package.json index b5be3bff5fd..f35ab90d076 100644 --- a/packages/lex/lex-client/package.json +++ b/packages/lex/lex-client/package.json @@ -27,14 +27,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-data/package.json b/packages/lex/lex-data/package.json index ee9e4489199..535ac5484cf 100644 --- a/packages/lex/lex-data/package.json +++ b/packages/lex/lex-data/package.json @@ -26,21 +26,17 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, "dependencies": { - "multiformats": "^9.9.0", + "multiformats": "^13.0.0", "tslib": "^2.8.1", - "uint8arrays": "3.0.0", + "uint8arrays": "^5.0.0", "unicode-segmenter": "^0.14.0" }, "devDependencies": { diff --git a/packages/lex/lex-data/src/core-js.d.ts b/packages/lex/lex-data/src/core-js.d.ts new file mode 100644 index 00000000000..f2e90cbd672 --- /dev/null +++ b/packages/lex/lex-data/src/core-js.d.ts @@ -0,0 +1,2 @@ +declare module 'core-js/es/typed-array/from-base64.js' +declare module 'core-js/es/typed-array/to-base64.js' diff --git a/packages/lex/lex-data/src/uint8array-from-base64.test.ts b/packages/lex/lex-data/src/uint8array-from-base64.test.ts index e1542a2569b..ad4ae1abe00 100644 --- a/packages/lex/lex-data/src/uint8array-from-base64.test.ts +++ b/packages/lex/lex-data/src/uint8array-from-base64.test.ts @@ -1,5 +1,5 @@ -import 'core-js/modules/es.uint8-array.from-base64.js' -import 'core-js/modules/es.uint8-array.to-base64.js' +import 'core-js/es/typed-array/from-base64.js' +import 'core-js/es/typed-array/to-base64.js' import { assert, describe, expect, it } from 'vitest' import { diff --git a/packages/lex/lex-data/src/uint8array-to-base64.test.ts b/packages/lex/lex-data/src/uint8array-to-base64.test.ts index df456219d2e..2a429272a8b 100644 --- a/packages/lex/lex-data/src/uint8array-to-base64.test.ts +++ b/packages/lex/lex-data/src/uint8array-to-base64.test.ts @@ -1,5 +1,5 @@ -import 'core-js/modules/es.uint8-array.from-base64.js' -import 'core-js/modules/es.uint8-array.to-base64.js' +import 'core-js/es/typed-array/from-base64.js' +import 'core-js/es/typed-array/to-base64.js' import { assert, describe, expect, it } from 'vitest' import { toBase64Native, diff --git a/packages/lex/lex-data/src/uint8array.test.ts b/packages/lex/lex-data/src/uint8array.test.ts index 9089054d3c2..78208a1db74 100644 --- a/packages/lex/lex-data/src/uint8array.test.ts +++ b/packages/lex/lex-data/src/uint8array.test.ts @@ -1,5 +1,5 @@ -import 'core-js/modules/es.uint8-array.from-base64.js' -import 'core-js/modules/es.uint8-array.to-base64.js' +import 'core-js/es/typed-array/from-base64.js' +import 'core-js/es/typed-array/to-base64.js' import { describe, expect, it } from 'vitest' import { diff --git a/packages/lex/lex-data/tsconfig.tests.json b/packages/lex/lex-data/tsconfig.tests.json index ab11e6d3f56..f90ef799189 100644 --- a/packages/lex/lex-data/tsconfig.tests.json +++ b/packages/lex/lex-data/tsconfig.tests.json @@ -1,6 +1,6 @@ { "extends": "../../../tsconfig/vitest.json", - "include": ["./tests", "./src/**/*.test.ts"], + "include": ["./tests", "./src/**/*.test.ts", "./src/core-js.d.ts"], "compilerOptions": { "noImplicitAny": true, "rootDir": "./", diff --git a/packages/lex/lex-document/package.json b/packages/lex/lex-document/package.json index e3e76006ab1..c95a3827177 100644 --- a/packages/lex/lex-document/package.json +++ b/packages/lex/lex-document/package.json @@ -27,14 +27,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-document/src/core-js.d.ts b/packages/lex/lex-document/src/core-js.d.ts new file mode 100644 index 00000000000..ff1f9f83656 --- /dev/null +++ b/packages/lex/lex-document/src/core-js.d.ts @@ -0,0 +1,2 @@ +declare module 'core-js/es/symbol/async-dispose.js' +declare module 'core-js/es/symbol/dispose.js' diff --git a/packages/lex/lex-document/src/index.ts b/packages/lex/lex-document/src/index.ts index 9a00cf25204..62187012a5b 100644 --- a/packages/lex/lex-document/src/index.ts +++ b/packages/lex/lex-document/src/index.ts @@ -1,5 +1,5 @@ -import 'core-js/modules/esnext.symbol.async-dispose' -import 'core-js/modules/esnext.symbol.dispose' +import 'core-js/es/symbol/async-dispose.js' +import 'core-js/es/symbol/dispose.js' export * from './lexicon-document.js' export * from './lexicon-indexer.js' diff --git a/packages/lex/lex-document/tsconfig.tests.json b/packages/lex/lex-document/tsconfig.tests.json index ab11e6d3f56..f90ef799189 100644 --- a/packages/lex/lex-document/tsconfig.tests.json +++ b/packages/lex/lex-document/tsconfig.tests.json @@ -1,6 +1,6 @@ { "extends": "../../../tsconfig/vitest.json", - "include": ["./tests", "./src/**/*.test.ts"], + "include": ["./tests", "./src/**/*.test.ts", "./src/core-js.d.ts"], "compilerOptions": { "noImplicitAny": true, "rootDir": "./", diff --git a/packages/lex/lex-installer/package.json b/packages/lex/lex-installer/package.json index 372bb97b102..cce25a4d242 100644 --- a/packages/lex/lex-installer/package.json +++ b/packages/lex/lex-installer/package.json @@ -27,14 +27,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-json/package.json b/packages/lex/lex-json/package.json index e6290371f08..3f9b4d85745 100644 --- a/packages/lex/lex-json/package.json +++ b/packages/lex/lex-json/package.json @@ -29,14 +29,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-password-session/package.json b/packages/lex/lex-password-session/package.json index d0a9a25f308..1f0d557849a 100644 --- a/packages/lex/lex-password-session/package.json +++ b/packages/lex/lex-password-session/package.json @@ -26,14 +26,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-resolver/package.json b/packages/lex/lex-resolver/package.json index f0090ca8df2..9f1678c259c 100644 --- a/packages/lex/lex-resolver/package.json +++ b/packages/lex/lex-resolver/package.json @@ -27,14 +27,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-schema/package.json b/packages/lex/lex-schema/package.json index 6506012a1ce..869ae472fc2 100644 --- a/packages/lex/lex-schema/package.json +++ b/packages/lex/lex-schema/package.json @@ -26,14 +26,10 @@ "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lex/lex-schema/src/core/string-format.ts b/packages/lex/lex-schema/src/core/string-format.ts index 87b27259dfa..0c1ad6eba63 100644 --- a/packages/lex/lex-schema/src/core/string-format.ts +++ b/packages/lex/lex-schema/src/core/string-format.ts @@ -1,4 +1,5 @@ -import { isValidISODateString } from 'iso-datestring-validator' +import isoDatestringValidator from 'iso-datestring-validator' +const { isValidISODateString } = isoDatestringValidator import { validateCidString } from '@atproto/lex-data' import { AtIdentifierString, diff --git a/packages/lex/lex-server/nodejs.js b/packages/lex/lex-server/nodejs.cjs similarity index 100% rename from packages/lex/lex-server/nodejs.js rename to packages/lex/lex-server/nodejs.cjs diff --git a/packages/lex/lex-server/package.json b/packages/lex/lex-server/package.json index 137bdf26684..fab9b202b91 100644 --- a/packages/lex/lex-server/package.json +++ b/packages/lex/lex-server/package.json @@ -24,24 +24,20 @@ "./tsconfig.tests.json", "./tsconfig.json", "./dist", - "./nodejs.js", + "./nodejs.cjs", "./CHANGELOG.md" ], "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" }, "./nodejs": { "types": "./dist/nodejs.d.ts", - "import": "./dist/nodejs.js", - "require": "./dist/nodejs.js" + "require": "./dist/nodejs.js", + "default": "./dist/nodejs.js" } }, "dependencies": { diff --git a/packages/lex/lex-server/src/nodejs.ts b/packages/lex/lex-server/src/nodejs.ts index 834b5efd985..1e30d13079c 100644 --- a/packages/lex/lex-server/src/nodejs.ts +++ b/packages/lex/lex-server/src/nodejs.ts @@ -12,7 +12,10 @@ import { ListenOptions } from 'node:net' import { Readable } from 'node:stream' import { pipeline } from 'node:stream/promises' import type { ReadableStream as NodeReadableStream } from 'node:stream/web' -import { createHttpTerminator } from 'http-terminator' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import httpTerminator from 'http-terminator' +// eslint-disable-next-line import/no-named-as-default-member +const { createHttpTerminator } = httpTerminator import { WebSocket as WebSocketPonyfill, WebSocketServer } from 'ws' import type { FetchHandler } from './lex-router.js' diff --git a/packages/lex/lex-server/tsconfig.examples.json b/packages/lex/lex-server/tsconfig.examples.json index 9962ee49a1e..8541cb9c3dc 100644 --- a/packages/lex/lex-server/tsconfig.examples.json +++ b/packages/lex/lex-server/tsconfig.examples.json @@ -17,6 +17,7 @@ "rewriteRelativeImportExtensions": true, "erasableSyntaxOnly": true, "verbatimModuleSyntax": true, + "ignoreDeprecations": "6.0", "rootDir": ".", "baseUrl": "." } diff --git a/packages/lex/lex/bin/lex b/packages/lex/lex/bin/lex index 8cb534268c4..dcadb7cf031 100755 --- a/packages/lex/lex/bin/lex +++ b/packages/lex/lex/bin/lex @@ -1,17 +1,16 @@ #!/usr/bin/env node /* eslint-env node */ -/* eslint-disable @typescript-eslint/no-var-requires */ // This file is referenced by the "bin" field in package.json. Because of that, // we need this file to exist on disk even before the project is built, so it is // written in plain JS. This allows package managers to properly link the CLI // command when the monorepo is being setup (during initial "pnpm install"). -const yargs = require('yargs') -const { hideBin } = require('yargs/helpers') -const { build } = require('@atproto/lex-builder') -const { install } = require('@atproto/lex-installer') +import yargs from 'yargs' +import { hideBin } from 'yargs/helpers' +import { build } from '@atproto/lex-builder' +import { install } from '@atproto/lex-installer' yargs(hideBin(process.argv)) .strict() diff --git a/packages/lex/lex/package.json b/packages/lex/lex/package.json index dcd9d72a848..d0a4b6575fd 100644 --- a/packages/lex/lex/package.json +++ b/packages/lex/lex/package.json @@ -27,14 +27,10 @@ "lex": "./bin/lex" }, "sideEffects": false, - "type": "commonjs", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", - "browser": "./dist/index.js", - "import": "./dist/index.js", "default": "./dist/index.js" } }, diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 7ff5c87d5eb..75db1089bc0 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -4,7 +4,7 @@ "engines": { "node": ">=22" }, - "type": "commonjs", + "type": "module", "license": "MIT", "description": "ATProto Lexicon resolution", "keywords": [ @@ -23,8 +23,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/lexicon-resolver" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/lexicon-resolver/src/lexicon.ts b/packages/lexicon-resolver/src/lexicon.ts index 9dedfeaa090..3ae8a91ff24 100644 --- a/packages/lexicon-resolver/src/lexicon.ts +++ b/packages/lexicon-resolver/src/lexicon.ts @@ -1,4 +1,4 @@ -import dns from 'node:dns/promises' +import * as dns from 'node:dns/promises' import { Cid, l } from '@atproto/lex' import { LexiconDocument, lexiconDocumentSchema } from '@atproto/lex-document' import { Commit } from '@atproto/repo' diff --git a/packages/lexicon/jest.config.cjs b/packages/lexicon/jest.config.cjs index 8d6bc8333bb..3107c31a5ba 100644 --- a/packages/lexicon/jest.config.cjs +++ b/packages/lexicon/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Lexicon', - transform: { '^.+\\.ts$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index 9a8f9067c87..7e8f3718c9a 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -16,21 +16,26 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/lexicon" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "build": "tsc --build tsconfig.build.json" }, "dependencies": { "@atproto/common-web": "workspace:^", "@atproto/syntax": "workspace:^", "iso-datestring-validator": "^2.2.2", - "multiformats": "^9.9.0", + "multiformats": "^13.0.0", "zod": "^3.23.8" }, "devDependencies": { "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/lexicon/src/validators/formats.ts b/packages/lexicon/src/validators/formats.ts index 91021a81146..62398e5a1bf 100644 --- a/packages/lexicon/src/validators/formats.ts +++ b/packages/lexicon/src/validators/formats.ts @@ -1,4 +1,5 @@ -import { isValidISODateString } from 'iso-datestring-validator' +import isoDatestringValidator from 'iso-datestring-validator' +const { isValidISODateString } = isoDatestringValidator import { CID } from 'multiformats/cid' import { validateLanguage } from '@atproto/common-web' import { diff --git a/packages/oauth/jwk-jose/package.json b/packages/oauth/jwk-jose/package.json index ee96103e8cd..bbbadaa4fc6 100644 --- a/packages/oauth/jwk-jose/package.json +++ b/packages/oauth/jwk-jose/package.json @@ -17,9 +17,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/jwk-jose" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/oauth/jwk-webcrypto/package.json b/packages/oauth/jwk-webcrypto/package.json index abd0c6df689..3e88de7bc10 100644 --- a/packages/oauth/jwk-webcrypto/package.json +++ b/packages/oauth/jwk-webcrypto/package.json @@ -17,9 +17,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/jwk-webcrypto" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/oauth/jwk/package.json b/packages/oauth/jwk/package.json index 0e0d3cea4d2..4f54bedf3a4 100644 --- a/packages/oauth/jwk/package.json +++ b/packages/oauth/jwk/package.json @@ -19,9 +19,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/jwk" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", @@ -29,7 +27,7 @@ } }, "dependencies": { - "multiformats": "^9.9.0", + "multiformats": "^13.0.0", "zod": "^3.23.8" }, "devDependencies": { diff --git a/packages/oauth/jwk/src/util.ts b/packages/oauth/jwk/src/util.ts index d5744ee31e0..630e2cb41ef 100644 --- a/packages/oauth/jwk/src/util.ts +++ b/packages/oauth/jwk/src/util.ts @@ -1,7 +1,6 @@ import { base64url } from 'multiformats/bases/base64' import { RefinementCtx, ZodIssueCode } from 'zod' -// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type Override = Simplify> diff --git a/packages/oauth/oauth-client-browser-example/package.json b/packages/oauth/oauth-client-browser-example/package.json index 2343f38a7c2..7bf1d5707c4 100644 --- a/packages/oauth/oauth-client-browser-example/package.json +++ b/packages/oauth/oauth-client-browser-example/package.json @@ -20,17 +20,16 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-client-browser" }, - "bin": "./server.js", - "type": "commonjs", - "main": "./dist/files.json", + "bin": "./server.cjs", + "type": "module", "exports": { ".": "./dist/files.json", "./server": { - "import": "./server.js" + "default": "./server.cjs" } }, "files": [ - "server.js", + "server.cjs", "dist" ], "devDependencies": { diff --git a/packages/oauth/oauth-client-browser-example/server.js b/packages/oauth/oauth-client-browser-example/server.cjs similarity index 100% rename from packages/oauth/oauth-client-browser-example/server.js rename to packages/oauth/oauth-client-browser-example/server.cjs diff --git a/packages/oauth/oauth-client-browser/package.json b/packages/oauth/oauth-client-browser/package.json index 5176557c7e8..66c14e2cae2 100644 --- a/packages/oauth/oauth-client-browser/package.json +++ b/packages/oauth/oauth-client-browser/package.json @@ -21,9 +21,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-client-browser" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/oauth/oauth-client-browser/src/core-js.d.ts b/packages/oauth/oauth-client-browser/src/core-js.d.ts new file mode 100644 index 00000000000..ff1f9f83656 --- /dev/null +++ b/packages/oauth/oauth-client-browser/src/core-js.d.ts @@ -0,0 +1,2 @@ +declare module 'core-js/es/symbol/async-dispose.js' +declare module 'core-js/es/symbol/dispose.js' diff --git a/packages/oauth/oauth-client-browser/src/index.ts b/packages/oauth/oauth-client-browser/src/index.ts index b53df5be522..93662065385 100644 --- a/packages/oauth/oauth-client-browser/src/index.ts +++ b/packages/oauth/oauth-client-browser/src/index.ts @@ -1,5 +1,5 @@ -import 'core-js/modules/esnext.symbol.async-dispose' -import 'core-js/modules/esnext.symbol.dispose' +import 'core-js/es/symbol/async-dispose.js' +import 'core-js/es/symbol/dispose.js' export * from '@atproto/jwk-webcrypto' export * from '@atproto/oauth-client' diff --git a/packages/oauth/oauth-client-browser/src/indexed-db/db-transaction.ts b/packages/oauth/oauth-client-browser/src/indexed-db/db-transaction.ts index 78c5edfa738..9d9b0cf28f6 100644 --- a/packages/oauth/oauth-client-browser/src/indexed-db/db-transaction.ts +++ b/packages/oauth/oauth-client-browser/src/indexed-db/db-transaction.ts @@ -1,4 +1,4 @@ -import 'core-js/modules/esnext.symbol.dispose' +import 'core-js/es/symbol/dispose.js' import { DBObjectStore } from './db-object-store.js' import { DatabaseSchema } from './schema.js' diff --git a/packages/oauth/oauth-client-browser/src/indexed-db/db.ts b/packages/oauth/oauth-client-browser/src/indexed-db/db.ts index 8457c772066..29b4d44620b 100644 --- a/packages/oauth/oauth-client-browser/src/indexed-db/db.ts +++ b/packages/oauth/oauth-client-browser/src/indexed-db/db.ts @@ -1,4 +1,4 @@ -import 'core-js/modules/esnext.symbol.dispose' +import 'core-js/es/symbol/dispose.js' import { DBTransaction } from './db-transaction.js' import { DatabaseSchema } from './schema.js' diff --git a/packages/oauth/oauth-client-expo/package.json b/packages/oauth/oauth-client-expo/package.json index bd44a0050b9..01335a3df5d 100755 --- a/packages/oauth/oauth-client-expo/package.json +++ b/packages/oauth/oauth-client-expo/package.json @@ -26,8 +26,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-client-expo" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "exports": { ".": { "types": "./dist/index.d.ts", @@ -49,5 +47,6 @@ }, "scripts": { "build": "tsc --build tsconfig.build.json" - } + }, + "type": "module" } diff --git a/packages/oauth/oauth-client-node/package.json b/packages/oauth/oauth-client-node/package.json index 3e7a0d1c98e..c465fe59b75 100644 --- a/packages/oauth/oauth-client-node/package.json +++ b/packages/oauth/oauth-client-node/package.json @@ -15,9 +15,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-client-node" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/oauth/oauth-client-node/src/util.ts b/packages/oauth/oauth-client-node/src/util.ts index 318b0182b33..fbb586603d4 100644 --- a/packages/oauth/oauth-client-node/src/util.ts +++ b/packages/oauth/oauth-client-node/src/util.ts @@ -1,3 +1,2 @@ -// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type Override = Simplify> diff --git a/packages/oauth/oauth-client/package.json b/packages/oauth/oauth-client/package.json index a6d00b010c2..9dc086e9eaf 100644 --- a/packages/oauth/oauth-client/package.json +++ b/packages/oauth/oauth-client/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-client" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", @@ -39,7 +37,7 @@ "@atproto/oauth-types": "workspace:^", "@atproto/xrpc": "workspace:^", "core-js": "^3", - "multiformats": "^9.9.0", + "multiformats": "^13.0.0", "zod": "^3.23.8" }, "devDependencies": { diff --git a/packages/oauth/oauth-client/src/core-js.d.ts b/packages/oauth/oauth-client/src/core-js.d.ts new file mode 100644 index 00000000000..f8fc824d409 --- /dev/null +++ b/packages/oauth/oauth-client/src/core-js.d.ts @@ -0,0 +1 @@ +declare module 'core-js/es/symbol/dispose.js' diff --git a/packages/oauth/oauth-client/src/index.ts b/packages/oauth/oauth-client/src/index.ts index 455e743f774..ede6bc9aebd 100644 --- a/packages/oauth/oauth-client/src/index.ts +++ b/packages/oauth/oauth-client/src/index.ts @@ -1,4 +1,4 @@ -import 'core-js/modules/es.symbol.dispose' +import 'core-js/es/symbol/dispose.js' export * from '@atproto-labs/did-resolver' export { diff --git a/packages/oauth/oauth-provider-api/package.json b/packages/oauth/oauth-provider-api/package.json index 011e4a14fe3..29dc4402e75 100644 --- a/packages/oauth/oauth-provider-api/package.json +++ b/packages/oauth/oauth-provider-api/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-provider-api" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/oauth/oauth-provider-ui/package.json b/packages/oauth/oauth-provider-ui/package.json index 7e32066257c..07481e8f5eb 100644 --- a/packages/oauth/oauth-provider-ui/package.json +++ b/packages/oauth/oauth-provider-ui/package.json @@ -12,7 +12,7 @@ "engines": { "node": ">=22" }, - "type": "commonjs", + "type": "module", "exports": { "./bundle-manifest.json": { "default": "./dist/bundle-manifest.json" diff --git a/packages/oauth/oauth-provider-ui/vite.config.mjs b/packages/oauth/oauth-provider-ui/vite.config.mjs index d19dc261fe1..60ce038dad2 100644 --- a/packages/oauth/oauth-provider-ui/vite.config.mjs +++ b/packages/oauth/oauth-provider-ui/vite.config.mjs @@ -13,6 +13,7 @@ export default defineConfig({ alias: { '#': resolve(__dirname, './src'), }, + conditions: ['browser', 'import', 'module', 'default'], }, plugins: [ react({ @@ -70,6 +71,7 @@ export default defineConfig({ '@atproto/oauth-scopes', '@atproto/oauth-types', '@atproto/syntax', + 'multiformats', ], }, }) diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 12da5422632..86ac9734058 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-provider" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/oauth/oauth-provider/src/lib/http/accept.ts b/packages/oauth/oauth-provider/src/lib/http/accept.ts index 4c5713bb493..fc5e1524dce 100644 --- a/packages/oauth/oauth-provider/src/lib/http/accept.ts +++ b/packages/oauth/oauth-provider/src/lib/http/accept.ts @@ -1,5 +1,8 @@ import type { IncomingMessage, ServerResponse } from 'node:http' -import { mediaType } from '@hapi/accept' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import accept from '@hapi/accept' +// eslint-disable-next-line import/no-named-as-default-member +const { mediaType } = accept import { SubCtx, subCtx } from './context.js' import { Middleware, NextFunction } from './types.js' diff --git a/packages/oauth/oauth-provider/src/lib/http/request.ts b/packages/oauth/oauth-provider/src/lib/http/request.ts index ac376309221..ca92194900c 100644 --- a/packages/oauth/oauth-provider/src/lib/http/request.ts +++ b/packages/oauth/oauth-provider/src/lib/http/request.ts @@ -1,5 +1,8 @@ import type { IncomingMessage, ServerResponse } from 'node:http' -import { languages, mediaType } from '@hapi/accept' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import accept from '@hapi/accept' +// eslint-disable-next-line import/no-named-as-default-member +const { languages, mediaType } = accept import { CookieSerializeOptions, parse as parseCookie, diff --git a/packages/oauth/oauth-provider/src/lib/util/type.ts b/packages/oauth/oauth-provider/src/lib/util/type.ts index c8a699a3224..14c2075c828 100644 --- a/packages/oauth/oauth-provider/src/lib/util/type.ts +++ b/packages/oauth/oauth-provider/src/lib/util/type.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line @typescript-eslint/no-empty-object-type export type Simplify = { [K in keyof T]: T[K] } & {} export type Override = Simplify<{ [K in keyof (V & T)]: K extends keyof V diff --git a/packages/oauth/oauth-provider/src/router/assets/assets-manifest.ts b/packages/oauth/oauth-provider/src/router/assets/assets-manifest.ts index 443bd2e929e..c09cb9dbb88 100644 --- a/packages/oauth/oauth-provider/src/router/assets/assets-manifest.ts +++ b/packages/oauth/oauth-provider/src/router/assets/assets-manifest.ts @@ -1,4 +1,5 @@ import { createReadStream } from 'node:fs' +import { createRequire } from 'node:module' import { join } from 'node:path' import { Readable } from 'node:stream' import type { Manifest } from '@atproto-labs/rollup-plugin-bundle-manifest' @@ -34,8 +35,9 @@ const ASSETS_URL_PREFIX = '/@atproto/oauth-provider/~assets/' export function parseAssetsManifest(manifestPath: string) { // Using `require` instead of `JSON.parse(readFileSync())` so that node's // watch mode can pick up changes to the manifest file. + const require = createRequire(import.meta.url) - // eslint-disable-next-line + // eslint-disable-next-line import/no-dynamic-require const manifest = require(manifestPath) as Manifest const assets = new Map( diff --git a/packages/oauth/oauth-provider/src/router/assets/assets.ts b/packages/oauth/oauth-provider/src/router/assets/assets.ts index 20c1f587a3e..995fbcb65a8 100644 --- a/packages/oauth/oauth-provider/src/router/assets/assets.ts +++ b/packages/oauth/oauth-provider/src/router/assets/assets.ts @@ -1,4 +1,5 @@ import type { IncomingMessage, ServerResponse } from 'node:http' +import { createRequire } from 'node:module' import type { HydrationData as UiHydrationData } from '@atproto/oauth-provider-ui/hydration-data' import { buildCustomizationCss } from '../../customization/build-customization-css.js' import { buildCustomizationData } from '../../customization/build-customization-data.js' @@ -24,6 +25,7 @@ import { setupCsrfToken } from './csrf.js' // require.resolve('@atproto/oauth-provider-ui/bundle-manifest.json'), // ) +const require = createRequire(import.meta.url) const ui = parseAssetsManifest( require.resolve('@atproto/oauth-provider-ui/bundle-manifest.json'), ) diff --git a/packages/oauth/oauth-scopes/jest.config.cjs b/packages/oauth/oauth-scopes/jest.config.cjs index 6e20d421ad8..5e0b80eb7a3 100644 --- a/packages/oauth/oauth-scopes/jest.config.cjs +++ b/packages/oauth/oauth-scopes/jest.config.cjs @@ -1,5 +1,14 @@ /** @type {import('jest').Config} */ module.exports = { - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + displayName: 'OAuth Scopes', + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { jsc: { transform: {} }, module: { type: 'es6' } }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], + setupFiles: ['/../../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/oauth/oauth-scopes/package.json b/packages/oauth/oauth-scopes/package.json index cfa886a982c..5d6f12a934f 100644 --- a/packages/oauth/oauth-scopes/package.json +++ b/packages/oauth/oauth-scopes/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/auth-scopes" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", @@ -37,6 +35,6 @@ }, "scripts": { "build": "tsc --build tsconfig.build.json", - "test": "jest" + "test": "NODE_OPTIONS=--experimental-vm-modules jest" } } diff --git a/packages/oauth/oauth-types/package.json b/packages/oauth/oauth-types/package.json index a88954652b0..4d62533bba1 100644 --- a/packages/oauth/oauth-types/package.json +++ b/packages/oauth/oauth-types/package.json @@ -18,9 +18,7 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/oauth/oauth-types" }, - "type": "commonjs", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", diff --git a/packages/ozone/jest.config.cjs b/packages/ozone/jest.config.cjs index c6333e791b1..06a6ba22382 100644 --- a/packages/ozone/jest.config.cjs +++ b/packages/ozone/jest.config.cjs @@ -1,10 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Ozone', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, - transformIgnorePatterns: [ - `/node_modules/.pnpm/(?!(get-port|lande|toygrad)@)`, - ], + transform: { + '^.+\\.ts$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], testTimeout: 60000, setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, diff --git a/packages/ozone/package.json b/packages/ozone/package.json index ea8a1f6be3a..a1ed476c5d4 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -13,15 +13,13 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/ozone" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "codegen": "lex gen-server --yes ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*", "build": "tsc --build tsconfig.build.json", "start": "node --enable-source-maps dist/bin.js", - "test": "../dev-infra/with-test-redis-and-db.sh jest", + "test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-redis-and-db.sh jest", "test:log": "tail -50 test.log | pino-pretty", - "test:updateSnapshot": "../dev-infra/with-test-redis-and-db.sh jest --updateSnapshot", + "test:updateSnapshot": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-redis-and-db.sh jest --updateSnapshot", "migration:create": "ts-node ./bin/migration-create.ts" }, "engines": { @@ -44,13 +42,13 @@ "http-terminator": "^3.2.0", "kysely": "^0.22.0", "lande": "^1.0.10", - "multiformats": "^9.9.0", - "p-queue": "^6.6.2", + "multiformats": "^13.0.0", + "p-queue": "^8.0.0", "pg": "^8.10.0", "pino-http": "^8.2.1", "structured-headers": "^1.0.1", "typed-emitter": "^2.1.0", - "uint8arrays": "3.0.0", + "uint8arrays": "^5.0.0", "undici": "^6.14.1", "ws": "^8.12.0" }, @@ -58,6 +56,7 @@ "@atproto/lex-cli": "workspace:^", "@atproto/pds": "workspace:^", "@did-plc/server": "^0.0.1", + "@jest/globals": "^30.0.0", "@types/cors": "^2.8.12", "@types/express": "^4.17.13", "@types/express-serve-static-core": "^4.17.36", @@ -66,5 +65,12 @@ "jest": "^30.0.0", "ts-node": "^10.8.2", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/ozone/src/api/moderation/emitEvent.ts b/packages/ozone/src/api/moderation/emitEvent.ts index 10fccc12a5c..8faff754b07 100644 --- a/packages/ozone/src/api/moderation/emitEvent.ts +++ b/packages/ozone/src/api/moderation/emitEvent.ts @@ -1,4 +1,3 @@ -import { isModEventDivert } from '@atproto/api/dist/client/types/tools/ozone/moderation/defs' import { AuthRequiredError, ForbiddenError, @@ -14,6 +13,7 @@ import { isAgeAssuranceOverrideEvent, isAgeAssurancePurgeEvent, isModEventAcknowledge, + isModEventDivert, isModEventEmail, isModEventLabel, isModEventMuteReporter, diff --git a/packages/ozone/src/db/index.ts b/packages/ozone/src/db/index.ts index ba7eab4fa5e..99779916724 100644 --- a/packages/ozone/src/db/index.ts +++ b/packages/ozone/src/db/index.ts @@ -1,5 +1,5 @@ import assert from 'node:assert' -import { EventEmitter } from 'node:stream' +import { EventEmitter } from 'node:events' import { Kysely, KyselyPlugin, @@ -11,8 +11,12 @@ import { RootOperationNode, UnknownRow, } from 'kysely' -import { Pool as PgPool, types as pgTypes } from 'pg' -import TypedEmitter from 'typed-emitter' +// eslint-disable-next-line import/default +import pg from 'pg' +// eslint-disable-next-line import/no-named-as-default-member +const { Pool: PgPool, types: pgTypes } = pg +type PgPool = InstanceType +import type TypedEmitter from 'typed-emitter' import { dbLogger } from '../logger.js' import * as migrations from './migrations/index.js' import { CtxMigrationProvider } from './migrations/provider.js' @@ -190,7 +194,7 @@ class LeakyTxPlugin implements KyselyPlugin { } } -type TxnEmitter = TypedEmitter +type TxnEmitter = TypedEmitter.default type TxnEvents = { commit: () => void diff --git a/packages/ozone/src/db/types.ts b/packages/ozone/src/db/types.ts index cc75dc638e9..5457a6e611a 100644 --- a/packages/ozone/src/db/types.ts +++ b/packages/ozone/src/db/types.ts @@ -1,5 +1,7 @@ import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely' -import { Pool as PgPool } from 'pg' +// eslint-disable-next-line import/default +import pg from 'pg' +type PgPool = pg.Pool export type DbRef = RawBuilder | ReturnType diff --git a/packages/ozone/src/index.ts b/packages/ozone/src/index.ts index 9a750e69d9c..d112664cdce 100644 --- a/packages/ozone/src/index.ts +++ b/packages/ozone/src/index.ts @@ -4,7 +4,11 @@ import { AddressInfo } from 'node:net' import compression from 'compression' import cors from 'cors' import express from 'express' -import { HttpTerminator, createHttpTerminator } from 'http-terminator' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import httpTerminator from 'http-terminator' +// eslint-disable-next-line import/no-named-as-default-member +const { createHttpTerminator } = httpTerminator +type HttpTerminator = ReturnType import { DAY, SECOND } from '@atproto/common' import API, { health, wellKnown } from './api/index.js' import { OzoneConfig, OzoneSecrets } from './config/index.js' diff --git a/packages/ozone/src/report/views.ts b/packages/ozone/src/report/views.ts index f30f85d1138..1baef1d4960 100644 --- a/packages/ozone/src/report/views.ts +++ b/packages/ozone/src/report/views.ts @@ -1,17 +1,15 @@ import { Selectable } from 'kysely' -import { - AppBskyActorDefs, - ToolsOzoneModerationDefs, - ToolsOzoneQueueDefs, - ToolsOzoneReportDefs, -} from '@atproto/api' import { addAccountInfoToRepoViewDetail } from '../api/util.js' import { ReportStat } from '../db/schema/report_stat.js' +import * as AppBskyActorDefs from '../lexicon/types/app/bsky/actor/defs.js' import { AccountView } from '../lexicon/types/com/atproto/admin/defs.js' import { RecordViewDetail, RepoView, } from '../lexicon/types/tools/ozone/moderation/defs.js' +import * as ToolsOzoneModerationDefs from '../lexicon/types/tools/ozone/moderation/defs.js' +import * as ToolsOzoneQueueDefs from '../lexicon/types/tools/ozone/queue/defs.js' +import * as ToolsOzoneReportDefs from '../lexicon/types/tools/ozone/report/defs.js' import { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs.js' import { ReportWithEvent } from '../mod-service/report.js' import { ParsedLabelers } from '../util.js' diff --git a/packages/ozone/src/sequencer/sequencer.ts b/packages/ozone/src/sequencer/sequencer.ts index e03d61bb4c6..2dee3f9d8f7 100644 --- a/packages/ozone/src/sequencer/sequencer.ts +++ b/packages/ozone/src/sequencer/sequencer.ts @@ -1,7 +1,9 @@ import EventEmitter from 'node:events' import { Selectable } from 'kysely' -import { PoolClient } from 'pg' -import TypedEmitter from 'typed-emitter' +// eslint-disable-next-line import/default +import pg from 'pg' +type PoolClient = pg.PoolClient +import type TypedEmitter from 'typed-emitter' import { Database } from '../db/index.js' import { Label as LabelTable, LabelChannel } from '../db/schema/label.js' import { Labels as LabelsEvt } from '../lexicon/types/com/atproto/label/subscribeLabels.js' @@ -142,4 +144,4 @@ type SequencerEvents = { close: () => void } -export type SequencerEmitter = TypedEmitter +export type SequencerEmitter = TypedEmitter.default diff --git a/packages/ozone/src/tag-service/language-tagger.ts b/packages/ozone/src/tag-service/language-tagger.ts index 68f9f6509c5..2538467698c 100644 --- a/packages/ozone/src/tag-service/language-tagger.ts +++ b/packages/ozone/src/tag-service/language-tagger.ts @@ -1,3 +1,4 @@ +import lande from 'lande' import { AppBskyActorProfile, AppBskyFeedGenerator, @@ -87,8 +88,6 @@ export class LanguageTagger extends ContentTagger { .map((lang) => lang.split('-')[0]) .forEach((lang) => langs.add(lang)) } else if (recordText) { - // 'lande' is an esm module, so we need to import it dynamically - const { default: lande } = await import('lande') const detectedLanguages = lande(recordText) if (detectedLanguages.length) { const langCode = code3ToCode2(detectedLanguages[0][0]) diff --git a/packages/ozone/tests/blob-divert.test.ts b/packages/ozone/tests/blob-divert.test.ts index 29114b0072c..9f7bac03d66 100644 --- a/packages/ozone/tests/blob-divert.test.ts +++ b/packages/ozone/tests/blob-divert.test.ts @@ -1,4 +1,5 @@ import assert from 'node:assert' +import { jest } from '@jest/globals' import { ToolsOzoneModerationDefs } from '@atproto/api' import { ModeratorClient, @@ -7,7 +8,7 @@ import { basicSeed, } from '@atproto/dev-env' import { ResponseType, XRPCError } from '@atproto/xrpc' -import { forSnapshot, identity } from './_util' +import { forSnapshot, identity } from './_util.js' describe('blob divert', () => { let network: TestNetwork diff --git a/packages/pds/build.templates.js b/packages/pds/build.templates.cjs similarity index 93% rename from packages/pds/build.templates.js rename to packages/pds/build.templates.cjs index fd42af400a4..11f4ba707fe 100644 --- a/packages/pds/build.templates.js +++ b/packages/pds/build.templates.cjs @@ -10,7 +10,8 @@ require('esbuild').build({ sourcemap: true, outdir: 'dist/mailer/templates', platform: 'node', - format: 'cjs', + format: 'esm', + bundle: true, plugins: [ hbsPlugin({ filter: /\.(hbs)$/, diff --git a/packages/pds/jest.config.cjs b/packages/pds/jest.config.cjs index 15d25d1d2dc..b2ffe8f25f7 100644 --- a/packages/pds/jest.config.cjs +++ b/packages/pds/jest.config.cjs @@ -1,11 +1,27 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'PDS', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.ts$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], transformIgnorePatterns: [ - `/node_modules/.pnpm/(?!(get-port|lande|toygrad)@)`, + 'node_modules/.pnpm/(?!(multiformats|uint8arrays))', ], testTimeout: 60000, setupFiles: ['/../../test.setup.ts'], - moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, + moduleNameMapper: { + '^\\.\\/templates/(.+\\.js)$': '/dist/mailer/templates/$1', + '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'], + }, } diff --git a/packages/pds/package.json b/packages/pds/package.json index 02e866063fb..0a807a745c2 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -13,8 +13,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/pds" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "engines": { "node": ">=22" }, @@ -22,14 +20,14 @@ "codegen": "lex build --clear --indexFile --lexicons ../../lexicons", "prebuild": "pnpm run codegen", "build": "tsc --build tsconfig.build.json", - "postbuild": "node ./build.templates.js", - "dev": "node ./build.templates.js --watch", + "postbuild": "node ./build.templates.cjs", + "dev": "node ./build.templates.cjs --watch", "pretest": "puppeteer browsers install chrome", - "test": "../dev-infra/with-test-redis-and-db.sh jest", - "test:sqlite": "jest", - "test:sqlite-only": "jest --testPathIgnorePatterns /tests/proxied/*", + "test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-redis-and-db.sh jest", + "test:sqlite": "NODE_OPTIONS=--experimental-vm-modules jest", + "test:sqlite-only": "NODE_OPTIONS=--experimental-vm-modules jest --testPathIgnorePatterns /tests/proxied/*", "test:log": "tail -50 test.log | pino-pretty", - "test:updateSnapshot": "../dev-infra/with-test-redis-and-db.sh jest --updateSnapshot", + "test:updateSnapshot": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-redis-and-db.sh jest --updateSnapshot", "migration:create": "ts-node ./bin/migration-create.ts" }, "dependencies": { @@ -70,11 +68,11 @@ "kysely": "^0.22.0", "nodemailer": "^6.8.0", "nodemailer-html-to-text": "^3.2.0", - "p-queue": "^6.6.2", + "p-queue": "^8.0.0", "pino": "^8.21.0", "pino-http": "^8.2.1", "typed-emitter": "^2.1.0", - "uint8arrays": "3.0.0", + "uint8arrays": "^5.0.0", "undici": "^6.19.8", "zod": "^3.23.8" }, @@ -84,6 +82,7 @@ "@atproto/lex-document": "workspace:^", "@atproto/oauth-client-browser-example": "workspace:^", "@did-plc/server": "^0.0.1", + "@jest/globals": "^30.0.0", "@types/cors": "^2.8.12", "@types/express": "^4.17.13", "@types/express-serve-static-core": "^4.17.36", @@ -97,5 +96,13 @@ "ts-node": "^10.8.2", "typescript": "^6.0.3", "ws": "^8.12.0" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./package.json": "./package.json" } } diff --git a/packages/pds/src/account-manager/oauth-store.ts b/packages/pds/src/account-manager/oauth-store.ts index b7afb4b35e5..1c4e412f90c 100644 --- a/packages/pds/src/account-manager/oauth-store.ts +++ b/packages/pds/src/account-manager/oauth-store.ts @@ -321,7 +321,7 @@ export class OAuthStore ): Promise { const rows = await accountDeviceHelper.selectQB(this.db, filter).execute() - const uniqueDids = [...new Set(rows.map((row) => row.did))] + const uniqueDids: string[] = [...new Set(rows.map((row) => row.did))] // Enrich all distinct account with their profile data const accounts = new Map( diff --git a/packages/pds/src/account-manager/scope-reference-getter.ts b/packages/pds/src/account-manager/scope-reference-getter.ts index affb58dd121..c1100819f5e 100644 --- a/packages/pds/src/account-manager/scope-reference-getter.ts +++ b/packages/pds/src/account-manager/scope-reference-getter.ts @@ -1,4 +1,4 @@ -import Redis from 'ioredis' +import { Redis } from 'ioredis' import { DAY, backoffMs, retry } from '@atproto/common' import { Client, XrpcError } from '@atproto/lex' import { InvalidTokenError, OAuthScope } from '@atproto/oauth-provider' diff --git a/packages/pds/src/actor-store/blob/transactor.ts b/packages/pds/src/actor-store/blob/transactor.ts index 8b6fb8f801b..17296b14294 100644 --- a/packages/pds/src/actor-store/blob/transactor.ts +++ b/packages/pds/src/actor-store/blob/transactor.ts @@ -1,6 +1,8 @@ import crypto from 'node:crypto' import stream from 'node:stream' -import { fromStream as fileTypeFromStream } from 'file-type' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import fileType from 'file-type' +const { fromStream: fileTypeFromStream } = fileType import PQueue from 'p-queue' import { SECOND, cloneStream, streamSize } from '@atproto/common' import { diff --git a/packages/pds/src/auth-verifier.ts b/packages/pds/src/auth-verifier.ts index 37db6faa5a5..f961c4e500e 100644 --- a/packages/pds/src/auth-verifier.ts +++ b/packages/pds/src/auth-verifier.ts @@ -1,7 +1,7 @@ import { KeyObject, createPublicKey, createSecretKey } from 'node:crypto' import { IncomingMessage, ServerResponse } from 'node:http' import * as jose from 'jose' -import KeyEncoder from 'key-encoder' +import KeyEncoderModule from 'key-encoder' import { getVerificationMaterial } from '@atproto/common' import { IdResolver, getDidKeyFromMultibase } from '@atproto/identity' import { AtIdentifierString, DidString, isDidString } from '@atproto/lex' @@ -43,6 +43,9 @@ import { softDeleted } from './db/index.js' import { appendVary } from './util/http.js' import { WithRequired } from './util/types.js' +// key-encoder is CJS with exports.default; Node ESM interop wraps it as { default: Class } +const KeyEncoder = ((m) => m.default ?? m)(KeyEncoderModule) + export type VerifiedOptions = { checkTakedown?: boolean checkDeactivated?: boolean diff --git a/packages/pds/src/background.ts b/packages/pds/src/background.ts index a268044f9e0..5c6fd9f1e24 100644 --- a/packages/pds/src/background.ts +++ b/packages/pds/src/background.ts @@ -4,7 +4,7 @@ import { dbLogger } from './logger.js' // A simple queue for in-process, out-of-band/backgrounded work export class BackgroundQueue { - queue = new PQueue({ concurrency: 5 }) + queue: InstanceType = new PQueue({ concurrency: 5 }) destroyed = false constructor() {} diff --git a/packages/pds/src/index.ts b/packages/pds/src/index.ts index be01b8547ee..f88648f0036 100644 --- a/packages/pds/src/index.ts +++ b/packages/pds/src/index.ts @@ -9,7 +9,11 @@ import http from 'node:http' import { PlcClientError } from '@did-plc/lib' import cors from 'cors' import express from 'express' -import { HttpTerminator, createHttpTerminator } from 'http-terminator' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import httpTerminator from 'http-terminator' +// eslint-disable-next-line import/no-named-as-default-member +const { createHttpTerminator } = httpTerminator +type HttpTerminator = ReturnType import { DAY, HOUR, MINUTE, SECOND } from '@atproto/common' import { MemoryRateLimiter, diff --git a/packages/pds/src/mailer/index.ts b/packages/pds/src/mailer/index.ts index 9bf5e159d13..34783836285 100644 --- a/packages/pds/src/mailer/index.ts +++ b/packages/pds/src/mailer/index.ts @@ -1,6 +1,4 @@ -import { Transporter } from 'nodemailer' -import Mail from 'nodemailer/lib/mailer' -import SMTPTransport from 'nodemailer/lib/smtp-transport' +import { SendMailOptions, Transporter } from 'nodemailer' import { htmlToText } from 'nodemailer-html-to-text' import { ServerConfig } from '../config/index.js' import { mailerLogger } from '../logger.js' @@ -10,7 +8,7 @@ import * as templates from './templates.js' export class ServerMailer { constructor( - public readonly transporter: Transporter, + public readonly transporter: Transporter, private readonly config: ServerConfig, ) { transporter.use('compile', htmlToText()) @@ -23,7 +21,7 @@ export class ServerMailer { async sendResetPassword( params: { handle: string; token: string }, - mailOpts: Mail.Options, + mailOpts: SendMailOptions, ) { await this.sendTemplate('resetPassword', params, { subject: 'Password Reset Requested', @@ -31,28 +29,31 @@ export class ServerMailer { }) } - async sendAccountDelete(params: { token: string }, mailOpts: Mail.Options) { + async sendAccountDelete( + params: { token: string }, + mailOpts: SendMailOptions, + ) { await this.sendTemplate('deleteAccount', params, { subject: 'Account Deletion Requested', ...mailOpts, }) } - async sendConfirmEmail(params: { token: string }, mailOpts: Mail.Options) { + async sendConfirmEmail(params: { token: string }, mailOpts: SendMailOptions) { await this.sendTemplate('confirmEmail', params, { subject: 'Email Confirmation', ...mailOpts, }) } - async sendUpdateEmail(params: { token: string }, mailOpts: Mail.Options) { + async sendUpdateEmail(params: { token: string }, mailOpts: SendMailOptions) { await this.sendTemplate('updateEmail', params, { subject: 'Email Update Requested', ...mailOpts, }) } - async sendPlcOperation(params: { token: string }, mailOpts: Mail.Options) { + async sendPlcOperation(params: { token: string }, mailOpts: SendMailOptions) { await this.sendTemplate('plcOperation', params, { subject: 'PLC Update Operation Requested', ...mailOpts, @@ -62,7 +63,7 @@ export class ServerMailer { private async sendTemplate( templateName: K, params: Parameters<(typeof templates)[K]>[0], - mailOpts: Mail.Options, + mailOpts: SendMailOptions, ) { const html = templates[templateName]({ ...params, diff --git a/packages/pds/src/mailer/moderation.ts b/packages/pds/src/mailer/moderation.ts index 574ae39d9fb..5aec897da87 100644 --- a/packages/pds/src/mailer/moderation.ts +++ b/packages/pds/src/mailer/moderation.ts @@ -1,24 +1,19 @@ -import { Transporter } from 'nodemailer' -import Mail from 'nodemailer/lib/mailer' -import SMTPTransport from 'nodemailer/lib/smtp-transport' +import { SendMailOptions, Transporter } from 'nodemailer' import { htmlToText } from 'nodemailer-html-to-text' import { ServerConfig } from '../config/index.js' import { mailerLogger } from '../logger.js' export class ModerationMailer { private config: ServerConfig - transporter: Transporter + transporter: Transporter - constructor( - transporter: Transporter, - config: ServerConfig, - ) { + constructor(transporter: Transporter, config: ServerConfig) { this.config = config this.transporter = transporter this.transporter.use('compile', htmlToText()) } - async send({ content }: { content: string }, mailOpts: Mail.Options) { + async send({ content }: { content: string }, mailOpts: SendMailOptions) { const mail = { ...mailOpts, html: content, diff --git a/packages/pds/src/scripts/sequencer-recovery/user-queues.ts b/packages/pds/src/scripts/sequencer-recovery/user-queues.ts index a994b4ab11e..49ab5c18d74 100644 --- a/packages/pds/src/scripts/sequencer-recovery/user-queues.ts +++ b/packages/pds/src/scripts/sequencer-recovery/user-queues.ts @@ -1,7 +1,10 @@ import PQueue from 'p-queue' + +type Queue = InstanceType + export class UserQueues { - main: PQueue - queues = new Map() + main: Queue + queues: Map = new Map() constructor(concurrency: number) { this.main = new PQueue({ concurrency }) diff --git a/packages/pds/src/sequencer/outbox.ts b/packages/pds/src/sequencer/outbox.ts index 3d9cfd1e33f..54d55b986f2 100644 --- a/packages/pds/src/sequencer/outbox.ts +++ b/packages/pds/src/sequencer/outbox.ts @@ -1,6 +1,6 @@ import { AsyncBuffer, AsyncBufferFullError } from '@atproto/common' import { InvalidRequestError } from '@atproto/xrpc-server' -import { SeqEvt, Sequencer } from '.' +import { SeqEvt, Sequencer } from './index.js' export type OutboxOpts = { maxBufferSize: number diff --git a/packages/pds/src/sequencer/sequencer.ts b/packages/pds/src/sequencer/sequencer.ts index 479225447a4..584f6928bf6 100644 --- a/packages/pds/src/sequencer/sequencer.ts +++ b/packages/pds/src/sequencer/sequencer.ts @@ -1,5 +1,5 @@ import EventEmitter from 'node:events' -import TypedEmitter from 'typed-emitter' +import type TypedEmitter from 'typed-emitter' import { SECOND, wait } from '@atproto/common' import { decode as cborDecode } from '@atproto/lex-cbor' import { DatetimeString, DidString, HandleString } from '@atproto/syntax' @@ -258,6 +258,6 @@ type SequencerEvents = { close: () => void } -export type SequencerEmitter = TypedEmitter +export type SequencerEmitter = TypedEmitter.default export default Sequencer diff --git a/packages/pds/tests/_types.d.ts b/packages/pds/tests/_types.d.ts new file mode 100644 index 00000000000..49b90502063 --- /dev/null +++ b/packages/pds/tests/_types.d.ts @@ -0,0 +1,16 @@ +declare module 'nodemailer/lib/mailer' { + namespace Mail { + interface Options { + from?: string | { name?: string; address: string } + to?: string | string[] + subject?: string + text?: string + html?: string + [key: string]: any + } + } + class Mail { + constructor(transporter: any) + } + export = Mail +} diff --git a/packages/pds/tests/account-manager.test.ts b/packages/pds/tests/account-manager.test.ts index 5b9047daecd..fe971ff872b 100644 --- a/packages/pds/tests/account-manager.test.ts +++ b/packages/pds/tests/account-manager.test.ts @@ -1,3 +1,4 @@ +import { jest } from '@jest/globals' import { type Browser, launch } from 'puppeteer' import { TestNetworkNoAppView } from '@atproto/dev-env' import { PageHelper } from './_puppeteer.js' @@ -129,7 +130,7 @@ describe('account manager', () => { expect(sendResetPasswordMock).toHaveBeenCalledTimes(1) - const [params] = sendResetPasswordMock.mock.lastCall + const [params] = sendResetPasswordMock.mock.lastCall! expect(params).toEqual({ handle: 'bob.test', token: expect.any(String), diff --git a/packages/pds/tests/email-confirmation.test.ts b/packages/pds/tests/email-confirmation.test.ts index 0983d3b9803..20c8bb75e11 100644 --- a/packages/pds/tests/email-confirmation.test.ts +++ b/packages/pds/tests/email-confirmation.test.ts @@ -1,5 +1,5 @@ import { EventEmitter, once } from 'node:events' -import Mail from 'nodemailer/lib/mailer' +import { SendMailOptions } from 'nodemailer' import { AtpAgent, ComAtprotoServerConfirmEmail, @@ -45,12 +45,12 @@ describe('email confirmation', () => { await network.close() }) - const getMailFrom = async (promise): Promise => { + const getMailFrom = async (promise): Promise => { const result = await Promise.all([once(mailCatcher, 'mail'), promise]) return result[0][0] } - const getTokenFromMail = (mail: Mail.Options) => + const getTokenFromMail = (mail: SendMailOptions) => mail.html?.toString().match(/>([a-z0-9]{5}-[a-z0-9]{5}) { diff --git a/packages/pds/tests/entryway-mock.ts b/packages/pds/tests/entryway-mock.ts index f36e52816fa..270e6b84e8a 100644 --- a/packages/pds/tests/entryway-mock.ts +++ b/packages/pds/tests/entryway-mock.ts @@ -3,7 +3,7 @@ import * as http from 'node:http' import * as plcLib from '@did-plc/lib' import { HttpTerminator, createHttpTerminator } from 'http-terminator' import * as jose from 'jose' -import KeyEncoder from 'key-encoder' +import KeyEncoderModule from 'key-encoder' import * as ui8 from 'uint8arrays' import { AtpAgent } from '@atproto/api' import { getVerificationMaterial } from '@atproto/common' @@ -22,6 +22,9 @@ import { } from '../src/auth-verifier.js' import { com } from '../src/lexicons/index.js' +// key-encoder is CJS with exports.default; Node ESM interop wraps it as { default: Class } +const KeyEncoder = ((m) => m.default ?? m)(KeyEncoderModule) + interface Account { did: DidString handle: HandleString diff --git a/packages/pds/tests/handles.test.ts b/packages/pds/tests/handles.test.ts index fa74e88b852..0fcaaf5746a 100644 --- a/packages/pds/tests/handles.test.ts +++ b/packages/pds/tests/handles.test.ts @@ -1,15 +1,14 @@ -import { AtpAgent } from '@atproto/api' -import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env' -import { IdResolver } from '@atproto/identity' +import { jest } from '@jest/globals' +import { type AtpAgent } from '@atproto/api' +import { type SeedClient } from '@atproto/dev-env' import { AtIdentifierString, DidString } from '@atproto/syntax' -import { AppContext } from '../src/index.js' -import basicSeed from './seeds/basic.js' +import { type AppContext } from '../src/index.js' // outside of suite so they can be used in mock let alice: DidString let bob: DidString -jest.mock('node:dns/promises', () => { +jest.unstable_mockModule('node:dns/promises', () => { return { resolveTxt: (domain: string) => { if (domain === '_atproto.alice.external') { @@ -23,12 +22,19 @@ jest.mock('node:dns/promises', () => { } }) +// Dynamic imports so jest.unstable_mockModule() registers before these modules +// load node:dns/promises. Static imports link the full dep graph before any code +// evaluates, which would bypass the mock. Remove once migrated to vitest. +const { IdResolver } = await import('@atproto/identity') +const { TestNetworkNoAppView } = await import('@atproto/dev-env') +const { default: basicSeed } = await import('./seeds/basic.js') + describe('handles', () => { - let network: TestNetworkNoAppView + let network: InstanceType let agent: AtpAgent let sc: SeedClient let ctx: AppContext - let idResolver: IdResolver + let idResolver: InstanceType const newHandle = 'alice2.test' diff --git a/packages/pds/tests/oauth.test.ts b/packages/pds/tests/oauth.test.ts index cf60cdb1dbe..8c7c07a119c 100644 --- a/packages/pds/tests/oauth.test.ts +++ b/packages/pds/tests/oauth.test.ts @@ -1,6 +1,7 @@ import { once } from 'node:events' import { Server, createServer } from 'node:http' import { AddressInfo } from 'node:net' +import { jest } from '@jest/globals' import { type Browser, launch } from 'puppeteer' import { TestNetworkNoAppView } from '@atproto/dev-env' import { oauthClientAssetsMiddleware } from './_oauth_client_assets_middleware.js' @@ -156,7 +157,7 @@ describe('oauth', () => { expect(sendTemplateMock).toHaveBeenCalledTimes(1) - const [params] = sendTemplateMock.mock.lastCall + const [params] = sendTemplateMock.mock.lastCall! expect(params).toEqual({ handle: 'alice.test', token: expect.any(String), diff --git a/packages/pds/tests/plc-operations.test.ts b/packages/pds/tests/plc-operations.test.ts index ba26fba6ec7..03c8acd070e 100644 --- a/packages/pds/tests/plc-operations.test.ts +++ b/packages/pds/tests/plc-operations.test.ts @@ -1,8 +1,7 @@ import assert from 'node:assert' -import { once } from 'node:events' -import { EventEmitter } from 'node:stream' +import { EventEmitter, once } from 'node:events' import * as plc from '@did-plc/lib' -import Mail from 'nodemailer/lib/mailer' +import { SendMailOptions } from 'nodemailer' import { AtpAgent } from '@atproto/api' import { check } from '@atproto/common' import { Secp256k1Keypair } from '@atproto/crypto' @@ -52,12 +51,12 @@ describe('plc operations', () => { await network.close() }) - const getMailFrom = async (promise): Promise => { + const getMailFrom = async (promise): Promise => { const result = await Promise.all([once(mailCatcher, 'mail'), promise]) return result[0][0] } - const getTokenFromMail = (mail: Mail.Options) => + const getTokenFromMail = (mail: SendMailOptions) => mail.html?.toString().match(/>([a-z0-9]{5}-[a-z0-9]{5})) => { diff --git a/packages/pds/tests/recovery.test.ts b/packages/pds/tests/recovery.test.ts index a6318e83bd0..831cdaacb7d 100644 --- a/packages/pds/tests/recovery.test.ts +++ b/packages/pds/tests/recovery.test.ts @@ -3,9 +3,10 @@ import * as ui8 from 'uint8arrays' import AtpAgent from '@atproto/api' import { renameIfExists, rmIfExists } from '@atproto/common' import { SeedClient, TestNetworkNoAppView, basicSeed } from '@atproto/dev-env' +// import package to avoid type errors from circular dep with dev-env +import { type AppContext, scripts } from '@atproto/pds' import { verifyRepoCar } from '@atproto/repo' import { DidString } from '@atproto/syntax' -import { AppContext, scripts } from '../dist/index.js' describe('recovery', () => { let network: TestNetworkNoAppView diff --git a/packages/pds/tests/sequencer.test.ts b/packages/pds/tests/sequencer.test.ts index 6c5d4307fad..05ef580b588 100644 --- a/packages/pds/tests/sequencer.test.ts +++ b/packages/pds/tests/sequencer.test.ts @@ -7,8 +7,12 @@ import { import { randomStr } from '@atproto/crypto' import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env' import { readCarWithRoot } from '@atproto/repo' -import { sequencer } from '../src/index.js' -import { SeqEvt, Sequencer, formatSeqSyncEvt } from '../src/sequencer/index.js' +import { + SeqEvt, + Sequencer, + SyncEvt, + formatSeqSyncEvt, +} from '../src/sequencer/index.js' import { Outbox } from '../src/sequencer/outbox.js' import userSeed from './seeds/users.js' @@ -234,7 +238,7 @@ describe('sequencer', () => { ) const dbEvt = await formatSeqSyncEvt(sc.dids.alice, syncData) - const evt = cborDecode(dbEvt.event) + const evt = cborDecode(dbEvt.event) expect(evt.did).toBe(sc.dids.alice) const car = await readCarWithRoot(evt.blocks) expect(car.root.toString()).toBe(syncData.cid.toString()) diff --git a/packages/pds/tsconfig.tests.json b/packages/pds/tsconfig.tests.json index 7fac0ed90d5..ec2d9e186dd 100644 --- a/packages/pds/tsconfig.tests.json +++ b/packages/pds/tsconfig.tests.json @@ -4,5 +4,5 @@ "rootDir": ".", "noUnusedLocals": false }, - "include": ["./tests"] + "include": ["./tests/**/*.ts"] } diff --git a/packages/repo/jest.config.cjs b/packages/repo/jest.config.cjs index c5af896d34b..a8bf981abcc 100644 --- a/packages/repo/jest.config.cjs +++ b/packages/repo/jest.config.cjs @@ -1,7 +1,24 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Repo', - transform: { '^.+\\.(t|j)s$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], - moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, + moduleNameMapper: { + '^varint$': '/../../jest.varint-shim.cjs', + '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'], + }, } diff --git a/packages/repo/package.json b/packages/repo/package.json index 9c1619194ad..baad7e6a19a 100644 --- a/packages/repo/package.json +++ b/packages/repo/package.json @@ -16,11 +16,9 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/repo" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", - "test:profile": "node --inspect ../../node_modules/.bin/jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", + "test:profile": "node --experimental-vm-modules --inspect ../../node_modules/.bin/jest", "build": "tsc --build tsconfig.build.json" }, "dependencies": { @@ -36,5 +34,12 @@ "devDependencies": { "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/repo/src/car.ts b/packages/repo/src/car.ts index f1d41a36038..8916ebf2cf1 100644 --- a/packages/repo/src/car.ts +++ b/packages/repo/src/car.ts @@ -1,5 +1,6 @@ import { setImmediate } from 'node:timers/promises' -import * as varint from 'varint' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import varint from 'varint' import * as cbor from '@atproto/lex-cbor' import { Cid, decodeCid, isCidForBytes } from '@atproto/lex-data' import { BlockMap } from './block-map.js' diff --git a/packages/repo/tests/car.test.ts b/packages/repo/tests/car.test.ts index 22de39817d9..6ffb72d80a6 100644 --- a/packages/repo/tests/car.test.ts +++ b/packages/repo/tests/car.test.ts @@ -9,7 +9,7 @@ import { toBase64, } from '@atproto/lex-data' import { CarBlock, readCarStream, writeCarStream } from '../src/index.js' -import fixtures from './car-file-fixtures.json' +import fixtures from './car-file-fixtures.json' with { type: 'json' } async function dataToCborBlock(data: LexValue): Promise<{ cid: Cid diff --git a/packages/repo/tests/commit-proofs.test.ts b/packages/repo/tests/commit-proofs.test.ts index 3798620db82..c1d827931c9 100644 --- a/packages/repo/tests/commit-proofs.test.ts +++ b/packages/repo/tests/commit-proofs.test.ts @@ -2,7 +2,7 @@ import { parseCid } from '@atproto/lex-data' import { BlockMap } from '../src/index.js' import { MST } from '../src/mst/index.js' import { MemoryBlockstore } from '../src/storage/index.js' -import fixtures from './commit-proof-fixtures.json' +import fixtures from './commit-proof-fixtures.json' with { type: 'json' } describe('commit proofs', () => { for (const fixture of fixtures) { diff --git a/packages/sync/jest.config.cjs b/packages/sync/jest.config.cjs index 60154381187..bb7dc2803ad 100644 --- a/packages/sync/jest.config.cjs +++ b/packages/sync/jest.config.cjs @@ -1,7 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'Sync', - transform: { '^.+\\.ts$': '@swc/jest' }, + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], testTimeout: 60000, setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, diff --git a/packages/sync/package.json b/packages/sync/package.json index 4ae675bea37..0ec54501342 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -18,13 +18,11 @@ "engines": { "node": ">=22" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "codegen": "lex build --clear --indexFile --lexicons ../../lexicons --include com.atproto.sync.subscribeRepos", "prebuild": "pnpm run codegen", "build": "tsc --build tsconfig.build.json", - "test": "../dev-infra/with-test-redis-and-db.sh jest" + "test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-redis-and-db.sh jest" }, "dependencies": { "@atproto/common": "workspace:^", @@ -33,12 +31,19 @@ "@atproto/repo": "workspace:^", "@atproto/syntax": "workspace:^", "@atproto/xrpc-server": "workspace:^", - "p-queue": "^6.6.2", + "p-queue": "^8.0.0", "ws": "^8.12.0" }, "devDependencies": { "@types/ws": "^8.5.4", "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/sync/src/runner/memory-runner.ts b/packages/sync/src/runner/memory-runner.ts index 3b4de8e3eb7..198525f41d3 100644 --- a/packages/sync/src/runner/memory-runner.ts +++ b/packages/sync/src/runner/memory-runner.ts @@ -8,12 +8,14 @@ export type MemoryRunnerOptions = { startCursor?: number } +type Queue = InstanceType + // A queue with arbitrarily many partitions, each processing work sequentially. // Partitions are created lazily and taken out of memory when they go idle. export class MemoryRunner implements EventRunner { consecutive = new ConsecutiveList() - mainQueue: PQueue - partitions = new Map() + mainQueue: Queue + partitions: Map = new Map() cursor: number | undefined constructor(public opts: MemoryRunnerOptions = {}) { diff --git a/packages/sync/tests/firehose.test.ts b/packages/sync/tests/firehose.test.ts index f828d6aff4b..be5cb0a0fee 100644 --- a/packages/sync/tests/firehose.test.ts +++ b/packages/sync/tests/firehose.test.ts @@ -6,7 +6,13 @@ import { } from '@atproto/dev-env' import { IdResolver } from '@atproto/identity' import { DidString } from '@atproto/syntax' -import { Create, Event, Firehose, FirehoseOptions, MemoryRunner } from '..' +import { + Create, + Event, + Firehose, + FirehoseOptions, + MemoryRunner, +} from '../src/index.js' describe('firehose', () => { let network: TestNetworkNoAppView diff --git a/packages/sync/tests/runner.test.ts b/packages/sync/tests/runner.test.ts index b6a27a490f6..8117485f9d3 100644 --- a/packages/sync/tests/runner.test.ts +++ b/packages/sync/tests/runner.test.ts @@ -1,5 +1,5 @@ import { wait } from '@atproto/common' -import { ConsecutiveList, MemoryRunner } from '..' +import { ConsecutiveList, MemoryRunner } from '../src/index.js' describe('EventRunner utils', () => { describe('ConsecutiveList', () => { diff --git a/packages/sync/tsconfig.tests.json b/packages/sync/tsconfig.tests.json index e18c81f1068..7fac0ed90d5 100644 --- a/packages/sync/tsconfig.tests.json +++ b/packages/sync/tsconfig.tests.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig/tests.json", "compilerOptions": { - "rootDir": "./tests", + "rootDir": ".", "noUnusedLocals": false }, "include": ["./tests"] diff --git a/packages/syntax/benchmark.js b/packages/syntax/benchmark.cjs similarity index 100% rename from packages/syntax/benchmark.js rename to packages/syntax/benchmark.cjs diff --git a/packages/syntax/package.json b/packages/syntax/package.json index 6a7dfe05a54..9d9da44adb2 100644 --- a/packages/syntax/package.json +++ b/packages/syntax/package.json @@ -18,8 +18,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/syntax" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "test": "vitest run", "build": "tsc --build tsconfig.build.json" @@ -33,5 +31,12 @@ }, "browser": { "dns/promises": false + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/tap/package.json b/packages/tap/package.json index 1a0ef655c4f..caab28d6218 100644 --- a/packages/tap/package.json +++ b/packages/tap/package.json @@ -19,8 +19,6 @@ "engines": { "node": ">=22" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "build": "tsc --build tsconfig.build.json", "test": "vitest run" @@ -39,5 +37,12 @@ "typescript": "^6.0.3", "@vitest/coverage-v8": "4.0.16", "vitest": "^4.0.16" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/tap/src/channel.ts b/packages/tap/src/channel.ts index 4584d2a6cd4..bf5e5ced0c4 100644 --- a/packages/tap/src/channel.ts +++ b/packages/tap/src/channel.ts @@ -1,4 +1,4 @@ -import { ClientOptions } from 'ws' +import type { ClientOptions } from 'ws' import { Deferrable, createDeferrable } from '@atproto/common' import { lexParse } from '@atproto/lex' import { WebSocketKeepAlive } from '@atproto/ws-client' diff --git a/packages/ws-client/jest.config.cjs b/packages/ws-client/jest.config.cjs index 74c92c5711b..cb3b3e5fb41 100644 --- a/packages/ws-client/jest.config.cjs +++ b/packages/ws-client/jest.config.cjs @@ -1,8 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'WebSocket Client', - transform: { '^.+\\.(j|t)s$': '@swc/jest' }, - transformIgnorePatterns: ['/node_modules/.pnpm/(?!(get-port)@)'], + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/ws-client/package.json b/packages/ws-client/package.json index b8a55d1a010..df8178becb3 100644 --- a/packages/ws-client/package.json +++ b/packages/ws-client/package.json @@ -16,10 +16,8 @@ "engines": { "node": ">=22" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "build": "tsc --build tsconfig.build.json" }, "dependencies": { @@ -31,5 +29,12 @@ "get-port": "^6.1.2", "jest": "^30.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/ws-client/src/index.ts b/packages/ws-client/src/index.ts index d874a05481d..1bdbed154bb 100644 --- a/packages/ws-client/src/index.ts +++ b/packages/ws-client/src/index.ts @@ -1,4 +1,5 @@ -import { ClientOptions, WebSocket, createWebSocketStream } from 'ws' +import type { ClientOptions } from 'ws' +import { WebSocket, createWebSocketStream } from 'ws' import { SECOND, isErrnoException, wait } from '@atproto/common' export class WebSocketKeepAlive { diff --git a/packages/xrpc-server/jest.config.cjs b/packages/xrpc-server/jest.config.cjs index 472a88eee38..566b00e6604 100644 --- a/packages/xrpc-server/jest.config.cjs +++ b/packages/xrpc-server/jest.config.cjs @@ -1,8 +1,21 @@ /** @type {import('jest').Config} */ module.exports = { displayName: 'XRPC Server', - transform: { '^.+\\.(j|t)s$': '@swc/jest' }, - transformIgnorePatterns: ['/node_modules/.pnpm/(?!(get-port)@)'], + transform: { + '^.+\\.(t|j)s$': [ + '@swc/jest', + { + jsc: { + parser: { syntax: 'typescript', importAttributes: true }, + experimental: { keepImportAttributes: true }, + transform: {}, + }, + module: { type: 'es6' }, + }, + ], + }, + extensionsToTreatAsEsm: ['.ts'], + transformIgnorePatterns: [], setupFiles: ['/../../test.setup.ts'], moduleNameMapper: { '^(\\.\\.?\\/.+)\\.js$': ['$1.ts', '$1.js'] }, } diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index 34a21cca1dd..c654d88d364 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -16,10 +16,8 @@ "engines": { "node": ">=22" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { - "test": "jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", "build": "tsc --build tsconfig.build.json" }, "dependencies": { @@ -43,6 +41,7 @@ "@atproto/crypto": "workspace:^", "@atproto/lex": "workspace:^", "@atproto/lex-document": "workspace:^", + "@jest/globals": "^30.0.0", "@types/express": "^4.17.13", "@types/express-serve-static-core": "^4.17.36", "@types/http-errors": "^2.0.4", @@ -50,9 +49,16 @@ "@types/ws": "^8.5.4", "get-port": "^6.1.2", "jest": "^30.0.0", - "jose": "^4.15.4", + "jose": "^5.0.1", "key-encoder": "^2.0.3", - "multiformats": "^9.9.0", + "multiformats": "^13.0.0", "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/packages/xrpc-server/src/errors.ts b/packages/xrpc-server/src/errors.ts index 943bfd6ce04..0932739f725 100644 --- a/packages/xrpc-server/src/errors.ts +++ b/packages/xrpc-server/src/errors.ts @@ -1,4 +1,7 @@ -import { isHttpError } from 'http-errors' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import httpErrors from 'http-errors' +// eslint-disable-next-line import/no-named-as-default-member +const { isHttpError } = httpErrors import { LexError, XrpcError } from '@atproto/lex-client' import { l } from '@atproto/lex-schema' import { diff --git a/packages/xrpc-server/src/stream/server.ts b/packages/xrpc-server/src/stream/server.ts index 7991ed8c37c..b9b888ff72d 100644 --- a/packages/xrpc-server/src/stream/server.ts +++ b/packages/xrpc-server/src/stream/server.ts @@ -1,5 +1,6 @@ import { IncomingMessage } from 'node:http' -import { ServerOptions, WebSocket, WebSocketServer } from 'ws' +import type { ServerOptions } from 'ws' +import { WebSocket, WebSocketServer } from 'ws' import { CloseCode, DisconnectError } from '@atproto/ws-client' import { ErrorFrame, Frame } from './frames.js' import { logger } from './logger.js' diff --git a/packages/xrpc-server/src/stream/subscription.ts b/packages/xrpc-server/src/stream/subscription.ts index 5e030cfd27c..0ef27954149 100644 --- a/packages/xrpc-server/src/stream/subscription.ts +++ b/packages/xrpc-server/src/stream/subscription.ts @@ -1,4 +1,4 @@ -import { ClientOptions } from 'ws' +import type { ClientOptions } from 'ws' import { isPlainObject } from '@atproto/lex-data' import { WebSocketKeepAlive } from '@atproto/ws-client' import { ensureChunkIsMessage } from './stream.js' diff --git a/packages/xrpc-server/src/util.ts b/packages/xrpc-server/src/util.ts index 2f9fe3b1cf6..52859b0388c 100644 --- a/packages/xrpc-server/src/util.ts +++ b/packages/xrpc-server/src/util.ts @@ -7,7 +7,10 @@ import { json, text, } from 'express' -import { contentType } from 'mime-types' +// eslint-disable-next-line import/default, import/no-named-as-default-member +import mimeTypes from 'mime-types' +// eslint-disable-next-line import/no-named-as-default-member +const { contentType } = mimeTypes import { MaxSizeChecker, createDecoders } from '@atproto/common' import { jsonToLex } from '@atproto/lex-json' import { l } from '@atproto/lex-schema' diff --git a/packages/xrpc-server/tests/auth.test.ts b/packages/xrpc-server/tests/auth.test.ts index 6a0a402d78a..cab2ac40fcc 100644 --- a/packages/xrpc-server/tests/auth.test.ts +++ b/packages/xrpc-server/tests/auth.test.ts @@ -2,7 +2,7 @@ import { KeyObject, createPrivateKey } from 'node:crypto' import * as http from 'node:http' import { AddressInfo } from 'node:net' import * as jose from 'jose' -import KeyEncoder from 'key-encoder' +import KeyEncoderModule from 'key-encoder' import { MINUTE } from '@atproto/common' import { Secp256k1Keypair } from '@atproto/crypto' import { LexiconDoc } from '@atproto/lexicon' @@ -15,6 +15,9 @@ import { createServer, } from './_util.js' +// key-encoder is CJS with exports.default; Node ESM interop wraps it as { default: Class } +const KeyEncoder = ((m) => m.default ?? m)(KeyEncoderModule) + const LEXICONS: LexiconDoc[] = [ { lexicon: 1, diff --git a/packages/xrpc-server/tests/bodies.test.ts b/packages/xrpc-server/tests/bodies.test.ts index a980d99e31d..e57584335b2 100644 --- a/packages/xrpc-server/tests/bodies.test.ts +++ b/packages/xrpc-server/tests/bodies.test.ts @@ -3,18 +3,19 @@ import * as http from 'node:http' import { AddressInfo } from 'node:net' import { Readable } from 'node:stream' import { brotliCompressSync, deflateSync, gzipSync } from 'node:zlib' +import { jest } from '@jest/globals' import { cidForCbor } from '@atproto/common' import { randomBytes } from '@atproto/crypto' import { LexiconDoc } from '@atproto/lexicon' import { ResponseType, XrpcClient } from '@atproto/xrpc' -import * as xrpcServer from '../src' -import { logger } from '../src/logger' +import * as xrpcServer from '../src/index.js' +import { logger } from '../src/logger.js' import { buildAddLexicons, buildMethodLexicons, closeServer, createServer, -} from './_util' +} from './_util.js' const BLOB_LIMIT = 5000 diff --git a/packages/xrpc/package.json b/packages/xrpc/package.json index 86e922820e3..699504caafa 100644 --- a/packages/xrpc/package.json +++ b/packages/xrpc/package.json @@ -16,8 +16,6 @@ "url": "https://github.com/bluesky-social/atproto", "directory": "packages/xrpc" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", "scripts": { "build": "tsc --build tsconfig.build.json" }, @@ -27,5 +25,12 @@ }, "devDependencies": { "typescript": "^6.0.3" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } } } diff --git a/patches/kysely@0.22.0.patch b/patches/kysely@0.22.0.patch new file mode 100644 index 00000000000..e920fd54c8b --- /dev/null +++ b/patches/kysely@0.22.0.patch @@ -0,0 +1,46 @@ +diff --git a/dist/cjs/index.d.ts b/dist/cjs/index.d.ts +index 712dae586cc1663c318eed244c307ea0376fa37a..35f187883e69f995a6d5571959046349bfdd40dd 100644 +--- a/dist/cjs/index.d.ts ++++ b/dist/cjs/index.d.ts +@@ -172,3 +172,9 @@ export { InsertObject } from './parser/insert-values-parser.js'; + export { MutationObject } from './parser/update-set-parser.js'; + export { OrderByExpression, OrderByDirectionExpression, } from './parser/order-by-parser.js'; + export { SetOperationExpression } from './parser/set-operation-parser.js'; ++export { QueryCreatorWithCommonTableExpression } from './parser/with-parser.js'; ++export { QueryBuilderWithSelection } from './parser/select-parser.js'; ++export { Nullable } from './util/type-utils.js'; ++export { QueryCreatorWithCommonTableExpression } from './parser/with-parser.js'; ++export { QueryBuilderWithSelection } from './parser/select-parser.js'; ++export { Nullable } from './util/type-utils.js'; +diff --git a/dist/esm/index.d.ts b/dist/esm/index.d.ts +index 712dae586cc1663c318eed244c307ea0376fa37a..35f187883e69f995a6d5571959046349bfdd40dd 100644 +--- a/dist/esm/index.d.ts ++++ b/dist/esm/index.d.ts +@@ -172,3 +172,9 @@ export { InsertObject } from './parser/insert-values-parser.js'; + export { MutationObject } from './parser/update-set-parser.js'; + export { OrderByExpression, OrderByDirectionExpression, } from './parser/order-by-parser.js'; + export { SetOperationExpression } from './parser/set-operation-parser.js'; ++export { QueryCreatorWithCommonTableExpression } from './parser/with-parser.js'; ++export { QueryBuilderWithSelection } from './parser/select-parser.js'; ++export { Nullable } from './util/type-utils.js'; ++export { QueryCreatorWithCommonTableExpression } from './parser/with-parser.js'; ++export { QueryBuilderWithSelection } from './parser/select-parser.js'; ++export { Nullable } from './util/type-utils.js'; +diff --git a/package.json b/package.json +index 407f0d5d244714796781eb2b9937b7bd65419f81..575cf1327328e71b4e196e7905bfcbf3f156b267 100644 +--- a/package.json ++++ b/package.json +@@ -13,9 +13,12 @@ + "module": "dist/esm/index.js", + "exports": { + ".": { ++ "types": "./dist/esm/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" +- } ++ }, ++ "./dist/esm/*": "./dist/esm/*", ++ "./dist/cjs/*": "./dist/cjs/*" + }, + "scripts": { + "clean": "rm -rf dist && rm -rf test/node/dist && rm -rf test/browser/bundle.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6de76f438da..03b6014485c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,11 @@ overrides: cookie: ^0.7.2 opentelemetry-plugin-better-sqlite3>@opentelemetry/core: ^1.30.0 +patchedDependencies: + kysely@0.22.0: + hash: 5k7pdbhmqkb2cevvbr5z6i5uee + path: patches/kysely@0.22.0.patch + importers: .: @@ -21,6 +26,9 @@ importers: '@changesets/cli': specifier: ^2.29.7 version: 2.29.7(@types/node@22.19.17) + '@jest/globals': + specifier: ^30.0.0 + version: 30.4.1 '@swc/core': specifier: ^1.3.42 version: 1.11.18 @@ -28,8 +36,8 @@ importers: specifier: ^0.2.24 version: 0.2.24(@swc/core@1.11.18) '@types/jest': - specifier: ^28.1.4 - version: 28.1.8 + specifier: ^30.0.0 + version: 30.0.0 '@types/node': specifier: ^22.0.0 version: 22.19.17 @@ -103,11 +111,11 @@ importers: specifier: workspace:^ version: link:../xrpc await-lock: - specifier: ^2.2.2 - version: 2.2.2 + specifier: ^3.0.0 + version: 3.0.0 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 tlds: specifier: ^1.234.0 version: 1.234.0 @@ -164,11 +172,11 @@ importers: specifier: ^2.0.3 version: 2.0.3 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 devDependencies: typescript: specifier: ^6.0.3 @@ -268,7 +276,7 @@ importers: version: 2.0.3 kysely: specifier: ^0.22.0 - version: 0.22.0 + version: 0.22.0(patch_hash=5k7pdbhmqkb2cevvbr5z6i5uee) leo-profanity: specifier: ^1.8.0 version: 1.8.0 @@ -276,8 +284,8 @@ importers: specifier: ^2.0.1 version: 2.0.1 p-queue: - specifier: ^6.6.2 - version: 6.6.2 + specifier: ^8.0.0 + version: 8.1.1 pg: specifier: ^8.10.0 version: 8.10.0 @@ -297,8 +305,8 @@ importers: specifier: ^2.1.0 version: 2.1.0 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 undici: specifier: ^6.19.8 version: 6.19.8 @@ -368,7 +376,7 @@ importers: version: 3.2.0 kysely: specifier: ^0.22.0 - version: 0.22.0 + version: 0.22.0(patch_hash=5k7pdbhmqkb2cevvbr5z6i5uee) pg: specifier: ^8.10.0 version: 8.10.0 @@ -416,8 +424,8 @@ importers: specifier: workspace:^ version: link:../lex/lex-data multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 pino: specifier: ^8.21.0 version: 8.21.0 @@ -429,8 +437,8 @@ importers: specifier: ^6.0.3 version: 6.0.3 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 packages/common-web: dependencies: @@ -463,8 +471,8 @@ importers: specifier: ^1.6.1 version: 1.7.0 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 devDependencies: '@atproto/common': specifier: workspace:^ @@ -533,11 +541,11 @@ importers: specifier: ^5.1.1 version: 5.1.1 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 undici: specifier: ^6.14.1 version: 6.19.8 @@ -580,6 +588,9 @@ importers: '@did-plc/server': specifier: ^0.0.1 version: 0.0.1 + '@jest/globals': + specifier: ^30.0.0 + version: 30.4.1 cors: specifier: ^2.8.5 version: 2.8.5 @@ -857,6 +868,9 @@ importers: '@atproto/lex-data': specifier: workspace:^ version: link:../lex-data + cborg: + specifier: ^4.5.8 + version: 4.5.8 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -864,12 +878,6 @@ importers: '@atproto/lex-json': specifier: workspace:^ version: link:../lex-json - cborg: - specifier: ^4.5.8 - version: 4.5.8 - vite: - specifier: ^6.2.0 - version: 6.2.0(@types/node@22.19.17) vitest: specifier: ^4.0.16 version: 4.0.16(@types/node@22.19.17) @@ -902,14 +910,14 @@ importers: packages/lex/lex-data: dependencies: multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 tslib: specifier: ^2.8.1 version: 2.8.1 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 unicode-segmenter: specifier: ^0.14.0 version: 0.14.0 @@ -1126,8 +1134,8 @@ importers: specifier: ^2.2.2 version: 2.2.2 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 zod: specifier: ^3.23.8 version: 3.24.2 @@ -1173,8 +1181,8 @@ importers: packages/oauth/jwk: dependencies: multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 zod: specifier: ^3.23.8 version: 3.24.2 @@ -1248,8 +1256,8 @@ importers: specifier: ^3 version: 3.45.1 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 zod: specifier: ^3.23.8 version: 3.24.2 @@ -1689,16 +1697,16 @@ importers: version: 3.2.0 kysely: specifier: ^0.22.0 - version: 0.22.0 + version: 0.22.0(patch_hash=5k7pdbhmqkb2cevvbr5z6i5uee) lande: specifier: ^1.0.10 version: 1.0.10 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 p-queue: - specifier: ^6.6.2 - version: 6.6.2 + specifier: ^8.0.0 + version: 8.1.1 pg: specifier: ^8.10.0 version: 8.10.0 @@ -1712,8 +1720,8 @@ importers: specifier: ^2.1.0 version: 2.1.0 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 undici: specifier: ^6.14.1 version: 6.19.8 @@ -1730,6 +1738,9 @@ importers: '@did-plc/server': specifier: ^0.0.1 version: 0.0.1 + '@jest/globals': + specifier: ^30.0.0 + version: 30.4.1 '@types/cors': specifier: ^2.8.12 version: 2.8.12 @@ -1861,7 +1872,7 @@ importers: version: 2.0.3 kysely: specifier: ^0.22.0 - version: 0.22.0 + version: 0.22.0(patch_hash=5k7pdbhmqkb2cevvbr5z6i5uee) nodemailer: specifier: ^6.8.0 version: 6.8.0 @@ -1869,8 +1880,8 @@ importers: specifier: ^3.2.0 version: 3.2.0 p-queue: - specifier: ^6.6.2 - version: 6.6.2 + specifier: ^8.0.0 + version: 8.1.1 pino: specifier: ^8.21.0 version: 8.21.0 @@ -1881,8 +1892,8 @@ importers: specifier: ^2.1.0 version: 2.1.0 uint8arrays: - specifier: 3.0.0 - version: 3.0.0 + specifier: ^5.0.0 + version: 5.1.1 undici: specifier: ^6.19.8 version: 6.19.8 @@ -1905,6 +1916,9 @@ importers: '@did-plc/server': specifier: ^0.0.1 version: 0.0.1 + '@jest/globals': + specifier: ^30.0.0 + version: 30.4.1 '@types/cors': specifier: ^2.8.12 version: 2.8.12 @@ -2000,8 +2014,8 @@ importers: specifier: workspace:^ version: link:../xrpc-server p-queue: - specifier: ^6.6.2 - version: 6.6.2 + specifier: ^8.0.0 + version: 8.1.1 ws: specifier: ^8.12.0 version: 8.18.0 @@ -2155,6 +2169,9 @@ importers: '@atproto/lex-document': specifier: workspace:^ version: link:../lex/lex-document + '@jest/globals': + specifier: ^30.0.0 + version: 30.4.1 '@types/express': specifier: ^4.17.13 version: 4.17.13 @@ -2177,14 +2194,14 @@ importers: specifier: ^30.0.0 version: 30.4.2(@types/node@22.19.17)(ts-node@10.8.2) jose: - specifier: ^4.15.4 - version: 4.15.4 + specifier: ^5.0.1 + version: 5.3.0 key-encoder: specifier: ^2.0.3 version: 2.0.3 multiformats: - specifier: ^9.9.0 - version: 9.9.0 + specifier: ^13.0.0 + version: 13.4.2 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -2987,7 +3004,7 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -3022,10 +3039,10 @@ packages: '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) '@babel/helpers': 7.26.9 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -3071,7 +3088,7 @@ packages: resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -3091,7 +3108,7 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.5 dev: false /@babel/helper-compilation-targets@7.26.5: @@ -3161,8 +3178,8 @@ packages: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.29.0 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.10 @@ -3178,7 +3195,7 @@ packages: resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.4 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -3188,8 +3205,8 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color @@ -3198,7 +3215,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/traverse': 7.28.4 - '@babel/types': 7.29.0 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color dev: false @@ -3233,7 +3250,7 @@ packages: dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -3290,7 +3307,7 @@ packages: '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color dev: false @@ -3299,7 +3316,7 @@ packages: resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.28.4 '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -3349,7 +3366,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.29.0 + '@babel/types': 7.28.4 /@babel/helpers@7.29.2: resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} @@ -3362,7 +3379,7 @@ packages: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 chalk: 2.4.2 js-tokens: 4.0.0 dev: false @@ -3379,7 +3396,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.4 /@babel/parser@7.28.5: resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} @@ -4078,7 +4095,7 @@ packages: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/types': 7.29.0 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color dev: false @@ -4230,7 +4247,7 @@ packages: dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.4 - '@babel/types': 7.29.0 + '@babel/types': 7.28.4 /@babel/template@7.28.6: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} @@ -4259,7 +4276,7 @@ packages: resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.5 @@ -8912,13 +8929,13 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.28.5 /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.29.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 /@types/babel__traverse@7.20.7: resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} @@ -9031,11 +9048,11 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest@28.1.8: - resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} + /@types/jest@30.0.0: + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} dependencies: - expect: 28.1.3 - pretty-format: 28.1.3 + expect: 30.4.1 + pretty-format: 30.4.1 dev: true /@types/json5@0.0.29: @@ -9145,13 +9162,8 @@ packages: resolution: {integrity: sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww==} dev: false - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: false - /@types/stack-utils@2.0.3: resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true /@types/uuid@9.0.8: resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} @@ -9983,8 +9995,8 @@ packages: possible-typed-array-names: 1.0.0 dev: true - /await-lock@2.2.2: - resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} + /await-lock@3.0.0: + resolution: {integrity: sha512-eO6fLiSnrJrMdjWMNK8zbVRXPs2TKJg78iKZd9wDpN3na5tcoV6EoeiOlMgk2QaAQ1gIrK1YuMsJHXWqz89tSA==} dev: false /axios@1.6.7: @@ -10067,7 +10079,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.29.0 + '@babel/types': 7.28.5 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 dev: false @@ -10664,7 +10676,7 @@ packages: /cborg@4.5.8: resolution: {integrity: sha512-6/viltD51JklRhq4L7jC3zgy6gryuG5xfZ3kzpE+PravtyeQLeQmCYLREhQH7pWENg5pY4Yu/XCd6a7dKScVlw==} hasBin: true - dev: true + dev: false /chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -12121,7 +12133,7 @@ packages: eslint: '>=6.0.0' dependencies: eslint: 8.57.0 - semver: 7.7.4 + semver: 7.6.3 dev: true /eslint-config-prettier@9.1.0(eslint@8.57.0): @@ -12418,8 +12430,8 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + /eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} dev: false /events-universal@1.0.1: @@ -14159,8 +14171,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.28.4 + '@babel/core': 7.26.9 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -14524,9 +14536,9 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 + '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -14887,17 +14899,12 @@ packages: hasBin: true dev: true - /jose@4.15.4: - resolution: {integrity: sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==} - dev: true - /jose@5.1.3: resolution: {integrity: sha512-GPExOkcMsCLBTi1YetY2LmkoY559fss0+0KVa6kOfb2YFe84nAM7Nm/XzuZozah4iHgmBGrCOHL5/cy670SBRw==} dev: false /jose@5.3.0: resolution: {integrity: sha512-IChe9AtAE79ru084ow8jzkN2lNrG3Ntfiv65Cvj9uOCE2m5LNsdHG+9EbxWxAoWRF9TgDOqLN5jm08++owDVRg==} - dev: false /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -15008,10 +15015,11 @@ packages: engines: {node: '>=0.10.0'} dev: false - /kysely@0.22.0: + /kysely@0.22.0(patch_hash=5k7pdbhmqkb2cevvbr5z6i5uee): resolution: {integrity: sha512-ZE3qWtnqLOalodzfK5QUEcm7AEulhxsPNuKaGFsC3XiqO92vMLm+mAHk/NnbSIOtC4RmGm0nsv700i8KDp1gfQ==} engines: {node: '>=14.0.0'} dev: false + patched: true /kysely@0.23.5: resolution: {integrity: sha512-TH+b56pVXQq0tsyooYLeNfV11j6ih7D50dyN8tkM0e7ndiUH28Nziojiog3qRFlmEj9XePYdZUrNJ2079Qjdow==} @@ -15520,7 +15528,7 @@ packages: resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.29.0 + '@babel/core': 7.26.9 flow-enums-runtime: 0.0.6 hermes-parser: 0.32.0 nullthrows: 1.1.1 @@ -15784,8 +15792,8 @@ packages: resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 + '@babel/core': 7.26.9 + '@babel/generator': 7.28.3 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 flow-enums-runtime: 0.0.6 @@ -15821,10 +15829,10 @@ packages: resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.29.0 + '@babel/core': 7.26.9 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 flow-enums-runtime: 0.0.6 metro: 0.83.3 metro-babel-transformer: 0.83.3 @@ -16150,6 +16158,9 @@ packages: isarray: 1.0.0 dev: false + /multiformats@13.4.2: + resolution: {integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==} + /multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -16600,12 +16611,12 @@ packages: aggregate-error: 3.1.0 dev: true - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} + /p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 + eventemitter3: 5.0.4 + p-timeout: 6.1.4 dev: false /p-timeout@3.2.0: @@ -16614,6 +16625,11 @@ packages: dependencies: p-finally: 1.0.0 + /p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + dev: false + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -17127,7 +17143,7 @@ packages: '@jest/schemas': 28.1.3 ansi-regex: 5.0.1 ansi-styles: 5.2.0 - react-is: 18.3.1 + react-is: 18.2.0 dev: true /pretty-format@29.7.0: @@ -19185,6 +19201,11 @@ packages: dependencies: multiformats: 9.9.0 + /uint8arrays@5.1.1: + resolution: {integrity: sha512-9muQwa4wZG4dKi9gMAIBtnk2Pw87SRpvWTH6lOGm19V2Uqxr4uomUf2PGqPnWc+qs06sN8owUU4jfcoWOcfwVQ==} + dependencies: + multiformats: 13.4.2 + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: diff --git a/services/bsky/Dockerfile b/services/bsky/Dockerfile index 2c528e5b9b5..fc1696c38e5 100644 --- a/services/bsky/Dockerfile +++ b/services/bsky/Dockerfile @@ -9,6 +9,7 @@ RUN corepack install # Move files into the image and install COPY ./*.* ./ +COPY ./patches ./patches COPY ./tsconfig ./tsconfig COPY ./lexicons ./lexicons COPY ./packages/internal ./packages/internal @@ -77,7 +78,7 @@ ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "api.js"] +CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "api.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="Bsky App View" diff --git a/services/bsky/api.js b/services/bsky/api.ts similarity index 83% rename from services/bsky/api.js rename to services/bsky/api.ts index 56c769b9d47..1ca0c252dfc 100644 --- a/services/bsky/api.js +++ b/services/bsky/api.ts @@ -1,8 +1,10 @@ -/* eslint-env node */ /* eslint-disable import/order */ +import { createRequire } from 'node:module' +import assert from 'node:assert' +import cluster from 'node:cluster' +import path from 'node:path' -'use strict' - +const require = createRequire(import.meta.url) const dd = require('dd-trace') dd.tracer @@ -13,7 +15,7 @@ dd.tracer }) .use('express', { hooks: { - request: (span, req) => { + request: (span: any, req: any) => { maintainXrpcResource(span, req) }, }, @@ -22,7 +24,7 @@ dd.tracer // modify tracer in order to track calls to dataplane as a service with proper resource names const DATAPLANE_PREFIX = '/bsky.Service/' const origStartSpan = dd.tracer._tracer.startSpan -dd.tracer._tracer.startSpan = function (name, options) { +dd.tracer._tracer.startSpan = function (name: string, options: any) { if ( name !== 'http.request' || options?.tags?.component !== 'http2' || @@ -40,12 +42,8 @@ dd.tracer._tracer.startSpan = function (name, options) { } // Tracer code above must come before anything else -const assert = require('node:assert') -const cluster = require('node:cluster') -const path = require('node:path') - -const { BskyAppView, ServerConfig } = require('@atproto/bsky') -const { Secp256k1Keypair } = require('@atproto/crypto') +import { BskyAppView, ServerConfig } from '@atproto/bsky' +import { Secp256k1Keypair } from '@atproto/crypto' const main = async () => { const env = getEnv() @@ -66,14 +64,14 @@ const getEnv = () => ({ serviceSigningKey: process.env.BSKY_SERVICE_SIGNING_KEY || undefined, }) -const maybeParseInt = (str) => { +const maybeParseInt = (str: string | undefined) => { if (!str) return const int = parseInt(str, 10) if (isNaN(int)) return return int } -const maintainXrpcResource = (span, req) => { +const maintainXrpcResource = (span: any, req: any) => { // Show actual xrpc method as resource rather than the route pattern if (span && req.originalUrl?.startsWith('/xrpc/')) { span.setTag( @@ -93,7 +91,7 @@ const workerCount = maybeParseInt(process.env.CLUSTER_WORKER_COUNT) if (workerCount) { if (cluster.isPrimary) { console.log(`primary ${process.pid} is running`) - const workers = new Set() + const workers = new Set>() for (let i = 0; i < workerCount; ++i) { workers.add(cluster.fork()) } diff --git a/services/bsky/package.json b/services/bsky/package.json index 8a3eb306ad1..4018bc91ac4 100644 --- a/services/bsky/package.json +++ b/services/bsky/package.json @@ -1,6 +1,7 @@ { "name": "bsky-app-view-service", "private": true, + "type": "module", "packageManager": "pnpm@8.15.9", "dependencies": { "@atproto/bsky": "workspace:^", diff --git a/services/bsync/Dockerfile b/services/bsync/Dockerfile index be48637db8a..e78328d2128 100644 --- a/services/bsync/Dockerfile +++ b/services/bsync/Dockerfile @@ -9,6 +9,7 @@ RUN corepack install # Move files into the image and install COPY ./*.* ./ +COPY ./patches ./patches COPY ./tsconfig ./tsconfig # NOTE bsync's transitive dependencies go here: if that changes, this needs to be updated. @@ -49,7 +50,7 @@ ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--enable-source-maps", "index.js"] +CMD ["node", "--enable-source-maps", "index.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="Bsync" diff --git a/services/bsync/index.js b/services/bsync/index.ts similarity index 69% rename from services/bsync/index.js rename to services/bsync/index.ts index ae5e162e53d..7bf69897aba 100644 --- a/services/bsync/index.js +++ b/services/bsync/index.ts @@ -1,17 +1,11 @@ -/* eslint-env node */ +/* eslint-disable import/order */ +import { createRequire } from 'node:module' -'use strict' - -require('dd-trace') // Only works with commonjs - .init({ logInjection: true }) +const require = createRequire(import.meta.url) +require('dd-trace').init({ logInjection: true }) // Tracer code above must come before anything else -const { - default: BsyncService, - envToCfg, - httpLogger, - readEnv, -} = require('@atproto/bsync') +import { BsyncService, envToCfg, httpLogger, readEnv } from '@atproto/bsync' const main = async () => { const env = readEnv() diff --git a/services/bsync/package.json b/services/bsync/package.json index 2c8cc763581..bb3ebf5c9f4 100644 --- a/services/bsync/package.json +++ b/services/bsync/package.json @@ -1,6 +1,7 @@ { "name": "bsync-service", "private": true, + "type": "module", "packageManager": "pnpm@8.15.9", "dependencies": { "@atproto/bsync": "workspace:^", diff --git a/services/ozone/Dockerfile b/services/ozone/Dockerfile index b26777d8c78..f4b68310795 100644 --- a/services/ozone/Dockerfile +++ b/services/ozone/Dockerfile @@ -9,6 +9,7 @@ RUN corepack install # Move files into the image and install COPY ./*.* ./ +COPY ./patches ./patches COPY ./tsconfig ./tsconfig COPY ./lexicons ./lexicons COPY ./packages/internal ./packages/internal @@ -74,7 +75,7 @@ ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--enable-source-maps", "api.js"] +CMD ["node", "--enable-source-maps", "api.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="Ozone" diff --git a/services/ozone/api.js b/services/ozone/api.ts similarity index 84% rename from services/ozone/api.js rename to services/ozone/api.ts index cc05cfb252b..2054d9190c1 100644 --- a/services/ozone/api.js +++ b/services/ozone/api.ts @@ -1,32 +1,32 @@ -/* eslint-env node */ +/* eslint-disable import/order */ +import { createRequire } from 'node:module' +import path from 'node:path' -'use strict' - -require('dd-trace') // Only works with commonjs +const require = createRequire(import.meta.url) +require('dd-trace') .init({ logInjection: true }) .tracer.use('express', { hooks: { - request: (span, req) => { + request: (span: any, req: any) => { maintainXrpcResource(span, req) }, }, }) // Tracer code above must come before anything else -const path = require('node:path') -const { +import { BunnyInvalidator, CloudfrontInvalidator, MultiImageInvalidator, -} = require('@atproto/aws') -const { +} from '@atproto/aws' +import { Database, OzoneService, envToCfg, envToSecrets, httpLogger, readEnv, -} = require('@atproto/ozone') +} from '@atproto/ozone' const main = async () => { const env = readEnv() @@ -38,7 +38,7 @@ const main = async () => { const bunnyAccessKey = process.env.OZONE_BUNNY_ACCESS_KEY const cfDistributionId = process.env.OZONE_CF_DISTRIBUTION_ID - const imgInvalidators = [] + const imgInvalidators: (BunnyInvalidator | CloudfrontInvalidator)[] = [] if (bunnyAccessKey) { imgInvalidators.push( @@ -89,7 +89,7 @@ const main = async () => { }) } -const maintainXrpcResource = (span, req) => { +const maintainXrpcResource = (span: any, req: any) => { // Show actual xrpc method as resource rather than the route pattern if (span && req.originalUrl?.startsWith('/xrpc/')) { span.setTag( diff --git a/services/ozone/daemon.js b/services/ozone/daemon.ts similarity index 59% rename from services/ozone/daemon.js rename to services/ozone/daemon.ts index faba5f29521..645cbe77fa9 100644 --- a/services/ozone/daemon.js +++ b/services/ozone/daemon.ts @@ -1,16 +1,11 @@ -/* eslint-env node */ +/* eslint-disable import/order */ +import { createRequire } from 'node:module' -'use strict' - -require('dd-trace/init') // Only works with commonjs +const require = createRequire(import.meta.url) +require('dd-trace/init') // Tracer code above must come before anything else -const { - OzoneDaemon, - envToCfg, - envToSecrets, - readEnv, -} = require('@atproto/ozone') +import { OzoneDaemon, envToCfg, envToSecrets, readEnv } from '@atproto/ozone' const main = async () => { const env = readEnv() diff --git a/services/ozone/package.json b/services/ozone/package.json index 6b2d5adb332..4149781a9c9 100644 --- a/services/ozone/package.json +++ b/services/ozone/package.json @@ -1,6 +1,7 @@ { "name": "ozone-service", "private": true, + "type": "module", "packageManager": "pnpm@8.15.9", "dependencies": { "@atproto/aws": "workspace:^", diff --git a/services/pds/Dockerfile b/services/pds/Dockerfile index ceb403306f7..c1cefc3e282 100644 --- a/services/pds/Dockerfile +++ b/services/pds/Dockerfile @@ -10,6 +10,7 @@ RUN corepack install # Move files into the image and install COPY ./*.* ./ +COPY ./patches ./patches COPY ./tsconfig ./tsconfig COPY ./lexicons ./lexicons COPY ./packages/internal ./packages/internal @@ -78,7 +79,7 @@ ENV UV_USE_IO_URING=0 # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "--require=./tracer.js", "index.js"] +CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "--import=./tracer.ts", "index.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="ATP Personal Data Server (PDS)" diff --git a/services/pds/index.js b/services/pds/index.ts similarity index 73% rename from services/pds/index.js rename to services/pds/index.ts index 04dc2e64814..7dee1f12879 100644 --- a/services/pds/index.js +++ b/services/pds/index.ts @@ -1,15 +1,5 @@ -/* eslint-env node */ - -'use strict' - -const { - PDS, - envToCfg, - envToSecrets, - httpLogger, - readEnv, -} = require('@atproto/pds') -const pkg = require('@atproto/pds/package.json') +import { PDS, envToCfg, envToSecrets, httpLogger, readEnv } from '@atproto/pds' +import pkg from '@atproto/pds/package.json' with { type: 'json' } const main = async () => { const env = readEnv() diff --git a/services/pds/package.json b/services/pds/package.json index dffd569c2ca..148fb2c5edb 100644 --- a/services/pds/package.json +++ b/services/pds/package.json @@ -1,6 +1,7 @@ { "name": "plc-service", "private": true, + "type": "module", "packageManager": "pnpm@8.15.9", "dependencies": { "@atproto/pds": "workspace:^", diff --git a/services/pds/run-script.js b/services/pds/run-script.ts similarity index 86% rename from services/pds/run-script.js rename to services/pds/run-script.ts index 600f42db70d..afa14e5cb4a 100644 --- a/services/pds/run-script.js +++ b/services/pds/run-script.ts @@ -1,13 +1,10 @@ -/* eslint-env node */ - -'use strict' -const { +import { AppContext, envToCfg, envToSecrets, readEnv, scripts, -} = require('@atproto/pds') +} from '@atproto/pds' const main = async () => { const env = readEnv() diff --git a/services/pds/tracer.js b/services/pds/tracer.ts similarity index 53% rename from services/pds/tracer.js rename to services/pds/tracer.ts index de770ba7fd5..b25bd484476 100644 --- a/services/pds/tracer.js +++ b/services/pds/tracer.ts @@ -1,17 +1,16 @@ -/* eslint-env node */ /* eslint-disable import/order */ +import { createRequire } from 'node:module' +import path from 'node:path' -'use strict' +import { registerInstrumentations } from '@opentelemetry/instrumentation' +import { BetterSqlite3Instrumentation } from 'opentelemetry-plugin-better-sqlite3' -const { registerInstrumentations } = require('@opentelemetry/instrumentation') -const { - BetterSqlite3Instrumentation, -} = require('opentelemetry-plugin-better-sqlite3') -const { TracerProvider } = require('dd-trace') // Only works with commonjs - .init({ logInjection: true }) - .use('express', { - hooks: { request: maintainXrpcResource }, - }) +const require = createRequire(import.meta.url) +const ddTrace = require('dd-trace') + +const { TracerProvider } = ddTrace.init({ logInjection: true }).use('express', { + hooks: { request: maintainXrpcResource }, +}) const tracer = new TracerProvider() tracer.register() @@ -21,9 +20,7 @@ registerInstrumentations({ instrumentations: [new BetterSqlite3Instrumentation()], }) -const path = require('node:path') - -function maintainXrpcResource(span, req) { +function maintainXrpcResource(span: any, req: any) { // Show actual xrpc method as resource rather than the route pattern if (span && req.originalUrl?.startsWith('/xrpc/')) { span.setTag( diff --git a/tsconfig/base.json b/tsconfig/base.json index b720e5411a4..b782d299706 100644 --- a/tsconfig/base.json +++ b/tsconfig/base.json @@ -19,11 +19,10 @@ "esModuleInterop": true, "isolatedModules": true, "preserveSymlinks": false, - "useDefineForClassFields": true, + "useDefineForClassFields": false, "lib": [], - "moduleResolution": "node", - "ignoreDeprecations": "6.0", + "moduleResolution": "node16", "resolveJsonModule": true, "types": [], @@ -33,8 +32,8 @@ "inlineSources": true, "sourceMap": true, "jsx": "preserve", - "module": "CommonJS", - "target": "ES2020" + "module": "Node20", + "target": "ES2022" }, "typeAcquisition": { "enable": false diff --git a/tsconfig/nodenext.json b/tsconfig/nodenext.json index c541e7be093..bb5abb3c6b7 100644 --- a/tsconfig/nodenext.json +++ b/tsconfig/nodenext.json @@ -4,8 +4,6 @@ "compilerOptions": { "lib": ["ES2023", "ScriptHost"], "types": ["node"], - "module": "Node16", - "target": "ES2023", - "moduleResolution": "Node16" + "target": "ES2023" } } diff --git a/tsconfig/tests.json b/tsconfig/tests.json index 179ac83f91c..06faa663ab7 100644 --- a/tsconfig/tests.json +++ b/tsconfig/tests.json @@ -4,7 +4,8 @@ "compilerOptions": { "types": ["node", "jest"], "lib": ["ES2023", "DOM", "DOM.Iterable"], - "module": "esnext", + "module": "NodeNext", + "ignoreDeprecations": "6.0", "skipLibCheck": true, "noEmit": true } diff --git a/tsconfig/vitest.json b/tsconfig/vitest.json index 2ec63be037b..cd37f379e7f 100644 --- a/tsconfig/vitest.json +++ b/tsconfig/vitest.json @@ -3,7 +3,8 @@ "extends": "./node.json", "compilerOptions": { "lib": ["ES2023", "DOM", "DOM.Iterable"], - "module": "esnext", + "module": "NodeNext", + "ignoreDeprecations": "6.0", "skipLibCheck": true, "noEmit": true } From affb50c040b497a12631df99a6310f8e78cab557 Mon Sep 17 00:00:00 2001 From: Devin Ivy Date: Tue, 19 May 2026 01:20:31 -0400 Subject: [PATCH 44/87] tidy changesets --- .changeset/common-uint8array.md | 5 +++++ .changeset/lex-client-uint8array.md | 5 +++++ .changeset/oauth-client-uint8array.md | 5 +++++ .changeset/typescript-6.md | 4 +--- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 .changeset/common-uint8array.md create mode 100644 .changeset/lex-client-uint8array.md create mode 100644 .changeset/oauth-client-uint8array.md diff --git a/.changeset/common-uint8array.md b/.changeset/common-uint8array.md new file mode 100644 index 00000000000..d188c326f6c --- /dev/null +++ b/.changeset/common-uint8array.md @@ -0,0 +1,5 @@ +--- +'@atproto/common': minor +--- + +`ui8ToArrayBuffer(bytes)` now requires `Uint8Array` (rather than `Uint8Array`, which defaults to ``). Most callers can pass the value through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/lex-client-uint8array.md b/.changeset/lex-client-uint8array.md new file mode 100644 index 00000000000..9eedd681ede --- /dev/null +++ b/.changeset/lex-client-uint8array.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-client': minor +--- + +`BinaryBodyInit` (used for binary request bodies and unknown response payloads) now uses `Uint8Array` rather than `Uint8Array`, matching the buffer-backed (not shared-memory) byte arrays expected by Web APIs. Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/oauth-client-uint8array.md b/.changeset/oauth-client-uint8array.md new file mode 100644 index 00000000000..974d22baace --- /dev/null +++ b/.changeset/oauth-client-uint8array.md @@ -0,0 +1,5 @@ +--- +'@atproto/oauth-client': minor +--- + +`RuntimeImplementation.digest(data, alg)` now takes `data: Uint8Array` rather than `Uint8Array`. This only affects consumers who implement `RuntimeImplementation` themselves rather than using one of the prebuilt impls (`@atproto/oauth-client-browser`, `@atproto/oauth-client-node`, `@atproto/oauth-client-expo`). Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/typescript-6.md b/.changeset/typescript-6.md index 81397876d50..f995a1e70a1 100644 --- a/.changeset/typescript-6.md +++ b/.changeset/typescript-6.md @@ -60,6 +60,4 @@ '@atproto-labs/xrpc-utils': minor --- -Build with TypeScript 6.0. Emitted `.d.ts` files now use TypeScript 6's stricter `Uint8Array` typing in places where Web/Node APIs require buffer-backed (not shared-memory) byte arrays. Consumers compiling against these types on older TypeScript should see no runtime impact, but may need to widen or cast in spots that previously relied on `Uint8Array` defaulting to ``. - -Internal: tsconfig `moduleResolution: "node"` is silenced via `ignoreDeprecations: "6.0"` for now; the proper migration to `node16`/`bundler` resolution is deferred. +Build with TypeScript 6.0. From 5cca6ef76c8673f981b2b5e68c0a7c328339b5bb Mon Sep 17 00:00:00 2001 From: Devin Ivy Date: Tue, 19 May 2026 01:36:10 -0400 Subject: [PATCH 45/87] tidy changesets --- .changeset/common-uint8array.md | 2 +- .changeset/lex-client-uint8array.md | 2 +- .changeset/oauth-client-uint8array.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/common-uint8array.md b/.changeset/common-uint8array.md index d188c326f6c..9758297a84f 100644 --- a/.changeset/common-uint8array.md +++ b/.changeset/common-uint8array.md @@ -2,4 +2,4 @@ '@atproto/common': minor --- -`ui8ToArrayBuffer(bytes)` now requires `Uint8Array` (rather than `Uint8Array`, which defaults to ``). Most callers can pass the value through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. +**BREAKING:** `ui8ToArrayBuffer(bytes)` now requires `Uint8Array` (rather than `Uint8Array`, which defaults to ``). Most callers can pass the value through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/lex-client-uint8array.md b/.changeset/lex-client-uint8array.md index 9eedd681ede..3a36735b038 100644 --- a/.changeset/lex-client-uint8array.md +++ b/.changeset/lex-client-uint8array.md @@ -2,4 +2,4 @@ '@atproto/lex-client': minor --- -`BinaryBodyInit` (used for binary request bodies and unknown response payloads) now uses `Uint8Array` rather than `Uint8Array`, matching the buffer-backed (not shared-memory) byte arrays expected by Web APIs. Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. +**BREAKING:** `BinaryBodyInit` (used for binary request bodies and unknown response payloads) now uses `Uint8Array` rather than `Uint8Array`, matching the buffer-backed (not shared-memory) byte arrays expected by Web APIs. Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/oauth-client-uint8array.md b/.changeset/oauth-client-uint8array.md index 974d22baace..44021cc5343 100644 --- a/.changeset/oauth-client-uint8array.md +++ b/.changeset/oauth-client-uint8array.md @@ -2,4 +2,4 @@ '@atproto/oauth-client': minor --- -`RuntimeImplementation.digest(data, alg)` now takes `data: Uint8Array` rather than `Uint8Array`. This only affects consumers who implement `RuntimeImplementation` themselves rather than using one of the prebuilt impls (`@atproto/oauth-client-browser`, `@atproto/oauth-client-node`, `@atproto/oauth-client-expo`). Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. +**BREAKING:** `RuntimeImplementation.digest(data, alg)` now takes `data: Uint8Array` rather than `Uint8Array`. This only affects consumers who implement `RuntimeImplementation` themselves rather than using one of the prebuilt impls (`@atproto/oauth-client-browser`, `@atproto/oauth-client-node`, `@atproto/oauth-client-expo`). Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. From c633327b1cd65cca504cd600334f7adba0b7d796 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 01:44:34 -0400 Subject: [PATCH 46/87] Version packages (#4952) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/bumpy-kiwis-wish.md | 2 - .changeset/common-uint8array.md | 5 -- .changeset/drop-node-18-20.md | 63 ------------------ .changeset/esm-migration.md | 65 ------------------- .../fetch-node-drop-keepalive-option.md | 5 -- .changeset/lex-cli-js-extensions.md | 6 -- .changeset/lex-client-uint8array.md | 5 -- .changeset/oauth-client-uint8array.md | 5 -- .changeset/typescript-6.md | 63 ------------------ packages/api/CHANGELOG.md | 20 ++++++ packages/api/package.json | 2 +- packages/aws/CHANGELOG.md | 20 ++++++ packages/aws/package.json | 2 +- packages/bsky/CHANGELOG.md | 26 ++++++++ packages/bsky/package.json | 2 +- packages/bsync/CHANGELOG.md | 16 +++++ packages/bsync/package.json | 2 +- packages/common-web/CHANGELOG.md | 19 ++++++ packages/common-web/package.json | 2 +- packages/common/CHANGELOG.md | 21 ++++++ packages/common/package.json | 2 +- packages/crypto/CHANGELOG.md | 12 ++++ packages/crypto/package.json | 2 +- packages/dev-env/CHANGELOG.md | 29 +++++++++ packages/dev-env/package.json | 2 +- packages/did/CHANGELOG.md | 12 ++++ packages/did/package.json | 2 +- packages/identity/CHANGELOG.md | 18 +++++ packages/identity/package.json | 2 +- packages/internal/did-resolver/CHANGELOG.md | 21 ++++++ packages/internal/did-resolver/package.json | 2 +- packages/internal/fetch-node/CHANGELOG.md | 20 ++++++ packages/internal/fetch-node/package.json | 2 +- packages/internal/fetch/CHANGELOG.md | 17 +++++ packages/internal/fetch/package.json | 2 +- .../handle-resolver-node/CHANGELOG.md | 19 ++++++ .../handle-resolver-node/package.json | 2 +- .../internal/handle-resolver/CHANGELOG.md | 19 ++++++ .../internal/handle-resolver/package.json | 2 +- .../internal/identity-resolver/CHANGELOG.md | 18 +++++ .../internal/identity-resolver/package.json | 2 +- packages/internal/pipe/CHANGELOG.md | 12 ++++ packages/internal/pipe/package.json | 2 +- .../CHANGELOG.md | 12 ++++ .../package.json | 2 +- .../internal/simple-store-memory/CHANGELOG.md | 17 +++++ .../internal/simple-store-memory/package.json | 2 +- .../internal/simple-store-redis/CHANGELOG.md | 17 +++++ .../internal/simple-store-redis/package.json | 2 +- packages/internal/simple-store/CHANGELOG.md | 12 ++++ packages/internal/simple-store/package.json | 2 +- packages/internal/xrpc-utils/CHANGELOG.md | 18 +++++ packages/internal/xrpc-utils/package.json | 2 +- packages/lex-cli/CHANGELOG.md | 20 ++++++ packages/lex-cli/package.json | 2 +- packages/lex/lex-builder/CHANGELOG.md | 18 +++++ packages/lex/lex-builder/package.json | 2 +- packages/lex/lex-cbor/CHANGELOG.md | 17 +++++ packages/lex/lex-cbor/package.json | 2 +- packages/lex/lex-client/CHANGELOG.md | 21 ++++++ packages/lex/lex-client/package.json | 2 +- packages/lex/lex-data/CHANGELOG.md | 12 ++++ packages/lex/lex-data/package.json | 2 +- packages/lex/lex-document/CHANGELOG.md | 17 +++++ packages/lex/lex-document/package.json | 2 +- packages/lex/lex-installer/CHANGELOG.md | 23 +++++++ packages/lex/lex-installer/package.json | 2 +- packages/lex/lex-json/CHANGELOG.md | 17 +++++ packages/lex/lex-json/package.json | 2 +- .../lex/lex-password-session/CHANGELOG.md | 18 +++++ .../lex/lex-password-session/package.json | 2 +- packages/lex/lex-resolver/CHANGELOG.md | 24 +++++++ packages/lex/lex-resolver/package.json | 2 +- packages/lex/lex-schema/CHANGELOG.md | 18 +++++ packages/lex/lex-schema/package.json | 2 +- packages/lex/lex-server/CHANGELOG.md | 24 +++++++ packages/lex/lex-server/package.json | 2 +- packages/lex/lex/CHANGELOG.md | 22 +++++++ packages/lex/lex/package.json | 2 +- packages/lexicon-resolver/CHANGELOG.md | 22 +++++++ packages/lexicon-resolver/package.json | 2 +- packages/lexicon/CHANGELOG.md | 18 +++++ packages/lexicon/package.json | 2 +- packages/oauth/jwk-jose/CHANGELOG.md | 17 +++++ packages/oauth/jwk-jose/package.json | 2 +- packages/oauth/jwk-webcrypto/CHANGELOG.md | 18 +++++ packages/oauth/jwk-webcrypto/package.json | 2 +- packages/oauth/jwk/CHANGELOG.md | 12 ++++ packages/oauth/jwk/package.json | 2 +- .../oauth-client-browser-example/CHANGELOG.md | 12 ++++ .../oauth-client-browser-example/package.json | 2 +- .../oauth/oauth-client-browser/CHANGELOG.md | 24 +++++++ .../oauth/oauth-client-browser/package.json | 2 +- packages/oauth/oauth-client-expo/CHANGELOG.md | 19 ++++++ packages/oauth/oauth-client-expo/package.json | 2 +- packages/oauth/oauth-client-node/CHANGELOG.md | 25 +++++++ packages/oauth/oauth-client-node/package.json | 2 +- packages/oauth/oauth-client/CHANGELOG.md | 28 ++++++++ packages/oauth/oauth-client/package.json | 2 +- .../oauth/oauth-provider-api/CHANGELOG.md | 18 +++++ .../oauth/oauth-provider-api/package.json | 2 +- packages/oauth/oauth-provider-ui/CHANGELOG.md | 12 ++++ packages/oauth/oauth-provider-ui/package.json | 2 +- packages/oauth/oauth-provider/CHANGELOG.md | 32 +++++++++ packages/oauth/oauth-provider/package.json | 2 +- packages/oauth/oauth-scopes/CHANGELOG.md | 18 +++++ packages/oauth/oauth-scopes/package.json | 2 +- packages/oauth/oauth-types/CHANGELOG.md | 18 +++++ packages/oauth/oauth-types/package.json | 2 +- packages/ozone/CHANGELOG.md | 23 +++++++ packages/ozone/package.json | 2 +- packages/pds/CHANGELOG.md | 33 ++++++++++ packages/pds/package.json | 2 +- packages/repo/CHANGELOG.md | 22 +++++++ packages/repo/package.json | 2 +- packages/sync/CHANGELOG.md | 22 +++++++ packages/sync/package.json | 2 +- packages/syntax/CHANGELOG.md | 12 ++++ packages/syntax/package.json | 2 +- packages/tap/CHANGELOG.md | 20 ++++++ packages/tap/package.json | 2 +- packages/ws-client/CHANGELOG.md | 17 +++++ packages/ws-client/package.json | 2 +- packages/xrpc-server/CHANGELOG.md | 26 ++++++++ packages/xrpc-server/package.json | 2 +- packages/xrpc/CHANGELOG.md | 17 +++++ packages/xrpc/package.json | 2 +- 127 files changed, 1190 insertions(+), 278 deletions(-) delete mode 100644 .changeset/bumpy-kiwis-wish.md delete mode 100644 .changeset/common-uint8array.md delete mode 100644 .changeset/drop-node-18-20.md delete mode 100644 .changeset/esm-migration.md delete mode 100644 .changeset/fetch-node-drop-keepalive-option.md delete mode 100644 .changeset/lex-cli-js-extensions.md delete mode 100644 .changeset/lex-client-uint8array.md delete mode 100644 .changeset/oauth-client-uint8array.md delete mode 100644 .changeset/typescript-6.md diff --git a/.changeset/bumpy-kiwis-wish.md b/.changeset/bumpy-kiwis-wish.md deleted file mode 100644 index a845151cc84..00000000000 --- a/.changeset/bumpy-kiwis-wish.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/common-uint8array.md b/.changeset/common-uint8array.md deleted file mode 100644 index 9758297a84f..00000000000 --- a/.changeset/common-uint8array.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/common': minor ---- - -**BREAKING:** `ui8ToArrayBuffer(bytes)` now requires `Uint8Array` (rather than `Uint8Array`, which defaults to ``). Most callers can pass the value through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/drop-node-18-20.md b/.changeset/drop-node-18-20.md deleted file mode 100644 index ab2d96024ba..00000000000 --- a/.changeset/drop-node-18-20.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -'@atproto/bsky': patch -'@atproto/bsync': patch -'@atproto/ozone': patch -'@atproto/pds': patch -'@atproto/api': minor -'@atproto/aws': minor -'@atproto/common': minor -'@atproto/common-web': minor -'@atproto/crypto': minor -'@atproto/dev-env': minor -'@atproto/did': minor -'@atproto/identity': minor -'@atproto/jwk': minor -'@atproto/jwk-jose': minor -'@atproto/jwk-webcrypto': minor -'@atproto/lex': minor -'@atproto/lex-builder': minor -'@atproto/lex-cbor': minor -'@atproto/lex-cli': minor -'@atproto/lex-client': minor -'@atproto/lex-data': minor -'@atproto/lex-document': minor -'@atproto/lex-installer': minor -'@atproto/lex-json': minor -'@atproto/lex-password-session': minor -'@atproto/lex-resolver': minor -'@atproto/lex-schema': minor -'@atproto/lex-server': minor -'@atproto/lexicon': minor -'@atproto/lexicon-resolver': minor -'@atproto/oauth-client': minor -'@atproto/oauth-client-browser': minor -'@atproto/oauth-client-browser-example': minor -'@atproto/oauth-client-expo': minor -'@atproto/oauth-client-node': minor -'@atproto/oauth-provider': minor -'@atproto/oauth-provider-api': minor -'@atproto/oauth-provider-ui': minor -'@atproto/oauth-scopes': minor -'@atproto/oauth-types': minor -'@atproto/repo': minor -'@atproto/sync': minor -'@atproto/syntax': minor -'@atproto/tap': minor -'@atproto/ws-client': minor -'@atproto/xrpc': minor -'@atproto/xrpc-server': minor -'@atproto-labs/did-resolver': minor -'@atproto-labs/fetch': minor -'@atproto-labs/fetch-node': minor -'@atproto-labs/handle-resolver': minor -'@atproto-labs/handle-resolver-node': minor -'@atproto-labs/identity-resolver': minor -'@atproto-labs/pipe': minor -'@atproto-labs/rollup-plugin-bundle-manifest': minor -'@atproto-labs/simple-store': minor -'@atproto-labs/simple-store-memory': minor -'@atproto-labs/simple-store-redis': minor -'@atproto-labs/xrpc-utils': minor ---- - -**BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. diff --git a/.changeset/esm-migration.md b/.changeset/esm-migration.md deleted file mode 100644 index 644d81ea940..00000000000 --- a/.changeset/esm-migration.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -'@atproto/bsky': patch -'@atproto/bsync': patch -'@atproto/ozone': patch -'@atproto/pds': patch -'@atproto/api': minor -'@atproto/aws': minor -'@atproto/common': minor -'@atproto/common-web': minor -'@atproto/crypto': minor -'@atproto/dev-env': minor -'@atproto/did': minor -'@atproto/identity': minor -'@atproto/jwk': minor -'@atproto/jwk-jose': minor -'@atproto/jwk-webcrypto': minor -'@atproto/lex': minor -'@atproto/lex-builder': minor -'@atproto/lex-cbor': minor -'@atproto/lex-cli': minor -'@atproto/lex-client': minor -'@atproto/lex-data': minor -'@atproto/lex-document': minor -'@atproto/lex-installer': minor -'@atproto/lex-json': minor -'@atproto/lex-password-session': minor -'@atproto/lex-resolver': minor -'@atproto/lex-schema': minor -'@atproto/lex-server': minor -'@atproto/lexicon': minor -'@atproto/lexicon-resolver': minor -'@atproto/oauth-client': minor -'@atproto/oauth-client-browser': minor -'@atproto/oauth-client-browser-example': minor -'@atproto/oauth-client-expo': minor -'@atproto/oauth-client-node': minor -'@atproto/oauth-provider': minor -'@atproto/oauth-provider-api': minor -'@atproto/oauth-provider-ui': minor -'@atproto/oauth-scopes': minor -'@atproto/oauth-types': minor -'@atproto/repo': minor -'@atproto/sync': minor -'@atproto/syntax': minor -'@atproto/tap': minor -'@atproto/ws-client': minor -'@atproto/xrpc': minor -'@atproto/xrpc-server': minor -'@atproto-labs/did-resolver': minor -'@atproto-labs/fetch': minor -'@atproto-labs/fetch-node': minor -'@atproto-labs/handle-resolver': minor -'@atproto-labs/handle-resolver-node': minor -'@atproto-labs/identity-resolver': minor -'@atproto-labs/pipe': minor -'@atproto-labs/rollup-plugin-bundle-manifest': minor -'@atproto-labs/simple-store': minor -'@atproto-labs/simple-store-memory': minor -'@atproto-labs/simple-store-redis': minor -'@atproto-labs/xrpc-utils': minor ---- - -**BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. - -Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. diff --git a/.changeset/fetch-node-drop-keepalive-option.md b/.changeset/fetch-node-drop-keepalive-option.md deleted file mode 100644 index d73fb0ec5de..00000000000 --- a/.changeset/fetch-node-drop-keepalive-option.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto-labs/fetch-node': minor ---- - -**BREAKING:** `unicastFetchWrap` and `safeFetchWrap` no longer accept `dangerouslyForceKeepAliveAgent` — on Node.js 22+ the keep-alive dispatcher is always used via `new Request(input, { dispatcher })`, so the option was a no-op. diff --git a/.changeset/lex-cli-js-extensions.md b/.changeset/lex-cli-js-extensions.md deleted file mode 100644 index 66141c24404..00000000000 --- a/.changeset/lex-cli-js-extensions.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@atproto/lex-cli': minor ---- - -**BREAKING:** Generated lexicon code now uses `.js` extensions on relative imports (e.g. `from '../lexicons.js'` instead of `from '../lexicons'`), enabling compatibility with Node16/NodeNext module resolution under ESM. Consumers using classic `node` or `bundler` resolution should be unaffected. - diff --git a/.changeset/lex-client-uint8array.md b/.changeset/lex-client-uint8array.md deleted file mode 100644 index 3a36735b038..00000000000 --- a/.changeset/lex-client-uint8array.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lex-client': minor ---- - -**BREAKING:** `BinaryBodyInit` (used for binary request bodies and unknown response payloads) now uses `Uint8Array` rather than `Uint8Array`, matching the buffer-backed (not shared-memory) byte arrays expected by Web APIs. Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/oauth-client-uint8array.md b/.changeset/oauth-client-uint8array.md deleted file mode 100644 index 44021cc5343..00000000000 --- a/.changeset/oauth-client-uint8array.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/oauth-client': minor ---- - -**BREAKING:** `RuntimeImplementation.digest(data, alg)` now takes `data: Uint8Array` rather than `Uint8Array`. This only affects consumers who implement `RuntimeImplementation` themselves rather than using one of the prebuilt impls (`@atproto/oauth-client-browser`, `@atproto/oauth-client-node`, `@atproto/oauth-client-expo`). Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. diff --git a/.changeset/typescript-6.md b/.changeset/typescript-6.md deleted file mode 100644 index f995a1e70a1..00000000000 --- a/.changeset/typescript-6.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -'@atproto/bsky': patch -'@atproto/bsync': patch -'@atproto/ozone': patch -'@atproto/pds': patch -'@atproto/api': minor -'@atproto/aws': minor -'@atproto/common': minor -'@atproto/common-web': minor -'@atproto/crypto': minor -'@atproto/dev-env': minor -'@atproto/did': minor -'@atproto/identity': minor -'@atproto/jwk': minor -'@atproto/jwk-jose': minor -'@atproto/jwk-webcrypto': minor -'@atproto/lex': minor -'@atproto/lex-builder': minor -'@atproto/lex-cbor': minor -'@atproto/lex-cli': minor -'@atproto/lex-client': minor -'@atproto/lex-data': minor -'@atproto/lex-document': minor -'@atproto/lex-installer': minor -'@atproto/lex-json': minor -'@atproto/lex-password-session': minor -'@atproto/lex-resolver': minor -'@atproto/lex-schema': minor -'@atproto/lex-server': minor -'@atproto/lexicon': minor -'@atproto/lexicon-resolver': minor -'@atproto/oauth-client': minor -'@atproto/oauth-client-browser': minor -'@atproto/oauth-client-browser-example': minor -'@atproto/oauth-client-expo': minor -'@atproto/oauth-client-node': minor -'@atproto/oauth-provider': minor -'@atproto/oauth-provider-api': minor -'@atproto/oauth-provider-ui': minor -'@atproto/oauth-scopes': minor -'@atproto/oauth-types': minor -'@atproto/repo': minor -'@atproto/sync': minor -'@atproto/syntax': minor -'@atproto/tap': minor -'@atproto/ws-client': minor -'@atproto/xrpc': minor -'@atproto/xrpc-server': minor -'@atproto-labs/did-resolver': minor -'@atproto-labs/fetch': minor -'@atproto-labs/fetch-node': minor -'@atproto-labs/handle-resolver': minor -'@atproto-labs/handle-resolver-node': minor -'@atproto-labs/identity-resolver': minor -'@atproto-labs/pipe': minor -'@atproto-labs/rollup-plugin-bundle-manifest': minor -'@atproto-labs/simple-store': minor -'@atproto-labs/simple-store-memory': minor -'@atproto-labs/simple-store-redis': minor -'@atproto-labs/xrpc-utils': minor ---- - -Build with TypeScript 6.0. diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md index 5b1ad4abb49..ca2e8c7dc54 100644 --- a/packages/api/CHANGELOG.md +++ b/packages/api/CHANGELOG.md @@ -1,5 +1,25 @@ # @atproto/api +## 0.20.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common-web@0.5.0 + - @atproto/lexicon@0.7.0 + - @atproto/syntax@0.6.0 + - @atproto/xrpc@0.8.0 + ## 0.19.19 ### Patch Changes diff --git a/packages/api/package.json b/packages/api/package.json index a5348a35b53..c8d036f0ee9 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/api", - "version": "0.19.19", + "version": "0.20.0", "engines": { "node": ">=22" }, diff --git a/packages/aws/CHANGELOG.md b/packages/aws/CHANGELOG.md index fccc2270dcf..2a41c42bd50 100644 --- a/packages/aws/CHANGELOG.md +++ b/packages/aws/CHANGELOG.md @@ -1,5 +1,25 @@ # @atproto/aws +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/common-web@0.5.0 + - @atproto/crypto@0.5.0 + - @atproto/repo@0.10.0 + ## 0.2.32 ### Patch Changes diff --git a/packages/aws/package.json b/packages/aws/package.json index 76e27c1445f..3390e0e978f 100644 --- a/packages/aws/package.json +++ b/packages/aws/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/aws", - "version": "0.2.32", + "version": "0.3.0", "license": "MIT", "description": "Shared AWS cloud API helpers for atproto services", "keywords": [ diff --git a/packages/bsky/CHANGELOG.md b/packages/bsky/CHANGELOG.md index c1e46e91f42..2e0dc8ab87e 100644 --- a/packages/bsky/CHANGELOG.md +++ b/packages/bsky/CHANGELOG.md @@ -1,5 +1,31 @@ # @atproto/bsky +## 0.0.231 + +### Patch Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/api@0.20.0 + - @atproto/crypto@0.5.0 + - @atproto/did@0.4.0 + - @atproto/identity@0.5.0 + - @atproto/lex@0.1.0 + - @atproto/repo@0.10.0 + - @atproto/sync@0.3.0 + - @atproto/syntax@0.6.0 + - @atproto/xrpc-server@0.11.0 + - @atproto-labs/fetch-node@0.3.0 + - @atproto-labs/xrpc-utils@0.1.0 + ## 0.0.230 ### Patch Changes diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 3bf7b7c0524..154b4273395 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsky", - "version": "0.0.230", + "version": "0.0.231", "license": "MIT", "description": "Reference implementation of app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/bsync/CHANGELOG.md b/packages/bsync/CHANGELOG.md index abae5f9d3ae..879e8fde8f1 100644 --- a/packages/bsync/CHANGELOG.md +++ b/packages/bsync/CHANGELOG.md @@ -1,5 +1,21 @@ # @atproto/bsync +## 0.0.26 + +### Patch Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/syntax@0.6.0 + ## 0.0.25 ### Patch Changes diff --git a/packages/bsync/package.json b/packages/bsync/package.json index f2e6de4f263..77c6e1f00f6 100644 --- a/packages/bsync/package.json +++ b/packages/bsync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/bsync", - "version": "0.0.25", + "version": "0.0.26", "license": "MIT", "description": "Sychronizing service for app.bsky App View (Bluesky API)", "keywords": [ diff --git a/packages/common-web/CHANGELOG.md b/packages/common-web/CHANGELOG.md index 4828af402ce..0fc7c5eb2eb 100644 --- a/packages/common-web/CHANGELOG.md +++ b/packages/common-web/CHANGELOG.md @@ -1,5 +1,24 @@ # @atproto/common-web +## 0.5.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-data@0.1.0 + - @atproto/lex-json@0.1.0 + - @atproto/syntax@0.6.0 + ## 0.4.21 ### Patch Changes diff --git a/packages/common-web/package.json b/packages/common-web/package.json index a29bc4cacc2..52431e016ce 100644 --- a/packages/common-web/package.json +++ b/packages/common-web/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/common-web", - "version": "0.4.21", + "version": "0.5.0", "engines": { "node": ">=22" }, diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index acb67a7ffdb..2bce7e0aeda 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -1,5 +1,26 @@ # @atproto/common +## 0.6.0 + +### Minor Changes + +- [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** `ui8ToArrayBuffer(bytes)` now requires `Uint8Array` (rather than `Uint8Array`, which defaults to ``). Most callers can pass the value through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common-web@0.5.0 + - @atproto/lex-cbor@0.1.0 + - @atproto/lex-data@0.1.0 + ## 0.5.16 ### Patch Changes diff --git a/packages/common/package.json b/packages/common/package.json index 997004c5c2c..ad42d087229 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/common", - "version": "0.5.16", + "version": "0.6.0", "license": "MIT", "description": "Shared web-platform-friendly code for atproto libraries", "keywords": [ diff --git a/packages/crypto/CHANGELOG.md b/packages/crypto/CHANGELOG.md index 5e403c69f16..ccfe0a7b77d 100644 --- a/packages/crypto/CHANGELOG.md +++ b/packages/crypto/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/crypto +## 0.5.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.4.5 ### Patch Changes diff --git a/packages/crypto/package.json b/packages/crypto/package.json index 3d92d0a98e8..ab49aded7a4 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/crypto", - "version": "0.4.5", + "version": "0.5.0", "license": "MIT", "description": "Library for cryptographic keys and signing in atproto", "keywords": [ diff --git a/packages/dev-env/CHANGELOG.md b/packages/dev-env/CHANGELOG.md index 8d2fc68fe82..d41cbba421a 100644 --- a/packages/dev-env/CHANGELOG.md +++ b/packages/dev-env/CHANGELOG.md @@ -1,5 +1,34 @@ # @atproto/dev-env +## 0.5.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/bsky@0.0.231 + - @atproto/bsync@0.0.26 + - @atproto/ozone@0.1.175 + - @atproto/pds@0.4.224 + - @atproto/api@0.20.0 + - @atproto/common-web@0.5.0 + - @atproto/crypto@0.5.0 + - @atproto/identity@0.5.0 + - @atproto/lex@0.1.0 + - @atproto/lexicon@0.7.0 + - @atproto/sync@0.3.0 + - @atproto/syntax@0.6.0 + - @atproto/xrpc-server@0.11.0 + ## 0.4.9 ### Patch Changes diff --git a/packages/dev-env/package.json b/packages/dev-env/package.json index 280236916c6..8237f6dd901 100644 --- a/packages/dev-env/package.json +++ b/packages/dev-env/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/dev-env", - "version": "0.4.9", + "version": "0.5.0", "license": "MIT", "description": "Local development environment helper for atproto development", "keywords": [ diff --git a/packages/did/CHANGELOG.md b/packages/did/CHANGELOG.md index 3ea6459bcc5..3458c74f771 100644 --- a/packages/did/CHANGELOG.md +++ b/packages/did/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/did +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.3.0 ### Minor Changes diff --git a/packages/did/package.json b/packages/did/package.json index a1e35692078..920b358342e 100644 --- a/packages/did/package.json +++ b/packages/did/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/did", - "version": "0.3.0", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/identity/CHANGELOG.md b/packages/identity/CHANGELOG.md index 50bb2b20309..9321f993fcf 100644 --- a/packages/identity/CHANGELOG.md +++ b/packages/identity/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/identity +## 0.5.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common-web@0.5.0 + - @atproto/crypto@0.5.0 + ## 0.4.12 ### Patch Changes diff --git a/packages/identity/package.json b/packages/identity/package.json index 6eb2cc9916c..4b9b0c5d909 100644 --- a/packages/identity/package.json +++ b/packages/identity/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/identity", - "version": "0.4.12", + "version": "0.5.0", "license": "MIT", "description": "Library for decentralized identities in atproto using DIDs and handles", "keywords": [ diff --git a/packages/internal/did-resolver/CHANGELOG.md b/packages/internal/did-resolver/CHANGELOG.md index db18f503362..278c89303a1 100644 --- a/packages/internal/did-resolver/CHANGELOG.md +++ b/packages/internal/did-resolver/CHANGELOG.md @@ -1,5 +1,26 @@ # @atproto-labs/did-resolver +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto-labs/fetch@0.3.0 + - @atproto-labs/pipe@0.2.0 + - @atproto-labs/simple-store@0.4.0 + - @atproto-labs/simple-store-memory@0.2.0 + ## 0.2.6 ### Patch Changes diff --git a/packages/internal/did-resolver/package.json b/packages/internal/did-resolver/package.json index 709cecbadb1..9000ce1eea7 100644 --- a/packages/internal/did-resolver/package.json +++ b/packages/internal/did-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/did-resolver", - "version": "0.2.6", + "version": "0.3.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/fetch-node/CHANGELOG.md b/packages/internal/fetch-node/CHANGELOG.md index 9eec3dd503d..dc9f6e4cec3 100644 --- a/packages/internal/fetch-node/CHANGELOG.md +++ b/packages/internal/fetch-node/CHANGELOG.md @@ -1,5 +1,25 @@ # @atproto-labs/fetch-node +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** `unicastFetchWrap` and `safeFetchWrap` no longer accept `dangerouslyForceKeepAliveAgent` — on Node.js 22+ the keep-alive dispatcher is always used via `new Request(input, { dispatcher })`, so the option was a no-op. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto-labs/fetch@0.3.0 + - @atproto-labs/pipe@0.2.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/internal/fetch-node/package.json b/packages/internal/fetch-node/package.json index 4c31c96881d..853c801c7dc 100644 --- a/packages/internal/fetch-node/package.json +++ b/packages/internal/fetch-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/fetch-node", - "version": "0.2.0", + "version": "0.3.0", "license": "MIT", "description": "SSRF protection for fetch() in Node.js", "keywords": [ diff --git a/packages/internal/fetch/CHANGELOG.md b/packages/internal/fetch/CHANGELOG.md index 470f828a0fa..dd75473fe33 100644 --- a/packages/internal/fetch/CHANGELOG.md +++ b/packages/internal/fetch/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto-labs/fetch +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto-labs/pipe@0.2.0 + ## 0.2.3 ### Patch Changes diff --git a/packages/internal/fetch/package.json b/packages/internal/fetch/package.json index 7c16730518a..bbb6e4362a3 100644 --- a/packages/internal/fetch/package.json +++ b/packages/internal/fetch/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/fetch", - "version": "0.2.3", + "version": "0.3.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/handle-resolver-node/CHANGELOG.md b/packages/internal/handle-resolver-node/CHANGELOG.md index 64528eec645..1a9d98253cf 100644 --- a/packages/internal/handle-resolver-node/CHANGELOG.md +++ b/packages/internal/handle-resolver-node/CHANGELOG.md @@ -1,5 +1,24 @@ # @atproto-labs/handle-resolver-node +## 0.2.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto-labs/fetch-node@0.3.0 + - @atproto-labs/handle-resolver@0.4.0 + ## 0.1.25 ### Patch Changes diff --git a/packages/internal/handle-resolver-node/package.json b/packages/internal/handle-resolver-node/package.json index 0d4f29da8c9..54ea1cc1b64 100644 --- a/packages/internal/handle-resolver-node/package.json +++ b/packages/internal/handle-resolver-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/handle-resolver-node", - "version": "0.1.25", + "version": "0.2.0", "license": "MIT", "description": "Node specific ATProto handle to DID resolver", "keywords": [ diff --git a/packages/internal/handle-resolver/CHANGELOG.md b/packages/internal/handle-resolver/CHANGELOG.md index 6a63dd121c1..210f903d6fa 100644 --- a/packages/internal/handle-resolver/CHANGELOG.md +++ b/packages/internal/handle-resolver/CHANGELOG.md @@ -1,5 +1,24 @@ # @atproto-labs/handle-resolver +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto-labs/simple-store@0.4.0 + - @atproto-labs/simple-store-memory@0.2.0 + ## 0.3.6 ### Patch Changes diff --git a/packages/internal/handle-resolver/package.json b/packages/internal/handle-resolver/package.json index 1b61ea8722e..50e8ecdb9dc 100644 --- a/packages/internal/handle-resolver/package.json +++ b/packages/internal/handle-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/handle-resolver", - "version": "0.3.6", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/identity-resolver/CHANGELOG.md b/packages/internal/identity-resolver/CHANGELOG.md index b7b22b16d91..a0cd38b556d 100644 --- a/packages/internal/identity-resolver/CHANGELOG.md +++ b/packages/internal/identity-resolver/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto-labs/identity-resolver +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto-labs/did-resolver@0.3.0 + - @atproto-labs/handle-resolver@0.4.0 + ## 0.3.6 ### Patch Changes diff --git a/packages/internal/identity-resolver/package.json b/packages/internal/identity-resolver/package.json index 70f806a69cd..60737bec953 100644 --- a/packages/internal/identity-resolver/package.json +++ b/packages/internal/identity-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/identity-resolver", - "version": "0.3.6", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/pipe/CHANGELOG.md b/packages/internal/pipe/CHANGELOG.md index 27486fbd822..73d01e88230 100644 --- a/packages/internal/pipe/CHANGELOG.md +++ b/packages/internal/pipe/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto-labs/pipe +## 0.2.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.1.1 ### Patch Changes diff --git a/packages/internal/pipe/package.json b/packages/internal/pipe/package.json index 2c1b6a6492a..b1476b8afad 100644 --- a/packages/internal/pipe/package.json +++ b/packages/internal/pipe/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/pipe", - "version": "0.1.1", + "version": "0.2.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/rollup-plugin-bundle-manifest/CHANGELOG.md b/packages/internal/rollup-plugin-bundle-manifest/CHANGELOG.md index 441c1f0447d..9f05f115a23 100644 --- a/packages/internal/rollup-plugin-bundle-manifest/CHANGELOG.md +++ b/packages/internal/rollup-plugin-bundle-manifest/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto-labs/rollup-plugin-bundle-manifest +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.2.0 ### Minor Changes diff --git a/packages/internal/rollup-plugin-bundle-manifest/package.json b/packages/internal/rollup-plugin-bundle-manifest/package.json index f6cea39bc68..31a1ff23e97 100644 --- a/packages/internal/rollup-plugin-bundle-manifest/package.json +++ b/packages/internal/rollup-plugin-bundle-manifest/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/rollup-plugin-bundle-manifest", - "version": "0.2.0", + "version": "0.3.0", "license": "MIT", "description": "Library for generating a manifest of bundled files from a Rollup build", "keywords": [ diff --git a/packages/internal/simple-store-memory/CHANGELOG.md b/packages/internal/simple-store-memory/CHANGELOG.md index 7216c39d137..fc00dcf386e 100644 --- a/packages/internal/simple-store-memory/CHANGELOG.md +++ b/packages/internal/simple-store-memory/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto-labs/simple-store-memory +## 0.2.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto-labs/simple-store@0.4.0 + ## 0.1.4 ### Patch Changes diff --git a/packages/internal/simple-store-memory/package.json b/packages/internal/simple-store-memory/package.json index 519e93d9ba4..a21caf1a8a7 100644 --- a/packages/internal/simple-store-memory/package.json +++ b/packages/internal/simple-store-memory/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/simple-store-memory", - "version": "0.1.4", + "version": "0.2.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/simple-store-redis/CHANGELOG.md b/packages/internal/simple-store-redis/CHANGELOG.md index 83ae8cda0fe..023635a306b 100644 --- a/packages/internal/simple-store-redis/CHANGELOG.md +++ b/packages/internal/simple-store-redis/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto-labs/simple-store-redis +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto-labs/simple-store@0.4.0 + ## 0.0.1 ### Patch Changes diff --git a/packages/internal/simple-store-redis/package.json b/packages/internal/simple-store-redis/package.json index 7bebde39c29..74c6a339fd5 100644 --- a/packages/internal/simple-store-redis/package.json +++ b/packages/internal/simple-store-redis/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/simple-store-redis", - "version": "0.0.1", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/simple-store/CHANGELOG.md b/packages/internal/simple-store/CHANGELOG.md index 68202dd3907..da7967aa511 100644 --- a/packages/internal/simple-store/CHANGELOG.md +++ b/packages/internal/simple-store/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto-labs/simple-store +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.3.0 ### Minor Changes diff --git a/packages/internal/simple-store/package.json b/packages/internal/simple-store/package.json index 38c5a307798..a459f6c58d9 100644 --- a/packages/internal/simple-store/package.json +++ b/packages/internal/simple-store/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/simple-store", - "version": "0.3.0", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/internal/xrpc-utils/CHANGELOG.md b/packages/internal/xrpc-utils/CHANGELOG.md index 59ecbb10bf6..fd42d322d41 100644 --- a/packages/internal/xrpc-utils/CHANGELOG.md +++ b/packages/internal/xrpc-utils/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto-labs/xrpc-utils +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/xrpc@0.8.0 + - @atproto/xrpc-server@0.11.0 + ## 0.0.24 ### Patch Changes diff --git a/packages/internal/xrpc-utils/package.json b/packages/internal/xrpc-utils/package.json index a975fb73b00..b6f318776e3 100644 --- a/packages/internal/xrpc-utils/package.json +++ b/packages/internal/xrpc-utils/package.json @@ -1,6 +1,6 @@ { "name": "@atproto-labs/xrpc-utils", - "version": "0.0.24", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex-cli/CHANGELOG.md b/packages/lex-cli/CHANGELOG.md index 7ff12bface2..54f6434d3a5 100644 --- a/packages/lex-cli/CHANGELOG.md +++ b/packages/lex-cli/CHANGELOG.md @@ -1,5 +1,25 @@ # @atproto/lex-cli +## 0.10.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Generated lexicon code now uses `.js` extensions on relative imports (e.g. `from '../lexicons.js'` instead of `from '../lexicons'`), enabling compatibility with Node16/NodeNext module resolution under ESM. Consumers using classic `node` or `bundler` resolution should be unaffected. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lexicon@0.7.0 + - @atproto/syntax@0.6.0 + ## 0.9.9 ### Patch Changes diff --git a/packages/lex-cli/package.json b/packages/lex-cli/package.json index 752ee5d7755..331b0fae38a 100644 --- a/packages/lex-cli/package.json +++ b/packages/lex-cli/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-cli", - "version": "0.9.9", + "version": "0.10.0", "license": "MIT", "description": "TypeScript codegen tool for atproto Lexicon schemas", "keywords": [ diff --git a/packages/lex/lex-builder/CHANGELOG.md b/packages/lex/lex-builder/CHANGELOG.md index 705f41c48ef..a1ab9596424 100644 --- a/packages/lex/lex-builder/CHANGELOG.md +++ b/packages/lex/lex-builder/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/lex-builder +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-document@0.1.0 + - @atproto/lex-schema@0.1.0 + ## 0.0.23 ### Patch Changes diff --git a/packages/lex/lex-builder/package.json b/packages/lex/lex-builder/package.json index d284f9ca01a..76428d5cbc9 100644 --- a/packages/lex/lex-builder/package.json +++ b/packages/lex/lex-builder/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-builder", - "version": "0.0.23", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-cbor/CHANGELOG.md b/packages/lex/lex-cbor/CHANGELOG.md index f1c9dabf023..e23c2aa74ba 100644 --- a/packages/lex/lex-cbor/CHANGELOG.md +++ b/packages/lex/lex-cbor/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/lex-cbor +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-data@0.1.0 + ## 0.0.16 ### Patch Changes diff --git a/packages/lex/lex-cbor/package.json b/packages/lex/lex-cbor/package.json index e458a06a2f2..a5e773ceeae 100644 --- a/packages/lex/lex-cbor/package.json +++ b/packages/lex/lex-cbor/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-cbor", - "version": "0.0.16", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-client/CHANGELOG.md b/packages/lex/lex-client/CHANGELOG.md index f6cca2b8d22..209b43d5f10 100644 --- a/packages/lex/lex-client/CHANGELOG.md +++ b/packages/lex/lex-client/CHANGELOG.md @@ -1,5 +1,26 @@ # @atproto/lex-client +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** `BinaryBodyInit` (used for binary request bodies and unknown response payloads) now uses `Uint8Array` rather than `Uint8Array`, matching the buffer-backed (not shared-memory) byte arrays expected by Web APIs. Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-data@0.1.0 + - @atproto/lex-json@0.1.0 + - @atproto/lex-schema@0.1.0 + ## 0.0.22 ### Patch Changes diff --git a/packages/lex/lex-client/package.json b/packages/lex/lex-client/package.json index f35ab90d076..17763d8852f 100644 --- a/packages/lex/lex-client/package.json +++ b/packages/lex/lex-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-client", - "version": "0.0.22", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-data/CHANGELOG.md b/packages/lex/lex-data/CHANGELOG.md index 304d50fb73f..afa6bc75574 100644 --- a/packages/lex/lex-data/CHANGELOG.md +++ b/packages/lex/lex-data/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/lex-data +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.0.15 ### Patch Changes diff --git a/packages/lex/lex-data/package.json b/packages/lex/lex-data/package.json index 535ac5484cf..1931097bf8b 100644 --- a/packages/lex/lex-data/package.json +++ b/packages/lex/lex-data/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-data", - "version": "0.0.15", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-document/CHANGELOG.md b/packages/lex/lex-document/CHANGELOG.md index 3baa4e8fd4b..9afc2a9e22e 100644 --- a/packages/lex/lex-document/CHANGELOG.md +++ b/packages/lex/lex-document/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/lex-document +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-schema@0.1.0 + ## 0.0.21 ### Patch Changes diff --git a/packages/lex/lex-document/package.json b/packages/lex/lex-document/package.json index c95a3827177..c649d0f80a2 100644 --- a/packages/lex/lex-document/package.json +++ b/packages/lex/lex-document/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-document", - "version": "0.0.21", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-installer/CHANGELOG.md b/packages/lex/lex-installer/CHANGELOG.md index 55fb49cf166..734e5f390d6 100644 --- a/packages/lex/lex-installer/CHANGELOG.md +++ b/packages/lex/lex-installer/CHANGELOG.md @@ -1,5 +1,28 @@ # @atproto/lex-installer +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-builder@0.1.0 + - @atproto/lex-cbor@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/lex-document@0.1.0 + - @atproto/lex-resolver@0.1.0 + - @atproto/lex-schema@0.1.0 + - @atproto/syntax@0.6.0 + ## 0.0.27 ### Patch Changes diff --git a/packages/lex/lex-installer/package.json b/packages/lex/lex-installer/package.json index cce25a4d242..e0191e5127b 100644 --- a/packages/lex/lex-installer/package.json +++ b/packages/lex/lex-installer/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-installer", - "version": "0.0.27", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-json/CHANGELOG.md b/packages/lex/lex-json/CHANGELOG.md index 10ec7f6ec65..2cd902a847c 100644 --- a/packages/lex/lex-json/CHANGELOG.md +++ b/packages/lex/lex-json/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/lex-json +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-data@0.1.0 + ## 0.0.16 ### Patch Changes diff --git a/packages/lex/lex-json/package.json b/packages/lex/lex-json/package.json index 3f9b4d85745..51f5e047a84 100644 --- a/packages/lex/lex-json/package.json +++ b/packages/lex/lex-json/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-json", - "version": "0.0.16", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-password-session/CHANGELOG.md b/packages/lex/lex-password-session/CHANGELOG.md index f09b0f30fed..5a12d5954fa 100644 --- a/packages/lex/lex-password-session/CHANGELOG.md +++ b/packages/lex/lex-password-session/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/lex-password-session +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-client@0.1.0 + - @atproto/lex-schema@0.1.0 + ## 0.0.15 ### Patch Changes diff --git a/packages/lex/lex-password-session/package.json b/packages/lex/lex-password-session/package.json index 1f0d557849a..3d5a73148e8 100644 --- a/packages/lex/lex-password-session/package.json +++ b/packages/lex/lex-password-session/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-password-session", - "version": "0.0.15", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-resolver/CHANGELOG.md b/packages/lex/lex-resolver/CHANGELOG.md index c063ece233c..dbf67aed51f 100644 --- a/packages/lex/lex-resolver/CHANGELOG.md +++ b/packages/lex/lex-resolver/CHANGELOG.md @@ -1,5 +1,29 @@ # @atproto/lex-resolver +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/crypto@0.5.0 + - @atproto/lex-client@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/lex-document@0.1.0 + - @atproto/lex-schema@0.1.0 + - @atproto/repo@0.10.0 + - @atproto/syntax@0.6.0 + - @atproto-labs/did-resolver@0.3.0 + ## 0.0.24 ### Patch Changes diff --git a/packages/lex/lex-resolver/package.json b/packages/lex/lex-resolver/package.json index 9f1678c259c..4a7fb132223 100644 --- a/packages/lex/lex-resolver/package.json +++ b/packages/lex/lex-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-resolver", - "version": "0.0.24", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-schema/CHANGELOG.md b/packages/lex/lex-schema/CHANGELOG.md index 7570fd17d47..e8951fe6e3f 100644 --- a/packages/lex/lex-schema/CHANGELOG.md +++ b/packages/lex/lex-schema/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/lex-schema +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-data@0.1.0 + - @atproto/syntax@0.6.0 + ## 0.0.20 ### Patch Changes diff --git a/packages/lex/lex-schema/package.json b/packages/lex/lex-schema/package.json index 869ae472fc2..d77e367bbe9 100644 --- a/packages/lex/lex-schema/package.json +++ b/packages/lex/lex-schema/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-schema", - "version": "0.0.20", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex-server/CHANGELOG.md b/packages/lex/lex-server/CHANGELOG.md index 4690fbe1201..18873922d3e 100644 --- a/packages/lex/lex-server/CHANGELOG.md +++ b/packages/lex/lex-server/CHANGELOG.md @@ -1,5 +1,29 @@ # @atproto/lex-server +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/crypto@0.5.0 + - @atproto/did@0.4.0 + - @atproto/lex-cbor@0.1.0 + - @atproto/lex-client@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/lex-json@0.1.0 + - @atproto/lex-schema@0.1.0 + - @atproto-labs/did-resolver@0.3.0 + ## 0.0.19 ### Patch Changes diff --git a/packages/lex/lex-server/package.json b/packages/lex/lex-server/package.json index fab9b202b91..a2a2312e5d6 100644 --- a/packages/lex/lex-server/package.json +++ b/packages/lex/lex-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-server", - "version": "0.0.19", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lex/lex/CHANGELOG.md b/packages/lex/lex/CHANGELOG.md index 8e8883ecac2..de5a8ef866d 100644 --- a/packages/lex/lex/CHANGELOG.md +++ b/packages/lex/lex/CHANGELOG.md @@ -1,5 +1,27 @@ # @atproto/lex +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lex-builder@0.1.0 + - @atproto/lex-client@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/lex-installer@0.1.0 + - @atproto/lex-json@0.1.0 + - @atproto/lex-schema@0.1.0 + ## 0.0.27 ### Patch Changes diff --git a/packages/lex/lex/package.json b/packages/lex/lex/package.json index d0a4b6575fd..5431e06c1ae 100644 --- a/packages/lex/lex/package.json +++ b/packages/lex/lex/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex", - "version": "0.0.27", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/lexicon-resolver/CHANGELOG.md b/packages/lexicon-resolver/CHANGELOG.md index 0e681a46712..dae822c0a07 100644 --- a/packages/lexicon-resolver/CHANGELOG.md +++ b/packages/lexicon-resolver/CHANGELOG.md @@ -1,5 +1,27 @@ # @atproto/lexicon-resolver +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/identity@0.5.0 + - @atproto/lex@0.1.0 + - @atproto/lex-document@0.1.0 + - @atproto/repo@0.10.0 + - @atproto/syntax@0.6.0 + - @atproto-labs/fetch-node@0.3.0 + ## 0.3.7 ### Patch Changes diff --git a/packages/lexicon-resolver/package.json b/packages/lexicon-resolver/package.json index 75db1089bc0..3678415d156 100644 --- a/packages/lexicon-resolver/package.json +++ b/packages/lexicon-resolver/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lexicon-resolver", - "version": "0.3.7", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/lexicon/CHANGELOG.md b/packages/lexicon/CHANGELOG.md index fb7a5aea0d7..2c9bce79282 100644 --- a/packages/lexicon/CHANGELOG.md +++ b/packages/lexicon/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/lexicon +## 0.7.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common-web@0.5.0 + - @atproto/syntax@0.6.0 + ## 0.6.2 ### Patch Changes diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index 7e8f3718c9a..e75f549a66e 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lexicon", - "version": "0.6.2", + "version": "0.7.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/jwk-jose/CHANGELOG.md b/packages/oauth/jwk-jose/CHANGELOG.md index bf132993c0b..596bbbc415d 100644 --- a/packages/oauth/jwk-jose/CHANGELOG.md +++ b/packages/oauth/jwk-jose/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/jwk-jose +## 0.2.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/jwk@0.7.0 + ## 0.1.11 ### Patch Changes diff --git a/packages/oauth/jwk-jose/package.json b/packages/oauth/jwk-jose/package.json index bbbadaa4fc6..d08f91b076d 100644 --- a/packages/oauth/jwk-jose/package.json +++ b/packages/oauth/jwk-jose/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/jwk-jose", - "version": "0.1.11", + "version": "0.2.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/jwk-webcrypto/CHANGELOG.md b/packages/oauth/jwk-webcrypto/CHANGELOG.md index e63704603a7..4a7702e8124 100644 --- a/packages/oauth/jwk-webcrypto/CHANGELOG.md +++ b/packages/oauth/jwk-webcrypto/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/jwk-webcrypto +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/jwk@0.7.0 + - @atproto/jwk-jose@0.2.0 + ## 0.2.0 ### Minor Changes diff --git a/packages/oauth/jwk-webcrypto/package.json b/packages/oauth/jwk-webcrypto/package.json index 3e88de7bc10..085f344bf9a 100644 --- a/packages/oauth/jwk-webcrypto/package.json +++ b/packages/oauth/jwk-webcrypto/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/jwk-webcrypto", - "version": "0.2.0", + "version": "0.3.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/jwk/CHANGELOG.md b/packages/oauth/jwk/CHANGELOG.md index 4ae94d5c85a..c33ad8169d6 100644 --- a/packages/oauth/jwk/CHANGELOG.md +++ b/packages/oauth/jwk/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/jwk +## 0.7.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.6.0 ### Minor Changes diff --git a/packages/oauth/jwk/package.json b/packages/oauth/jwk/package.json index 4f54bedf3a4..d138de89019 100644 --- a/packages/oauth/jwk/package.json +++ b/packages/oauth/jwk/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/jwk", - "version": "0.6.0", + "version": "0.7.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-client-browser-example/CHANGELOG.md b/packages/oauth/oauth-client-browser-example/CHANGELOG.md index aaf23799095..031bf759d6a 100644 --- a/packages/oauth/oauth-client-browser-example/CHANGELOG.md +++ b/packages/oauth/oauth-client-browser-example/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/oauth-client-browser-example +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.0.10 ### Patch Changes diff --git a/packages/oauth/oauth-client-browser-example/package.json b/packages/oauth/oauth-client-browser-example/package.json index 7bf1d5707c4..7bdf118114a 100644 --- a/packages/oauth/oauth-client-browser-example/package.json +++ b/packages/oauth/oauth-client-browser-example/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-browser-example", - "version": "0.0.10", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-client-browser/CHANGELOG.md b/packages/oauth/oauth-client-browser/CHANGELOG.md index 2a470ff9a18..86bb83753b2 100644 --- a/packages/oauth/oauth-client-browser/CHANGELOG.md +++ b/packages/oauth/oauth-client-browser/CHANGELOG.md @@ -1,5 +1,29 @@ # @atproto/oauth-client-browser +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto/jwk@0.7.0 + - @atproto/jwk-webcrypto@0.3.0 + - @atproto/oauth-client@0.7.0 + - @atproto/oauth-types@0.7.0 + - @atproto-labs/did-resolver@0.3.0 + - @atproto-labs/handle-resolver@0.4.0 + - @atproto-labs/simple-store@0.4.0 + ## 0.3.42 ### Patch Changes diff --git a/packages/oauth/oauth-client-browser/package.json b/packages/oauth/oauth-client-browser/package.json index 66c14e2cae2..3d44287e1b5 100644 --- a/packages/oauth/oauth-client-browser/package.json +++ b/packages/oauth/oauth-client-browser/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-browser", - "version": "0.3.42", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-client-expo/CHANGELOG.md b/packages/oauth/oauth-client-expo/CHANGELOG.md index fdd09208c5f..a2dac23f716 100644 --- a/packages/oauth/oauth-client-expo/CHANGELOG.md +++ b/packages/oauth/oauth-client-expo/CHANGELOG.md @@ -1,5 +1,24 @@ # @atproto/oauth-client-expo +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/oauth-client@0.7.0 + - @atproto/oauth-client-browser@0.4.0 + - @atproto-labs/simple-store@0.4.0 + ## 0.0.10 ### Patch Changes diff --git a/packages/oauth/oauth-client-expo/package.json b/packages/oauth/oauth-client-expo/package.json index 01335a3df5d..fe786849b14 100755 --- a/packages/oauth/oauth-client-expo/package.json +++ b/packages/oauth/oauth-client-expo/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-expo", - "version": "0.0.10", + "version": "0.1.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-client-node/CHANGELOG.md b/packages/oauth/oauth-client-node/CHANGELOG.md index 7d32ceb71d8..78eda30a01a 100644 --- a/packages/oauth/oauth-client-node/CHANGELOG.md +++ b/packages/oauth/oauth-client-node/CHANGELOG.md @@ -1,5 +1,30 @@ # @atproto/oauth-client-node +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto/jwk@0.7.0 + - @atproto/jwk-jose@0.2.0 + - @atproto/jwk-webcrypto@0.3.0 + - @atproto/oauth-client@0.7.0 + - @atproto/oauth-types@0.7.0 + - @atproto-labs/did-resolver@0.3.0 + - @atproto-labs/handle-resolver-node@0.2.0 + - @atproto-labs/simple-store@0.4.0 + ## 0.3.17 ### Patch Changes diff --git a/packages/oauth/oauth-client-node/package.json b/packages/oauth/oauth-client-node/package.json index c465fe59b75..bc389f81029 100644 --- a/packages/oauth/oauth-client-node/package.json +++ b/packages/oauth/oauth-client-node/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client-node", - "version": "0.3.17", + "version": "0.4.0", "license": "MIT", "description": "ATPROTO OAuth client for the NodeJS", "keywords": [ diff --git a/packages/oauth/oauth-client/CHANGELOG.md b/packages/oauth/oauth-client/CHANGELOG.md index 349f5467bb8..04105ef4cfa 100644 --- a/packages/oauth/oauth-client/CHANGELOG.md +++ b/packages/oauth/oauth-client/CHANGELOG.md @@ -1,5 +1,33 @@ # @atproto/oauth-client +## 0.7.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** `RuntimeImplementation.digest(data, alg)` now takes `data: Uint8Array` rather than `Uint8Array`. This only affects consumers who implement `RuntimeImplementation` themselves rather than using one of the prebuilt impls (`@atproto/oauth-client-browser`, `@atproto/oauth-client-node`, `@atproto/oauth-client-expo`). Most callers can pass values through unchanged; in the rare case of a `SharedArrayBuffer`-backed `Uint8Array`, copy into a regular `Uint8Array` first. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto/jwk@0.7.0 + - @atproto/oauth-types@0.7.0 + - @atproto/xrpc@0.8.0 + - @atproto-labs/did-resolver@0.3.0 + - @atproto-labs/fetch@0.3.0 + - @atproto-labs/handle-resolver@0.4.0 + - @atproto-labs/identity-resolver@0.4.0 + - @atproto-labs/simple-store@0.4.0 + - @atproto-labs/simple-store-memory@0.2.0 + ## 0.6.1 ### Patch Changes diff --git a/packages/oauth/oauth-client/package.json b/packages/oauth/oauth-client/package.json index 9dc086e9eaf..4eafa1ceb06 100644 --- a/packages/oauth/oauth-client/package.json +++ b/packages/oauth/oauth-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-client", - "version": "0.6.1", + "version": "0.7.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-provider-api/CHANGELOG.md b/packages/oauth/oauth-provider-api/CHANGELOG.md index 1e783910ed8..27b0e98bd68 100644 --- a/packages/oauth/oauth-provider-api/CHANGELOG.md +++ b/packages/oauth/oauth-provider-api/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/oauth-provider-api +## 0.5.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/jwk@0.7.0 + - @atproto/oauth-types@0.7.0 + ## 0.4.0 ### Minor Changes diff --git a/packages/oauth/oauth-provider-api/package.json b/packages/oauth/oauth-provider-api/package.json index 29dc4402e75..37df688eb2d 100644 --- a/packages/oauth/oauth-provider-api/package.json +++ b/packages/oauth/oauth-provider-api/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider-api", - "version": "0.4.0", + "version": "0.5.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-provider-ui/CHANGELOG.md b/packages/oauth/oauth-provider-ui/CHANGELOG.md index 20d0e687735..a2a77671ebe 100644 --- a/packages/oauth/oauth-provider-ui/CHANGELOG.md +++ b/packages/oauth/oauth-provider-ui/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/oauth-provider-ui +## 0.6.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.5.2 ### Patch Changes diff --git a/packages/oauth/oauth-provider-ui/package.json b/packages/oauth/oauth-provider-ui/package.json index 07481e8f5eb..face59a4a7c 100644 --- a/packages/oauth/oauth-provider-ui/package.json +++ b/packages/oauth/oauth-provider-ui/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider-ui", - "version": "0.5.2", + "version": "0.6.0", "license": "MIT", "description": "Sign-in & Sign-up UI for the @atproto/oauth-provider", "homepage": "https://atproto.com", diff --git a/packages/oauth/oauth-provider/CHANGELOG.md b/packages/oauth/oauth-provider/CHANGELOG.md index 802f243364e..207914568a8 100644 --- a/packages/oauth/oauth-provider/CHANGELOG.md +++ b/packages/oauth/oauth-provider/CHANGELOG.md @@ -1,5 +1,37 @@ # @atproto/oauth-provider +## 0.17.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/did@0.4.0 + - @atproto/jwk@0.7.0 + - @atproto/jwk-jose@0.2.0 + - @atproto/lex-document@0.1.0 + - @atproto/lex-resolver@0.1.0 + - @atproto/oauth-provider-api@0.5.0 + - @atproto/oauth-provider-ui@0.6.0 + - @atproto/oauth-scopes@0.4.0 + - @atproto/oauth-types@0.7.0 + - @atproto/syntax@0.6.0 + - @atproto-labs/fetch@0.3.0 + - @atproto-labs/fetch-node@0.3.0 + - @atproto-labs/pipe@0.2.0 + - @atproto-labs/simple-store@0.4.0 + - @atproto-labs/simple-store-memory@0.2.0 + ## 0.16.5 ### Patch Changes diff --git a/packages/oauth/oauth-provider/package.json b/packages/oauth/oauth-provider/package.json index 86ac9734058..d7d7bd34fc6 100644 --- a/packages/oauth/oauth-provider/package.json +++ b/packages/oauth/oauth-provider/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-provider", - "version": "0.16.5", + "version": "0.17.0", "license": "MIT", "description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.", "keywords": [ diff --git a/packages/oauth/oauth-scopes/CHANGELOG.md b/packages/oauth/oauth-scopes/CHANGELOG.md index 5e621dd6a46..191a371301d 100644 --- a/packages/oauth/oauth-scopes/CHANGELOG.md +++ b/packages/oauth/oauth-scopes/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/oauth-scopes +## 0.4.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto/syntax@0.6.0 + ## 0.3.2 ### Patch Changes diff --git a/packages/oauth/oauth-scopes/package.json b/packages/oauth/oauth-scopes/package.json index 5d6f12a934f..86731a133d4 100644 --- a/packages/oauth/oauth-scopes/package.json +++ b/packages/oauth/oauth-scopes/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-scopes", - "version": "0.3.2", + "version": "0.4.0", "engines": { "node": ">=22" }, diff --git a/packages/oauth/oauth-types/CHANGELOG.md b/packages/oauth/oauth-types/CHANGELOG.md index 66149225820..ff54fbfd074 100644 --- a/packages/oauth/oauth-types/CHANGELOG.md +++ b/packages/oauth/oauth-types/CHANGELOG.md @@ -1,5 +1,23 @@ # @atproto/oauth-types +## 0.7.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/did@0.4.0 + - @atproto/jwk@0.7.0 + ## 0.6.3 ### Patch Changes diff --git a/packages/oauth/oauth-types/package.json b/packages/oauth/oauth-types/package.json index 4d62533bba1..0df32ccd222 100644 --- a/packages/oauth/oauth-types/package.json +++ b/packages/oauth/oauth-types/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/oauth-types", - "version": "0.6.3", + "version": "0.7.0", "engines": { "node": ">=22" }, diff --git a/packages/ozone/CHANGELOG.md b/packages/ozone/CHANGELOG.md index c64d620e33c..75a4cf31401 100644 --- a/packages/ozone/CHANGELOG.md +++ b/packages/ozone/CHANGELOG.md @@ -1,5 +1,28 @@ # @atproto/ozone +## 0.1.175 + +### Patch Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/api@0.20.0 + - @atproto/crypto@0.5.0 + - @atproto/identity@0.5.0 + - @atproto/lexicon@0.7.0 + - @atproto/syntax@0.6.0 + - @atproto/ws-client@0.1.0 + - @atproto/xrpc@0.8.0 + - @atproto/xrpc-server@0.11.0 + ## 0.1.174 ### Patch Changes diff --git a/packages/ozone/package.json b/packages/ozone/package.json index a1ed476c5d4..ab1a1649494 100644 --- a/packages/ozone/package.json +++ b/packages/ozone/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ozone", - "version": "0.1.174", + "version": "0.1.175", "license": "MIT", "description": "Backend service for moderating the Bluesky network.", "keywords": [ diff --git a/packages/pds/CHANGELOG.md b/packages/pds/CHANGELOG.md index 9c3dc621e6b..6bc4a57fa35 100644 --- a/packages/pds/CHANGELOG.md +++ b/packages/pds/CHANGELOG.md @@ -1,5 +1,38 @@ # @atproto/pds +## 0.4.224 + +### Patch Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/aws@0.3.0 + - @atproto/crypto@0.5.0 + - @atproto/identity@0.5.0 + - @atproto/lex@0.1.0 + - @atproto/lex-cbor@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/lex-json@0.1.0 + - @atproto/oauth-provider@0.17.0 + - @atproto/oauth-scopes@0.4.0 + - @atproto/repo@0.10.0 + - @atproto/syntax@0.6.0 + - @atproto/xrpc@0.8.0 + - @atproto/xrpc-server@0.11.0 + - @atproto-labs/fetch-node@0.3.0 + - @atproto-labs/simple-store@0.4.0 + - @atproto-labs/simple-store-memory@0.2.0 + - @atproto-labs/simple-store-redis@0.1.0 + - @atproto-labs/xrpc-utils@0.1.0 + ## 0.4.223 ### Patch Changes diff --git a/packages/pds/package.json b/packages/pds/package.json index 0a807a745c2..2c029e3fb78 100644 --- a/packages/pds/package.json +++ b/packages/pds/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/pds", - "version": "0.4.223", + "version": "0.4.224", "license": "MIT", "description": "Reference implementation of atproto Personal Data Server (PDS)", "keywords": [ diff --git a/packages/repo/CHANGELOG.md b/packages/repo/CHANGELOG.md index 04c0a82610c..664f4d539d8 100644 --- a/packages/repo/CHANGELOG.md +++ b/packages/repo/CHANGELOG.md @@ -1,5 +1,27 @@ # @atproto/repo +## 0.10.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/common-web@0.5.0 + - @atproto/crypto@0.5.0 + - @atproto/lex-cbor@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/syntax@0.6.0 + ## 0.9.1 ### Patch Changes diff --git a/packages/repo/package.json b/packages/repo/package.json index baad7e6a19a..fe3bab73829 100644 --- a/packages/repo/package.json +++ b/packages/repo/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/repo", - "version": "0.9.1", + "version": "0.10.0", "license": "MIT", "description": "atproto repo and MST implementation", "keywords": [ diff --git a/packages/sync/CHANGELOG.md b/packages/sync/CHANGELOG.md index bf39f96ca6e..92b4e186c5b 100644 --- a/packages/sync/CHANGELOG.md +++ b/packages/sync/CHANGELOG.md @@ -1,5 +1,27 @@ # @atproto/sync +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/identity@0.5.0 + - @atproto/lex@0.1.0 + - @atproto/repo@0.10.0 + - @atproto/syntax@0.6.0 + - @atproto/xrpc-server@0.11.0 + ## 0.2.4 ### Patch Changes diff --git a/packages/sync/package.json b/packages/sync/package.json index 0ec54501342..645ad6d0232 100644 --- a/packages/sync/package.json +++ b/packages/sync/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/sync", - "version": "0.2.4", + "version": "0.3.0", "license": "MIT", "description": "atproto sync library", "keywords": [ diff --git a/packages/syntax/CHANGELOG.md b/packages/syntax/CHANGELOG.md index 0874e0f64a7..5c426b505b5 100644 --- a/packages/syntax/CHANGELOG.md +++ b/packages/syntax/CHANGELOG.md @@ -1,5 +1,17 @@ # @atproto/syntax +## 0.6.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + ## 0.5.4 ### Patch Changes diff --git a/packages/syntax/package.json b/packages/syntax/package.json index 9d9da44adb2..b476554f379 100644 --- a/packages/syntax/package.json +++ b/packages/syntax/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/syntax", - "version": "0.5.4", + "version": "0.6.0", "engines": { "node": ">=22" }, diff --git a/packages/tap/CHANGELOG.md b/packages/tap/CHANGELOG.md index a42333c749c..d84bc9a41e6 100644 --- a/packages/tap/CHANGELOG.md +++ b/packages/tap/CHANGELOG.md @@ -1,5 +1,25 @@ # @atproto/tap +## 0.3.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/lex@0.1.0 + - @atproto/syntax@0.6.0 + - @atproto/ws-client@0.1.0 + ## 0.2.15 ### Patch Changes diff --git a/packages/tap/package.json b/packages/tap/package.json index caab28d6218..0c4e678c358 100644 --- a/packages/tap/package.json +++ b/packages/tap/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/tap", - "version": "0.2.15", + "version": "0.3.0", "license": "MIT", "description": "atproto tap client", "keywords": [ diff --git a/packages/ws-client/CHANGELOG.md b/packages/ws-client/CHANGELOG.md index 31381d4231c..ea7eee95797 100644 --- a/packages/ws-client/CHANGELOG.md +++ b/packages/ws-client/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/ws-client +## 0.1.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + ## 0.0.4 ### Patch Changes diff --git a/packages/ws-client/package.json b/packages/ws-client/package.json index df8178becb3..ff05b311155 100644 --- a/packages/ws-client/package.json +++ b/packages/ws-client/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/ws-client", - "version": "0.0.4", + "version": "0.1.0", "license": "MIT", "description": "Websocket client library", "keywords": [ diff --git a/packages/xrpc-server/CHANGELOG.md b/packages/xrpc-server/CHANGELOG.md index 5a39394de17..629328a2a26 100644 --- a/packages/xrpc-server/CHANGELOG.md +++ b/packages/xrpc-server/CHANGELOG.md @@ -1,5 +1,31 @@ # @atproto/xrpc-server +## 0.11.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`affb50c`](https://github.com/bluesky-social/atproto/commit/affb50c040b497a12631df99a6310f8e78cab557), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/common@0.6.0 + - @atproto/crypto@0.5.0 + - @atproto/lex-cbor@0.1.0 + - @atproto/lex-client@0.1.0 + - @atproto/lex-data@0.1.0 + - @atproto/lex-json@0.1.0 + - @atproto/lex-schema@0.1.0 + - @atproto/lexicon@0.7.0 + - @atproto/ws-client@0.1.0 + - @atproto/xrpc@0.8.0 + ## 0.10.22 ### Patch Changes diff --git a/packages/xrpc-server/package.json b/packages/xrpc-server/package.json index c654d88d364..3925f66ca11 100644 --- a/packages/xrpc-server/package.json +++ b/packages/xrpc-server/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc-server", - "version": "0.10.22", + "version": "0.11.0", "license": "MIT", "description": "atproto HTTP API (XRPC) server library", "keywords": [ diff --git a/packages/xrpc/CHANGELOG.md b/packages/xrpc/CHANGELOG.md index 9e2d02de14b..b7fb8a76e4d 100644 --- a/packages/xrpc/CHANGELOG.md +++ b/packages/xrpc/CHANGELOG.md @@ -1,5 +1,22 @@ # @atproto/xrpc +## 0.8.0 + +### Minor Changes + +- [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24. + +- [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution. + + Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code. + +- [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. + +### Patch Changes + +- Updated dependencies [[`f01c59f`](https://github.com/bluesky-social/atproto/commit/f01c59f5bd3f75fb8b47a9eecd4858b84033fb7c), [`c459153`](https://github.com/bluesky-social/atproto/commit/c459153395a30ce89e050892c8fab7dc98e019b9), [`908bece`](https://github.com/bluesky-social/atproto/commit/908bece169258bff5ad121e5eec157d6ded6f705)]: + - @atproto/lexicon@0.7.0 + ## 0.7.7 ### Patch Changes diff --git a/packages/xrpc/package.json b/packages/xrpc/package.json index 699504caafa..5056af2eac3 100644 --- a/packages/xrpc/package.json +++ b/packages/xrpc/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/xrpc", - "version": "0.7.7", + "version": "0.8.0", "engines": { "node": ">=22" }, From 20c5cc187aab538435c669c6e19a2d2f658af5f8 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Tue, 19 May 2026 11:57:03 +0200 Subject: [PATCH 47/87] Fix imports from `iso-datestring-validator` (#4955) * Fix imports from `iso-datestring-validator` * Add tests * changeset --- .changeset/afraid-islands-swim.md | 5 + .changeset/goofy-pans-hang.md | 6 + .changeset/khaki-socks-worry.md | 5 + .changeset/salty-flies-sleep.md | 5 + .changeset/true-carpets-grab.md | 5 + packages/lex/lex-schema/package.json | 1 - .../lex/lex-schema/src/core/string-format.ts | 24 +-- packages/lexicon/package.json | 1 - packages/lexicon/src/validators/formats.ts | 191 +++++------------- packages/lexicon/src/validators/primitives.ts | 2 +- packages/syntax/package.json | 1 + packages/syntax/src/datetime.ts | 35 ++++ packages/syntax/tests/datetime.test.ts | 183 +++++++++-------- pnpm-lock.yaml | 9 +- 14 files changed, 225 insertions(+), 248 deletions(-) create mode 100644 .changeset/afraid-islands-swim.md create mode 100644 .changeset/goofy-pans-hang.md create mode 100644 .changeset/khaki-socks-worry.md create mode 100644 .changeset/salty-flies-sleep.md create mode 100644 .changeset/true-carpets-grab.md diff --git a/.changeset/afraid-islands-swim.md b/.changeset/afraid-islands-swim.md new file mode 100644 index 00000000000..c5a58e403b0 --- /dev/null +++ b/.changeset/afraid-islands-swim.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-schema': patch +--- + +Fixes a bug that would reject valid `datetime` atproto strings in non-strict validation diff --git a/.changeset/goofy-pans-hang.md b/.changeset/goofy-pans-hang.md new file mode 100644 index 00000000000..b181642b270 --- /dev/null +++ b/.changeset/goofy-pans-hang.md @@ -0,0 +1,6 @@ +--- +'@atproto/lex-schema': patch +'@atproto/lexicon': patch +--- + +Use datetime validation utility from `@atproto/syntax` diff --git a/.changeset/khaki-socks-worry.md b/.changeset/khaki-socks-worry.md new file mode 100644 index 00000000000..ccdce507c2a --- /dev/null +++ b/.changeset/khaki-socks-worry.md @@ -0,0 +1,5 @@ +--- +'@atproto/lexicon': patch +--- + +Fix datetime validation that would reject valid atproto datetime strings (e.g. `1985-04-12T23:20:50.1234567890Z` & `1985-04-12T23:20:50.123+01:45`) diff --git a/.changeset/salty-flies-sleep.md b/.changeset/salty-flies-sleep.md new file mode 100644 index 00000000000..fc070375663 --- /dev/null +++ b/.changeset/salty-flies-sleep.md @@ -0,0 +1,5 @@ +--- +'@atproto/lexicon': patch +--- + +Improve performances of string validation utilities (and drop use of deprecated functions) diff --git a/.changeset/true-carpets-grab.md b/.changeset/true-carpets-grab.md new file mode 100644 index 00000000000..46fe29e83e6 --- /dev/null +++ b/.changeset/true-carpets-grab.md @@ -0,0 +1,5 @@ +--- +'@atproto/syntax': patch +--- + +Add `isDatetimeStringLenient` datetime validation utility diff --git a/packages/lex/lex-schema/package.json b/packages/lex/lex-schema/package.json index d77e367bbe9..781424b0473 100644 --- a/packages/lex/lex-schema/package.json +++ b/packages/lex/lex-schema/package.json @@ -37,7 +37,6 @@ "@atproto/syntax": "workspace:^", "@atproto/lex-data": "workspace:^", "@standard-schema/spec": "^1.1.0", - "iso-datestring-validator": "^2.2.2", "tslib": "^2.8.1" }, "devDependencies": { diff --git a/packages/lex/lex-schema/src/core/string-format.ts b/packages/lex/lex-schema/src/core/string-format.ts index 0c1ad6eba63..ac8971730f0 100644 --- a/packages/lex/lex-schema/src/core/string-format.ts +++ b/packages/lex/lex-schema/src/core/string-format.ts @@ -1,5 +1,3 @@ -import isoDatestringValidator from 'iso-datestring-validator' -const { isValidISODateString } = isoDatestringValidator import { validateCidString } from '@atproto/lex-data' import { AtIdentifierString, @@ -14,6 +12,7 @@ import { isAtIdentifierString, isAtUriString, isDatetimeString, + isDatetimeStringLenient, isValidDid, isValidHandle, isValidLanguage, @@ -50,28 +49,9 @@ export { assertDatetimeString, ifDatetimeString, isDatetimeString, + isDatetimeStringLenient, } from '@atproto/syntax' -/** - * Matches any ISO-ish datetime string. This is a more lenient check than - * the strict {@link isDatetimeString} guard, which only allows datetimes that - * fully conform to the AT Protocol specification (e.g. must include timezone). - */ -export function isDatetimeStringLenient( - input: I, -): input is I & DatetimeString { - // @NOTE the returned type assertion is inaccurate wrt. the DatetimeString - // type definition. A more accurate solution would be to use a branded type - // instead of a template literal for the "datetime" format - if (typeof input !== 'string') return false - try { - return isValidISODateString(input) - } catch { - // @NOTE isValidISODateString throws on some inputs - return false - } -} - // DatetimeString utilities export { currentDatetimeString, toDatetimeString } from '@atproto/syntax' diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index e75f549a66e..9dc6626b3d4 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -23,7 +23,6 @@ "dependencies": { "@atproto/common-web": "workspace:^", "@atproto/syntax": "workspace:^", - "iso-datestring-validator": "^2.2.2", "multiformats": "^13.0.0", "zod": "^3.23.8" }, diff --git a/packages/lexicon/src/validators/formats.ts b/packages/lexicon/src/validators/formats.ts index 62398e5a1bf..d74f777bbb9 100644 --- a/packages/lexicon/src/validators/formats.ts +++ b/packages/lexicon/src/validators/formats.ts @@ -1,157 +1,72 @@ -import isoDatestringValidator from 'iso-datestring-validator' -const { isValidISODateString } = isoDatestringValidator import { CID } from 'multiformats/cid' -import { validateLanguage } from '@atproto/common-web' import { - ensureValidAtUri, - ensureValidDid, - ensureValidHandle, - ensureValidRecordKey, + isAtIdentifierString, + isAtUriString, + isDatetimeStringLenient, + isValidDid, + isValidHandle, + isValidLanguage, isValidNsid, + isValidRecordKey, isValidTid, isValidUri, } from '@atproto/syntax' import { ValidationError, ValidationResult } from '../types.js' -export function datetime(path: string, value: string): ValidationResult { - try { - if (!isValidISODateString(value)) { - throw new Error() - } - } catch { - return { - success: false, - error: new ValidationError( - `${path} must be an valid atproto datetime (both RFC-3339 and ISO-8601)`, - ), - } - } - return { success: true, value } -} - -export function uri(path: string, value: string): ValidationResult { - if (!isValidUri(value)) { - return { - success: false, - error: new ValidationError(`${path} must be a uri`), - } - } - return { success: true, value } -} - -export function atUri(path: string, value: string): ValidationResult { - try { - ensureValidAtUri(value) - } catch { - return { - success: false, - error: new ValidationError(`${path} must be a valid at-uri`), - } - } - - return { success: true, value } -} - -export function did(path: string, value: string): ValidationResult { - try { - ensureValidDid(value) - } catch { - return { - success: false, - error: new ValidationError(`${path} must be a valid did`), - } - } - - return { success: true, value } -} - -export function handle(path: string, value: string): ValidationResult { - try { - ensureValidHandle(value) - } catch { - return { - success: false, - error: new ValidationError(`${path} must be a valid handle`), - } - } - - return { success: true, value } -} - -export function atIdentifier(path: string, value: string): ValidationResult { - // We can discriminate based on the "did:" prefix - if (value.startsWith('did:')) { - const didResult = did(path, value) - if (didResult.success) return didResult - } else { - const handleResult = handle(path, value) - if (handleResult.success) return handleResult - } - - return { - success: false, - error: new ValidationError(`${path} must be a valid did or a handle`), - } -} - -export function nsid(path: string, value: string): ValidationResult { - if (isValidNsid(value)) { - return { - success: true, - value, - } - } else { - return { - success: false, - error: new ValidationError(`${path} must be a valid nsid`), +export const datetime = createValidator( + isDatetimeStringLenient, + 'must be an valid atproto datetime (both RFC-3339 and ISO-8601)', +) +export const uri = createValidator(isValidUri, 'must be a uri') +export const atUri = createValidator(isAtUriString, 'must be a valid at-uri') +export const did = createValidator(isValidDid, 'must be a valid did') +export const handle = createValidator(isValidHandle, 'must be a valid handle') +export const atIdentifier = createValidator( + isAtIdentifierString, + 'must be a valid did or a handle', +) +export const nsid = createValidator(isValidNsid, 'must be a valid nsid') +export const cid = createValidator(isCidString, 'must be a cid string') +export const language = createValidator( + isValidLanguage, + 'must be a well-formed BCP 47 language tag', +) +export const tid = createValidator(isValidTid, 'must be a valid TID') +export const recordKey = createValidator( + isValidRecordKey, + 'must be a valid Record Key', +) + +// Internal helpers + +function createValidator( + assertionFn: (value: string) => value is T, + errorMessage: string, +): (path: string, value: V) => ValidationResult +function createValidator( + assertionFn: (value: string) => boolean, + errorMessage: string, +): (path: string, value: string) => ValidationResult +function createValidator( + assertionFn: (value: string) => boolean, + errorMessage: string, +) { + return (path: string, value: string): ValidationResult => { + if (assertionFn(value)) { + return { success: true, value } } - } -} - -export function cid(path: string, value: string): ValidationResult { - try { - CID.parse(value) - } catch { return { success: false, - error: new ValidationError(`${path} must be a cid string`), + error: new ValidationError(`${path} ${errorMessage}`), } } - return { success: true, value } -} - -// The language format validates well-formed BCP 47 language tags: https://www.rfc-editor.org/info/bcp47 -export function language(path: string, value: string): ValidationResult { - if (validateLanguage(value)) { - return { success: true, value } - } - return { - success: false, - error: new ValidationError( - `${path} must be a well-formed BCP 47 language tag`, - ), - } } -export function tid(path: string, value: string): ValidationResult { - if (isValidTid(value)) { - return { success: true, value } - } - - return { - success: false, - error: new ValidationError(`${path} must be a valid TID`), - } -} - -export function recordKey(path: string, value: string): ValidationResult { +function isCidString(v: string): v is string { try { - ensureValidRecordKey(value) + CID.parse(v) + return true } catch { - return { - success: false, - error: new ValidationError(`${path} must be a valid Record Key`), - } + return false } - return { success: true, value } } diff --git a/packages/lexicon/src/validators/primitives.ts b/packages/lexicon/src/validators/primitives.ts index db9f9f41450..6e6c86d5963 100644 --- a/packages/lexicon/src/validators/primitives.ts +++ b/packages/lexicon/src/validators/primitives.ts @@ -156,7 +156,7 @@ function string( path: string, def: LexUserType, value: unknown, -): ValidationResult { +): ValidationResult { def = def as LexString // type diff --git a/packages/syntax/package.json b/packages/syntax/package.json index b476554f379..e3b20d266e8 100644 --- a/packages/syntax/package.json +++ b/packages/syntax/package.json @@ -23,6 +23,7 @@ "build": "tsc --build tsconfig.build.json" }, "dependencies": { + "iso-datestring-validator": "^2.2.2", "tslib": "^2.8.1" }, "devDependencies": { diff --git a/packages/syntax/src/datetime.ts b/packages/syntax/src/datetime.ts index 8bb253534b5..9b277b43908 100644 --- a/packages/syntax/src/datetime.ts +++ b/packages/syntax/src/datetime.ts @@ -1,3 +1,9 @@ +import * as isoDatestringValidator from 'iso-datestring-validator' + +// Node ESM interop wraps "iso-datestring-validator" as { default: { ... } } +// @TODO Remove "iso-datestring-validator" dependency +const { isValidISODateString } = ((m) => m.default ?? m)(isoDatestringValidator) + /** * Indicates a date or string is not a valid representation of a datetime * according to the atproto @@ -119,6 +125,35 @@ export function isDatetimeString(input: I): input is I & DatetimeString { return parseString(input).success } +/** + * Matches any ISO-ish datetime string. This is a more lenient check than + * the strict {@link isDatetimeString} guard, which only allows datetimes that + * fully conform to the AT Protocol specification (e.g. must include timezone). + */ +export function isDatetimeStringLenient( + input: I, +): input is I & DatetimeString { + // @NOTE the returned type assertion is inaccurate wrt. the DatetimeString + // type definition. A more accurate solution would be to use a branded type + // instead of a template literal for the "datetime" format + + if (typeof input !== 'string') return false + + try { + if (isValidISODateString(input)) return true + } catch { + // isValidISODateString can throw on some inputs. + } + + // @NOTE The "iso-datestring-validator" implementation is *not* compliant with + // the AT Protocol datetime specification. In particular, it rejects some + // valid AT Protocol datetimes (eg: "1985-04-12T23:20:50.1235678912345Z", + // "1985-04-12T23:20:50.123+01:45", "1985-04-12T23:20:50.1234567890Z"). For + // this reason, we run "isDatetimeString" validation if "isValidISODateString" + // does not return true. + return isDatetimeString(input) +} + /** * Returns the input if it is a valid {@link DatetimeString} format string, or * `undefined` if it is not. diff --git a/packages/syntax/tests/datetime.test.ts b/packages/syntax/tests/datetime.test.ts index 9d3ac8abe45..8f30e19b172 100644 --- a/packages/syntax/tests/datetime.test.ts +++ b/packages/syntax/tests/datetime.test.ts @@ -3,7 +3,8 @@ import { describe, expect, it, test } from 'vitest' import { InvalidDatetimeError, ensureValidDatetime, - isValidDatetime, + isDatetimeString, + isDatetimeStringLenient, normalizeDatetime, normalizeDatetimeAlways, } from '../src/index.js' @@ -18,29 +19,38 @@ const interopInvalidParse = readLines( `${__dirname}/interop-files/datetime_parse_invalid.txt`, ) +// These strings come from the test suite in "@atproto/lexicon", kept around +// to ensure compatibility with legacy implementation. +const legacyValid = [ + '2022-12-12T00:50:36.809Z', + '2022-12-12T00:50:36Z', + '2022-12-12T00:50:36.8Z', + '2022-12-12T00:50:36.80Z', + '2022-12-12T00:50:36+00:00', + '2022-12-12T00:50:36.8+00:00', + '2022-12-11T19:50:36-05:00', + '2022-12-11T19:50:36.8-05:00', + '2022-12-11T19:50:36.80-05:00', + '2022-12-11T19:50:36.809-05:00', +] + describe(ensureValidDatetime, () => { - describe('valid interop', () => { - for (const dt of interopValid) { - test(dt, () => { - expect(() => ensureValidDatetime(dt)).not.toThrow() - }) - } + describe('Interop valid', () => { + test.each(interopValid)('%s', (dt) => { + expect(() => ensureValidDatetime(dt)).not.toThrow() + }) }) - describe('fails on interop (invalid syntax)', () => { - for (const dt of interopInvalidSyntax) { - test(dt, () => { - expect(() => ensureValidDatetime(dt)).toThrow(InvalidDatetimeError) - }) - } + describe('Interop invalid syntax', () => { + test.each(interopInvalidSyntax)('%s', (dt) => { + expect(() => ensureValidDatetime(dt)).toThrow(InvalidDatetimeError) + }) }) - describe('fails on interop (invalid parse)', () => { - for (const dt of interopInvalidParse) { - test(dt, () => { - expect(() => ensureValidDatetime(dt)).toThrow(InvalidDatetimeError) - }) - } + describe('Interop invalid parse', () => { + test.each(interopInvalidParse)('%s', (dt) => { + expect(() => ensureValidDatetime(dt)).toThrow(InvalidDatetimeError) + }) }) it('rejects datetime that normalizes past year 9999 due to negative offset', () => { @@ -52,64 +62,85 @@ describe(ensureValidDatetime, () => { }) }) -describe(isValidDatetime, () => { - describe('valid interop', () => { - for (const dt of interopValid) { - test(dt, () => { - expect(isValidDatetime(dt)).toBe(true) - }) - } +describe(isDatetimeString, () => { + describe('Interop valid', () => { + test.each(interopValid)('%s', (dt) => { + expect(isDatetimeString(dt)).toBe(true) + }) + }) + + describe('Interop invalid syntax', () => { + test.each(interopInvalidSyntax)('%s', (dt) => { + expect(isDatetimeString(dt)).toBe(false) + }) }) - describe('fails on interop (invalid syntax)', () => { - for (const dt of interopInvalidSyntax) { - test(dt, () => { - expect(isValidDatetime(dt)).toBe(false) - }) - } + describe('Interop invalid parse', () => { + test.each(interopInvalidParse)('%s', (dt) => { + expect(isDatetimeString(dt)).toBe(false) + }) }) - describe('fails on interop (invalid parse)', () => { - for (const dt of interopInvalidParse) { - test(dt, () => { - expect(isValidDatetime(dt)).toBe(false) - }) - } + describe('succeeds on legacy valid', () => { + test.each(legacyValid)('%s', (dt) => { + expect(isDatetimeString(dt)).toBe(true) + }) }) it('rejects datetime that normalizes past year 9999 due to negative offset', () => { // 9999-12-31T23:59:00-00:01 is syntactically valid, but normalizing to // UTC advances it to 10000-01-01T00:00:00Z, which is out of range - expect(isValidDatetime('9999-12-31T23:59:00-00:01')).toBe(false) + expect(isDatetimeString('9999-12-31T23:59:00-00:01')).toBe(false) + }) +}) + +describe(isDatetimeStringLenient, () => { + describe('Interop valid', () => { + test.each(interopValid)('%s', (dt) => { + expect(isDatetimeStringLenient(dt)).toBe(true) + }) + }) + + // Because of it leniency, the "isDatetimeStringLenient" implementation does + // not fail on some of the invalid syntax cases, so these tests are skipped. + describe.skip('Interop invalid syntax', () => { + test.each(interopInvalidSyntax)('%s', (dt) => { + expect(isDatetimeStringLenient(dt)).toBe(false) + }) + }) + + describe('Interop invalid parse', () => { + test.each(interopInvalidParse)('%s', (dt) => { + expect(isDatetimeStringLenient(dt)).toBe(false) + }) + }) + + describe('Legacy valid', () => { + test.each(legacyValid)('%s', (dt) => { + expect(isDatetimeStringLenient(dt)).toBe(true) + }) }) }) describe(normalizeDatetime, () => { - describe('valid interop', () => { - for (const dt of interopValid) { - test(dt, () => { - expect(() => normalizeDatetime(dt)).not.toThrow() - }) - } + describe('Interop valid', () => { + test.each(interopValid)('%s', (dt) => { + expect(() => normalizeDatetime(dt)).not.toThrow() + }) }) // @NOTE Normalize will actually succeed on some of the invalid syntax cases, // because it is more lenient than the regex validation. + describe.skip('Interop invalid syntax', () => { + test.each(interopInvalidSyntax)('%s', (dt) => { + expect(() => normalizeDatetime(dt)).toThrow(InvalidDatetimeError) + }) + }) - // describe('fails on interop (invalid syntax)', () => { - // for (const dt of interopInvalidSyntax) { - // test(dt, () => { - // expect(() => normalizeDatetime(dt)).toThrow(InvalidDatetimeError) - // }) - // } - // }) - - describe('fails on interop (invalid parse)', () => { - for (const dt of interopInvalidParse) { - test(dt, () => { - expect(() => normalizeDatetime(dt)).toThrow(InvalidDatetimeError) - }) - } + describe('Interop invalid parse', () => { + test.each(interopInvalidParse)('%s', (dt) => { + expect(() => normalizeDatetime(dt)).toThrow(InvalidDatetimeError) + }) }) it('normalizes valid input', () => { @@ -220,30 +251,24 @@ describe(normalizeDatetimeAlways, () => { ) }) - describe('valid interop', () => { - for (const dt of interopValid) { - test(dt, () => { - // @NOTE we can't test the returned value as some will normalize while others won't. - expect(() => normalizeDatetimeAlways(dt)).not.toThrow() - }) - } + describe('Interop valid', () => { + test.each(interopValid)('%s', (dt) => { + // @NOTE we can't test the returned value as some will normalize while others won't. + expect(() => normalizeDatetimeAlways(dt)).not.toThrow() + }) }) - describe('succeeds on interop (invalid syntax)', () => { - for (const dt of interopInvalidSyntax) { - test(dt, () => { - // @NOTE we can't test the returned value as some will normalize while others won't. - expect(() => normalizeDatetimeAlways(dt)).not.toThrow() - }) - } + describe('Interop invalid syntax', () => { + test.each(interopInvalidSyntax)('%s', (dt) => { + // @NOTE we can't test the returned value as some will normalize while others won't. + expect(() => normalizeDatetimeAlways(dt)).not.toThrow() + }) }) - describe('succeeds on interop invalid parse', () => { - for (const dt of interopInvalidParse) { - test(dt, () => { - expect(normalizeDatetimeAlways(dt)).toEqual('1970-01-01T00:00:00.000Z') - }) - } + describe('Interop invalid parse', () => { + test.each(interopInvalidParse)('%s', (dt) => { + expect(normalizeDatetimeAlways(dt)).toEqual('1970-01-01T00:00:00.000Z') + }) }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03b6014485c..5f3751bd714 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1062,9 +1062,6 @@ importers: '@standard-schema/spec': specifier: ^1.1.0 version: 1.1.0 - iso-datestring-validator: - specifier: ^2.2.2 - version: 2.2.2 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1130,9 +1127,6 @@ importers: '@atproto/syntax': specifier: workspace:^ version: link:../syntax - iso-datestring-validator: - specifier: ^2.2.2 - version: 2.2.2 multiformats: specifier: ^13.0.0 version: 13.4.2 @@ -2032,6 +2026,9 @@ importers: packages/syntax: dependencies: + iso-datestring-validator: + specifier: ^2.2.2 + version: 2.2.2 tslib: specifier: ^2.8.1 version: 2.8.1 From 54419a67f139a45461fcc36267e574ee1d8534ac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 03:36:05 -0700 Subject: [PATCH 48/87] Version packages (#4956) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/afraid-islands-swim.md | 5 ----- .changeset/goofy-pans-hang.md | 6 ------ .changeset/khaki-socks-worry.md | 5 ----- .changeset/salty-flies-sleep.md | 5 ----- .changeset/true-carpets-grab.md | 5 ----- packages/lex/lex-schema/CHANGELOG.md | 11 +++++++++++ packages/lex/lex-schema/package.json | 2 +- packages/lexicon/CHANGELOG.md | 13 +++++++++++++ packages/lexicon/package.json | 2 +- packages/syntax/CHANGELOG.md | 6 ++++++ packages/syntax/package.json | 2 +- 11 files changed, 33 insertions(+), 29 deletions(-) delete mode 100644 .changeset/afraid-islands-swim.md delete mode 100644 .changeset/goofy-pans-hang.md delete mode 100644 .changeset/khaki-socks-worry.md delete mode 100644 .changeset/salty-flies-sleep.md delete mode 100644 .changeset/true-carpets-grab.md diff --git a/.changeset/afraid-islands-swim.md b/.changeset/afraid-islands-swim.md deleted file mode 100644 index c5a58e403b0..00000000000 --- a/.changeset/afraid-islands-swim.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lex-schema': patch ---- - -Fixes a bug that would reject valid `datetime` atproto strings in non-strict validation diff --git a/.changeset/goofy-pans-hang.md b/.changeset/goofy-pans-hang.md deleted file mode 100644 index b181642b270..00000000000 --- a/.changeset/goofy-pans-hang.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@atproto/lex-schema': patch -'@atproto/lexicon': patch ---- - -Use datetime validation utility from `@atproto/syntax` diff --git a/.changeset/khaki-socks-worry.md b/.changeset/khaki-socks-worry.md deleted file mode 100644 index ccdce507c2a..00000000000 --- a/.changeset/khaki-socks-worry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lexicon': patch ---- - -Fix datetime validation that would reject valid atproto datetime strings (e.g. `1985-04-12T23:20:50.1234567890Z` & `1985-04-12T23:20:50.123+01:45`) diff --git a/.changeset/salty-flies-sleep.md b/.changeset/salty-flies-sleep.md deleted file mode 100644 index fc070375663..00000000000 --- a/.changeset/salty-flies-sleep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/lexicon': patch ---- - -Improve performances of string validation utilities (and drop use of deprecated functions) diff --git a/.changeset/true-carpets-grab.md b/.changeset/true-carpets-grab.md deleted file mode 100644 index 46fe29e83e6..00000000000 --- a/.changeset/true-carpets-grab.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@atproto/syntax': patch ---- - -Add `isDatetimeStringLenient` datetime validation utility diff --git a/packages/lex/lex-schema/CHANGELOG.md b/packages/lex/lex-schema/CHANGELOG.md index e8951fe6e3f..3aeb1b60a67 100644 --- a/packages/lex/lex-schema/CHANGELOG.md +++ b/packages/lex/lex-schema/CHANGELOG.md @@ -1,5 +1,16 @@ # @atproto/lex-schema +## 0.1.1 + +### Patch Changes + +- [#4955](https://github.com/bluesky-social/atproto/pull/4955) [`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fixes a bug that would reject valid `datetime` atproto strings in non-strict validation + +- [#4955](https://github.com/bluesky-social/atproto/pull/4955) [`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Use datetime validation utility from `@atproto/syntax` + +- Updated dependencies [[`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8)]: + - @atproto/syntax@0.6.1 + ## 0.1.0 ### Minor Changes diff --git a/packages/lex/lex-schema/package.json b/packages/lex/lex-schema/package.json index 781424b0473..889652dfee0 100644 --- a/packages/lex/lex-schema/package.json +++ b/packages/lex/lex-schema/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lex-schema", - "version": "0.1.0", + "version": "0.1.1", "engines": { "node": ">=22" }, diff --git a/packages/lexicon/CHANGELOG.md b/packages/lexicon/CHANGELOG.md index 2c9bce79282..6c9a36ac05c 100644 --- a/packages/lexicon/CHANGELOG.md +++ b/packages/lexicon/CHANGELOG.md @@ -1,5 +1,18 @@ # @atproto/lexicon +## 0.7.1 + +### Patch Changes + +- [#4955](https://github.com/bluesky-social/atproto/pull/4955) [`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Use datetime validation utility from `@atproto/syntax` + +- [#4955](https://github.com/bluesky-social/atproto/pull/4955) [`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Fix datetime validation that would reject valid atproto datetime strings (e.g. `1985-04-12T23:20:50.1234567890Z` & `1985-04-12T23:20:50.123+01:45`) + +- [#4955](https://github.com/bluesky-social/atproto/pull/4955) [`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Improve performances of string validation utilities (and drop use of deprecated functions) + +- Updated dependencies [[`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8)]: + - @atproto/syntax@0.6.1 + ## 0.7.0 ### Minor Changes diff --git a/packages/lexicon/package.json b/packages/lexicon/package.json index 9dc6626b3d4..758155fee31 100644 --- a/packages/lexicon/package.json +++ b/packages/lexicon/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/lexicon", - "version": "0.7.0", + "version": "0.7.1", "engines": { "node": ">=22" }, diff --git a/packages/syntax/CHANGELOG.md b/packages/syntax/CHANGELOG.md index 5c426b505b5..b3a6e291c2d 100644 --- a/packages/syntax/CHANGELOG.md +++ b/packages/syntax/CHANGELOG.md @@ -1,5 +1,11 @@ # @atproto/syntax +## 0.6.1 + +### Patch Changes + +- [#4955](https://github.com/bluesky-social/atproto/pull/4955) [`20c5cc1`](https://github.com/bluesky-social/atproto/commit/20c5cc187aab538435c669c6e19a2d2f658af5f8) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add `isDatetimeStringLenient` datetime validation utility + ## 0.6.0 ### Minor Changes diff --git a/packages/syntax/package.json b/packages/syntax/package.json index e3b20d266e8..3315890541f 100644 --- a/packages/syntax/package.json +++ b/packages/syntax/package.json @@ -1,6 +1,6 @@ { "name": "@atproto/syntax", - "version": "0.6.0", + "version": "0.6.1", "engines": { "node": ">=22" }, From 25e02339a383740e762c9a9633a701d2fb0cab86 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Tue, 19 May 2026 13:13:10 +0200 Subject: [PATCH 49/87] Add applyWrites() method to Lex SDK Client (#4895) * Add applyWrites() method to Lex SDK Client * lex readme * review changes * add credit to changeset * tidy * tidy tidy * remove async * fix doc * tidy --- .changeset/tangy-berries-try.md | 9 ++ packages/lex/lex-client/scripts/lex-build.mjs | 2 + packages/lex/lex-client/src/client.ts | 133 +++++++++++------ packages/lex/lex-client/src/util.ts | 34 +++++ .../lex-client/src/write-operation-builder.ts | 110 ++++++++++++++ packages/lex/lex-client/tests/client.test.ts | 135 +++++++++++++++++- packages/lex/lex/README.md | 59 ++++++-- 7 files changed, 422 insertions(+), 60 deletions(-) create mode 100644 .changeset/tangy-berries-try.md create mode 100644 packages/lex/lex-client/src/write-operation-builder.ts diff --git a/.changeset/tangy-berries-try.md b/.changeset/tangy-berries-try.md new file mode 100644 index 00000000000..aa784bfe4b8 --- /dev/null +++ b/.changeset/tangy-berries-try.md @@ -0,0 +1,9 @@ +--- +'@atproto/lex': patch +'@atproto/lex-client': patch +--- + +Add `applyWrites()` method to Lex SDK client class + + +Thank you [@TrySound](https://github.com/TrySound) for the suggestion diff --git a/packages/lex/lex-client/scripts/lex-build.mjs b/packages/lex/lex-client/scripts/lex-build.mjs index c61dfada1d9..9e9fdd0fa04 100644 --- a/packages/lex/lex-client/scripts/lex-build.mjs +++ b/packages/lex/lex-client/scripts/lex-build.mjs @@ -13,6 +13,7 @@ Promise.all([ out: join(__dirname, '..', 'src', 'lexicons'), clear: true, include: [ + 'com.atproto.repo.applyWrites', 'com.atproto.repo.createRecord', 'com.atproto.repo.deleteRecord', 'com.atproto.repo.getRecord', @@ -34,6 +35,7 @@ Promise.all([ clear: true, include: [ 'app.bsky.*', + 'com.atproto.repo.applyWrites', 'com.atproto.repo.createRecord', 'com.atproto.repo.getRecord', 'com.atproto.repo.uploadBlob', diff --git a/packages/lex/lex-client/src/client.ts b/packages/lex/lex-client/src/client.ts index 3da12cbe442..1297b9affae 100644 --- a/packages/lex/lex-client/src/client.ts +++ b/packages/lex/lex-client/src/client.ts @@ -27,10 +27,21 @@ import { } from './response.js' import { BinaryBodyInit, Service } from './types.js' import { + RecordKeyOptions, XrpcRequestHeadersOptions, applyDefaults, buildXrpcRequestHeaders, + getDefaultRecordKey, + getLiteralRecordKey, } from './util.js' +import { + WriteOperation, + WriteOperationCreateOptions, + WriteOperationDeleteOptions, + WriteOperationHelper, + WriteOperationUpdateOptions, + WriteOperationsFactory, +} from './write-operation-builder.js' import { XrpcOptions, XrpcRequestParams, @@ -39,25 +50,31 @@ import { xrpcSafe, } from './xrpc.js' -export type { - AtIdentifierString, - CidString, - DidString, - Infer, - InferMethodInputBody, - InferMethodOutputBody, - InferRecordKey, - LexMap, - LexValue, - LexiconRecordKey, - Main, - NsidString, - Params, +export { + type AtIdentifierString, + type CidString, + type DidString, + type Infer, + type InferMethodInputBody, + type InferMethodOutputBody, + type InferRecordKey, + type LexMap, + type LexValue, + type LexiconRecordKey, + type Main, + type NsidString, + type Params, Procedure, Query, RecordSchema, - Restricted, - TypedLexMap, + type Restricted, + type TypedLexMap, + type WriteOperation, + type WriteOperationCreateOptions, + type WriteOperationDeleteOptions, + WriteOperationHelper, + type WriteOperationUpdateOptions, + type WriteOperationsFactory, } /** @@ -217,6 +234,23 @@ export type ListRecordsOptions = Omit< reverse?: boolean } +/** + * Options for applying a batch of writes (create/update/delete) to an AT Protocol repository. + * + * @see {@link Client.applyWrites} + */ +export type ApplyWritesOptions = Omit< + XrpcOptions, + 'body' +> & { + /** Repository identifier (DID or handle). Defaults to authenticated user's DID. */ + repo?: AtIdentifierString + /** Whether the PDS should validate the records against their lexicon schemas. */ + validate?: boolean + /** Compare-and-swap on the repo commit. If specified, must match current commit. */ + swapCommit?: CidString +} + export type UploadBlobOptions = Omit< XrpcOptions, 'body' @@ -227,13 +261,6 @@ export type GetBlobOptions = Omit< 'params' > -export type RecordKeyOptions< - T extends RecordSchema, - AlsoOptionalWhenRecordKeyIs extends LexiconRecordKey = never, -> = T['key'] extends `literal:${string}` | AlsoOptionalWhenRecordKeyIs - ? { rkey?: InferRecordKey } - : { rkey: InferRecordKey } - /** * Type-safe options for {@link Client.create}, combining record options with key requirements. * @typeParam T - The record schema type @@ -699,6 +726,44 @@ export class Client implements Agent { }) } + /** + * Performs an atomic batch of create, update, and delete operations on records in a repository. + * + * @param builder - A function that receives an {@link ApplyWritesOperations} instance to build the operations + * @param options - ApplyWrites options including repo, validate, swapCommit + * @returns The XRPC response from the applyWrites call + * + * @example + * ```typescript + * const response = await client.applyWrites((op) => [ + * op.create(app.bsky.feed.post, { text: 'Hello!' }), + * op.update(app.bsky.feed.post, { text: 'Updated text' }, { rkey: 'post123' }), + * op.delete(app.bsky.feed.post, 'post456'), + * op.update(app.bsky.actor.profile, { displayName: 'Alice' }), + * ], { + * validate: true, + * }) + * + * for (const result of response.body.results) { + * console.log(result.uri) + * } + * ``` + */ + async applyWrites( + factory: WriteOperationsFactory, + options?: ApplyWritesOptions, + ) { + return this.xrpc(com.atproto.repo.applyWrites, { + ...options, + body: { + repo: options?.repo ?? this.assertDid, + writes: WriteOperationHelper.build(factory), + validate: options?.validate, + swapCommit: options?.swapCommit, + }, + }) + } + /** * Uploads a blob to an AT Protocol repository. * @@ -1002,25 +1067,3 @@ export class Client implements Agent { return { ...body, records, invalid } } } - -function getDefaultRecordKey( - schema: T, -): undefined | InferRecordKey { - // Let the server generate the TID - if (schema.key === 'tid') return undefined - if (schema.key === 'any') return undefined - - return getLiteralRecordKey(schema) -} - -function getLiteralRecordKey( - schema: T, -): InferRecordKey { - if (schema.key.startsWith('literal:')) { - return schema.key.slice(8) as InferRecordKey - } - - throw new TypeError( - `An "rkey" must be provided for record key type "${schema.key}" (${schema.$type})`, - ) -} diff --git a/packages/lex/lex-client/src/util.ts b/packages/lex/lex-client/src/util.ts index 3efa14bf50e..f8d7d5825d2 100644 --- a/packages/lex/lex-client/src/util.ts +++ b/packages/lex/lex-client/src/util.ts @@ -1,3 +1,8 @@ +import { + InferRecordKey, + LexiconRecordKey, + RecordSchema, +} from '@atproto/lex-schema' import type { DidString, Service } from './types.js' export function applyDefaults< @@ -133,3 +138,32 @@ export function toReadableStreamPonyfill( }, }) } + +export type RecordKeyOptions< + T extends RecordSchema, + AlsoOptionalWhenRecordKeyIs extends LexiconRecordKey = never, +> = T['key'] extends `literal:${string}` | AlsoOptionalWhenRecordKeyIs + ? { rkey?: InferRecordKey } + : { rkey: InferRecordKey } + +export function getDefaultRecordKey( + schema: T, +): undefined | InferRecordKey { + // Let the server generate the TID + if (schema.key === 'tid') return undefined + if (schema.key === 'any') return undefined + + return getLiteralRecordKey(schema) +} + +export function getLiteralRecordKey( + schema: T, +): InferRecordKey { + if (schema.key.startsWith('literal:')) { + return schema.key.slice(8) as InferRecordKey + } + + throw new TypeError( + `An "rkey" must be provided for record key type "${schema.key}" (${schema.$type})`, + ) +} diff --git a/packages/lex/lex-client/src/write-operation-builder.ts b/packages/lex/lex-client/src/write-operation-builder.ts new file mode 100644 index 00000000000..ca5e458e0b5 --- /dev/null +++ b/packages/lex/lex-client/src/write-operation-builder.ts @@ -0,0 +1,110 @@ +import { + $Typed, + InferInput, + Main, + RecordSchema, + Restricted, + getMain, +} from '@atproto/lex-schema' +import { com } from './lexicons/index.js' +import { + RecordKeyOptions, + getDefaultRecordKey, + getLiteralRecordKey, +} from './util.js' + +export type WriteOperation = + | $Typed + | $Typed + | $Typed + +export type WriteOperationCreateOptions = + RecordKeyOptions + +export type WriteOperationUpdateOptions = + RecordKeyOptions + +export type WriteOperationDeleteOptions = + RecordKeyOptions + +export type WriteOperationsFactory = ( + helper: WriteOperationHelper, +) => Iterable + +export class WriteOperationHelper { + private constructor() {} + + create( + ns: NonNullable extends WriteOperationCreateOptions + ? Main + : Restricted<'This record type requires an "options" argument'>, + input: Omit, '$type'>, + ): $Typed + create( + ns: Main, + input: Omit, '$type'>, + options: WriteOperationCreateOptions, + ): $Typed + create( + ns: Main, + input: Omit, '$type'>, + options: WriteOperationCreateOptions = {} as WriteOperationCreateOptions, + ): $Typed { + const schema: T = getMain(ns) + const value = schema.build(input) + return com.atproto.repo.applyWrites.create.$build({ + collection: schema.$type, + value, + rkey: options?.rkey ?? getDefaultRecordKey(schema), + }) + } + + update( + ns: NonNullable extends WriteOperationUpdateOptions + ? Main + : Restricted<'This record type requires an "options" argument'>, + input: Omit, '$type'>, + ): $Typed + update( + ns: Main, + input: Omit, '$type'>, + options: WriteOperationUpdateOptions, + ): $Typed + update( + ns: Main, + input: Omit, '$type'>, + options: WriteOperationUpdateOptions = {} as WriteOperationUpdateOptions, + ): $Typed { + const schema: T = getMain(ns) + const value = schema.build(input) + return com.atproto.repo.applyWrites.update.$build({ + collection: schema.$type, + value, + rkey: options?.rkey ?? getLiteralRecordKey(schema), + }) + } + + delete( + ns: NonNullable extends WriteOperationDeleteOptions + ? Main + : Restricted<'This record type requires an "options" argument'>, + ): $Typed + delete( + ns: Main, + options: WriteOperationDeleteOptions, + ): $Typed + delete( + ns: Main, + options: WriteOperationDeleteOptions = {} as WriteOperationDeleteOptions, + ): $Typed { + const schema: T = getMain(ns) + return com.atproto.repo.applyWrites.delete.$build({ + collection: schema.$type, + rkey: options?.rkey ?? getLiteralRecordKey(schema), + }) + } + + static build(factory: WriteOperationsFactory): WriteOperation[] { + return Array.from(factory(new WriteOperationHelper())) + } +} diff --git a/packages/lex/lex-client/tests/client.test.ts b/packages/lex/lex-client/tests/client.test.ts index 9e551346a2d..fdecaef6ac7 100644 --- a/packages/lex/lex-client/tests/client.test.ts +++ b/packages/lex/lex-client/tests/client.test.ts @@ -5,7 +5,7 @@ import { lexParse, lexToJson } from '@atproto/lex-json' import { $Typed, LexValidationError, - toDatetimeString, + currentDatetimeString, } from '@atproto/lex-schema' import { Action, @@ -465,7 +465,7 @@ describe('Client', () => { const aliceGenerator = await client.create(app.bsky.feed.generator, { did, displayName: 'Alice Generator', - createdAt: toDatetimeString(new Date()), + createdAt: currentDatetimeString(), }) expect(nextTid).toHaveBeenCalledTimes(1) @@ -485,7 +485,7 @@ describe('Client', () => { const newPost = await client.create(app.bsky.feed.post, { text: 'Hello, world!', - createdAt: toDatetimeString(new Date()), + createdAt: currentDatetimeString(), }) expect(nextTid).toHaveBeenCalledTimes(2) @@ -638,7 +638,7 @@ describe('Client', () => { // @ts-expect-error invalid DID did: 'not-a-did', displayName: 'Test', - createdAt: toDatetimeString(new Date()), + createdAt: currentDatetimeString(), }, { rkey: 'test', validateRequest: true }, ), @@ -666,7 +666,7 @@ describe('Client', () => { // @ts-expect-error invalid DID did: 'not-a-did', displayName: 'Test', - createdAt: toDatetimeString(new Date()), + createdAt: currentDatetimeString(), }, { rkey: 'test', validateRequest: false }, ) @@ -689,7 +689,7 @@ describe('Client', () => { // @ts-expect-error invalid DID did: 'not-a-did', displayName: 'Test', - createdAt: toDatetimeString(new Date()), + createdAt: currentDatetimeString(), }, { rkey: 'test' }, ) @@ -730,7 +730,7 @@ describe('Client', () => { did, // @ts-expect-error wrong type displayName: 123, - createdAt: toDatetimeString(new Date()), + createdAt: currentDatetimeString(), }, { rkey: 'test', validateRequest: true }, ), @@ -805,5 +805,126 @@ describe('Client', () => { expect(fetchHandler).toHaveBeenCalled() }) }) + + describe('applyWrites()', () => { + it('allows applying multiple writes in a single request', async () => { + const fetchHandler = vi.fn(async (path, init) => { + const request = new Request(new URL(path, 'http://localhost'), init) + expect(request.method).toBe('POST') + + const payload = com.atproto.repo.applyWrites.main.input.schema.parse( + lexParse(await request.text()), + ) + + let cid = 0 + const body: com.atproto.repo.applyWrites.$OutputBody = { + results: payload.writes.map((write) => { + if (com.atproto.repo.applyWrites.create.$isTypeOf(write)) { + return com.atproto.repo.applyWrites.createResult.$build({ + uri: `at://${did}/${write.collection}/${write.rkey ?? '2222222222222'}`, + cid: `${++cid}`, + }) + } + if (com.atproto.repo.applyWrites.update.$isTypeOf(write)) { + return com.atproto.repo.applyWrites.updateResult.$build({ + uri: `at://${did}/${write.collection}/${write.rkey}`, + cid: `${++cid}`, + }) + } + if (com.atproto.repo.applyWrites.delete.$isTypeOf(write)) { + return com.atproto.repo.applyWrites.deleteResult.$build({ + uri: `at://${did}/${write.collection}/${write.rkey}`, + }) + } + + throw new Error('Unknown write type') + }), + } + return Response.json(body) + }) + + const client = new Client( + { fetchHandler, did }, + { validateResponse: false }, + ) + + const { body } = await client.applyWrites((op) => [ + op.create(app.bsky.feed.post, { + text: 'Hello, world!', + createdAt: currentDatetimeString(), + }), + + op.update(app.bsky.actor.profile, { + displayName: 'Alice', + }), + + op.delete(app.bsky.feed.post, { + rkey: 'old-post', + }), + + op.delete(app.bsky.actor.profile), + ]) + + expect(fetchHandler).toHaveBeenCalledTimes(1) + expect(body.results).toEqual([ + { + $type: 'com.atproto.repo.applyWrites#createResult', + uri: `at://${did}/app.bsky.feed.post/2222222222222`, + cid: '1', + }, + { + $type: 'com.atproto.repo.applyWrites#updateResult', + uri: `at://${did}/app.bsky.actor.profile/self`, + cid: '2', + }, + { + $type: 'com.atproto.repo.applyWrites#deleteResult', + uri: `at://${did}/app.bsky.feed.post/old-post`, + }, + { + $type: 'com.atproto.repo.applyWrites#deleteResult', + uri: `at://${did}/app.bsky.actor.profile/self`, + }, + ]) + }) + + it('expects an options argument when rkey is needed', async () => { + const fetchHandler = vi.fn(async (path, init) => { + const request = new Request(new URL(path, 'http://localhost'), init) + expect(request.method).toBe('POST') + const payload = com.atproto.repo.applyWrites.main.input.schema.parse( + lexParse(await request.text()), + ) + + expect(payload.writes).toHaveLength(2) + + return Response.json({}) + }) + const client = new Client( + { fetchHandler, did }, + { validateResponse: false }, + ) + + await client.applyWrites(function* (op) { + yield op.delete(app.bsky.actor.profile) + yield op.update(app.bsky.actor.profile, { displayName: 'Alice' }) + + expect(() => { + // @ts-expect-error + op.update(app.bsky.feed.post, { + text: 'Alice', + createdAt: currentDatetimeString(), + }) + }).toThrow() + + expect(() => { + // @ts-expect-error + op.delete(app.bsky.feed.post) + }).toThrow() + }) + + expect(fetchHandler).toHaveBeenCalledTimes(1) + }) + }) }) }) diff --git a/packages/lex/lex/README.md b/packages/lex/lex/README.md index 559a17810a0..160355c0a9a 100644 --- a/packages/lex/lex/README.md +++ b/packages/lex/lex/README.md @@ -231,7 +231,7 @@ import * as app from './lexicons/app.js' const post = app.bsky.feed.post.$build({ // No need to specify $type when using $build text: 'Hello, world!', - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), }) // For runtime validation, use $parse()/$validate() instead @@ -275,7 +275,7 @@ import * as app from './lexicons/app.js' const data = { $type: 'app.bsky.feed.post', text: 'Hello!', - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), } if (app.bsky.feed.post.$check(data)) { @@ -296,7 +296,7 @@ try { const post = app.bsky.feed.post.$main.$parse({ $type: 'app.bsky.feed.post', text: 'Hello!', - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), }) // post is now typed and validated console.log(post.text) @@ -320,7 +320,7 @@ import * as app from './lexicons/app.js' const value = { $type: 'app.bsky.feed.post', text: 'Hello!', - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), } // Throws if no valid @@ -340,7 +340,7 @@ import * as app from './lexicons/app.js' const result = app.bsky.feed.post.$safeParse({ $type: 'app.bsky.feed.post', text: 'Hello!', - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), }) if (result.success) { @@ -374,7 +374,7 @@ const like = app.bsky.feed.like.$build({ uri: 'at://did:plc:abc/app.bsky.feed.post/123', cid: 'bafyrei...', }, - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), }) ``` @@ -655,7 +655,7 @@ import * as app from './lexicons/app.js' const result = await client.create(app.bsky.feed.post, { text: 'Hello, world!', - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), }) console.log(result.uri) // at://did:plc:... @@ -749,6 +749,49 @@ if (result.cursor) { } ``` +#### `client.applyWrites()` + +Perform an atomic batch of create, update, and delete operations in a single request. + +```typescript +import { l } from '@atproto/lex' +import * as app from './lexicons/app.js' + +const response = await client.applyWrites((op) => [ + // Create a new post + op.create(app.bsky.feed.post, { + text: 'Hello, world!', + createdAt: l.currentDatetimeString(), + }), + + // Update profile + op.update(app.bsky.actor.profile, { + displayName: 'Alice', + description: 'Updated bio', + }), + + // Delete an existing post by rkey + op.delete(app.bsky.feed.post, { + rkey: '3jxf7z2k3q2', + }), +]) + +// Check results +for (const result of response.body.results) { + console.log(result.uri, result.cid) +} +``` + +Options: + +- `repo` - Repository identifier (defaults to authenticated user's DID) +- `validate` - Asks the PDS to validate records against schema +- `swapCommit` - CID for optimistic concurrency control + +> [!NOTE] +> +> All operations in an `applyWrites()` call are atomic - they either all succeed or all fail together. This is useful for maintaining consistency when making multiple related changes. + ### Error Handling By default, all client methods throw errors when requests fail. For more ergonomic error handling, the client provides "Safe" variants that return errors instead of throwing them. @@ -1174,7 +1217,7 @@ export const likePost: Action< app.bsky.feed.like, { subject: { uri, cid }, - createdAt: l.toDatetimeString(new Date()), + createdAt: l.currentDatetimeString(), }, options, ) From e6c6343bd3727455bd0da12300bb4929a944e4f1 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Tue, 19 May 2026 16:49:06 +0200 Subject: [PATCH 50/87] Improve support for `ArrayBufferLike`-backed `Uint8Array` data (#4954) * Improve support for `ArrayBufferLike`-backed `Uint8Array` data * Fix `NodeJSBuffer` type definition --- .changeset/eighty-bars-cough.md | 5 +++++ .changeset/fresh-eggs-march.md | 5 +++++ .changeset/neat-areas-rule.md | 5 +++++ .changeset/rare-beds-argue.md | 5 +++++ .changeset/small-socks-raise.md | 5 +++++ packages/common/src/buffers.ts | 14 +++++++++----- packages/lex/lex-client/src/types.ts | 16 ++++++---------- packages/lex/lex-client/src/util.ts | 15 ++++++++++++++- packages/lex/lex-client/src/xrpc.ts | 10 +++++----- packages/lex/lex-data/src/lib/nodejs-buffer.ts | 16 ++++++++++++---- packages/lex/lex-data/src/uint8array-concat.ts | 2 +- .../src/browser-runtime-implementation.ts | 2 +- .../oauth-client/src/runtime-implementation.ts | 2 +- packages/pds/tests/sync/invertible-ops.test.ts | 4 +--- 14 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 .changeset/eighty-bars-cough.md create mode 100644 .changeset/fresh-eggs-march.md create mode 100644 .changeset/neat-areas-rule.md create mode 100644 .changeset/rare-beds-argue.md create mode 100644 .changeset/small-socks-raise.md diff --git a/.changeset/eighty-bars-cough.md b/.changeset/eighty-bars-cough.md new file mode 100644 index 00000000000..5f1e9ceb093 --- /dev/null +++ b/.changeset/eighty-bars-cough.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-client': patch +--- + +Allow `SharedArrayBuffer`-backed `Uint8Array` to be used as `BinaryBodyInit` (used for binary request bodies and unknown response payloads) diff --git a/.changeset/fresh-eggs-march.md b/.changeset/fresh-eggs-march.md new file mode 100644 index 00000000000..b389e6034cf --- /dev/null +++ b/.changeset/fresh-eggs-march.md @@ -0,0 +1,5 @@ +--- +'@atproto/lex-data': patch +--- + +Fix typing of internal NodeJS buffer diff --git a/.changeset/neat-areas-rule.md b/.changeset/neat-areas-rule.md new file mode 100644 index 00000000000..1b21088bf50 --- /dev/null +++ b/.changeset/neat-areas-rule.md @@ -0,0 +1,5 @@ +--- +'@atproto/common': patch +--- + +Add back support for any `Uint8Array` as input to the `ui8ToArrayBuffer` helper diff --git a/.changeset/rare-beds-argue.md b/.changeset/rare-beds-argue.md new file mode 100644 index 00000000000..8a15f9fd2ae --- /dev/null +++ b/.changeset/rare-beds-argue.md @@ -0,0 +1,5 @@ +--- +'@atproto/pds': patch +--- + +Remove un-necessary type casting diff --git a/.changeset/small-socks-raise.md b/.changeset/small-socks-raise.md new file mode 100644 index 00000000000..6a936d1acd1 --- /dev/null +++ b/.changeset/small-socks-raise.md @@ -0,0 +1,5 @@ +--- +'@atproto/oauth-client': patch +--- + +Allow custom `RuntimeImplementation` to return a `SharedArrayBuffer`-backed `Uint8Array` from the `digest()` method. Input to this function will always be `Uint8Array`. diff --git a/packages/common/src/buffers.ts b/packages/common/src/buffers.ts index 16e6e2bc86b..d4450b64572 100644 --- a/packages/common/src/buffers.ts +++ b/packages/common/src/buffers.ts @@ -2,9 +2,13 @@ export function ui8ToBuffer(bytes: Uint8Array): Buffer { return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength) } -export function ui8ToArrayBuffer(bytes: Uint8Array): ArrayBuffer { - return bytes.buffer.slice( - bytes.byteOffset, - bytes.byteLength + bytes.byteOffset, - ) +export function ui8ToArrayBuffer(bytes: Uint8Array): ArrayBuffer { + if (bytes.buffer instanceof ArrayBuffer) { + return bytes.buffer.slice( + bytes.byteOffset, + bytes.byteLength + bytes.byteOffset, + ) + } + + return new Uint8Array(bytes).buffer } diff --git a/packages/lex/lex-client/src/types.ts b/packages/lex/lex-client/src/types.ts index a7a5869f45e..78479ea41b7 100644 --- a/packages/lex/lex-client/src/types.ts +++ b/packages/lex/lex-client/src/types.ts @@ -46,18 +46,14 @@ export type Service = `${DidString}#${DidServiceIdentifier}` * const file: BinaryBodyInit = fileInput.files[0] * await client.xrpc(uploadMethod, { body: file }) * ``` - * - * @note Uint8Array is parameterized with ArrayBuffer (not ArrayBufferLike) - * because fetch's BodyInit requires ArrayBuffer-backed views — - * SharedArrayBuffer is not supported for network I/O. */ export type BinaryBodyInit = - | Uint8Array - | ArrayBuffer - | Blob - | ReadableStream> - | AsyncIterable> | string + | Blob + | Uint8Array + | ArrayBuffer + | ReadableStream + | AsyncIterable export type EncodingString = `${string}/${string}` @@ -68,7 +64,7 @@ export function isEncodingString( } export type XrpcUnknownResponsePayload< - TBinary extends BinaryBodyInit = Uint8Array, + TBinary extends BinaryBodyInit = Uint8Array, > = { encoding: EncodingString body: LexValue | TBinary diff --git a/packages/lex/lex-client/src/util.ts b/packages/lex/lex-client/src/util.ts index f8d7d5825d2..15adbf92a6f 100644 --- a/packages/lex/lex-client/src/util.ts +++ b/packages/lex/lex-client/src/util.ts @@ -60,6 +60,19 @@ export function isAsyncIterable( ) } +export function asUint8ArrayArrayBuffer( + bytes: Uint8Array, +): Uint8Array { + // If the Uint8Array is already backed by a non-shared ArrayBuffer, we can use + // it directly. + if (bytes.buffer instanceof ArrayBuffer) { + return bytes as Uint8Array + } + + // Otherwise, we need to create a new ArrayBuffer and copy the data. + return new Uint8Array(bytes) +} + export type XrpcRequestHeadersOptions = { /** Additional HTTP headers to include in the request. */ headers?: HeadersInit @@ -120,7 +133,7 @@ export function toReadableStreamPonyfill( data: AsyncIterable, ): ReadableStream { let iterator: AsyncIterator | undefined - return new ReadableStream({ + return new ReadableStream({ async pull(controller) { try { iterator ??= data[Symbol.asyncIterator]() diff --git a/packages/lex/lex-client/src/xrpc.ts b/packages/lex/lex-client/src/xrpc.ts index aeb35595c52..a5b73ef3a4d 100644 --- a/packages/lex/lex-client/src/xrpc.ts +++ b/packages/lex/lex-client/src/xrpc.ts @@ -19,6 +19,7 @@ import { XrpcResponse, XrpcResponseOptions } from './response.js' import { BinaryBodyInit } from './types.js' import { XrpcRequestHeadersOptions, + asUint8ArrayArrayBuffer, buildXrpcRequestHeaders, isAsyncIterable, isBlobLike, @@ -336,17 +337,16 @@ function xrpcProcedureInput( case 'object': { if (body === null) break if (ArrayBuffer.isView(body)) { - return buildPayload( - input, - body as Uint8Array, - encodingHint, - ) + return buildPayload(input, asUint8ArrayArrayBuffer(body), encodingHint) } else if ( body instanceof ArrayBuffer || body instanceof ReadableStream ) { return buildPayload(input, body, encodingHint) } else if (isAsyncIterable(body)) { + // @NOTE While fetch() does not allow SharedArrayBuffer-backed + // Uint8Arrays as "body", it **does** allow using ReadableStreams made + // of Uint8Arrays (tested on NodeJS 22) as "body". return buildPayload(input, toReadableStream(body), encodingHint) } else if (isBlobLike(body)) { return buildPayload(input, body, encodingHint || body.type) diff --git a/packages/lex/lex-data/src/lib/nodejs-buffer.ts b/packages/lex/lex-data/src/lib/nodejs-buffer.ts index bbf3107fb67..c2bbc9767d4 100644 --- a/packages/lex/lex-data/src/lib/nodejs-buffer.ts +++ b/packages/lex/lex-data/src/lib/nodejs-buffer.ts @@ -9,20 +9,28 @@ interface NodeJSBuffer extends Uint8Array { byteLength: number toString(encoding?: Encoding): string + slice(start?: number, end?: number): NodeJSBuffer + subarray(start?: number, end?: number): NodeJSBuffer } interface NodeJSBufferConstructor { new (input: string, encoding?: Encoding): NodeJSBuffer from( - input: Uint8Array | ArrayBuffer | ArrayBufferView, + string: WithImplicitCoercion, + encoding?: BufferEncoding, + ): NodeJSBuffer + from( + arrayOrString: WithImplicitCoercion | string>, ): NodeJSBuffer - from(input: string, encoding?: Encoding): NodeJSBuffer from( arrayBuffer: WithImplicitCoercion, byteOffset?: number, length?: number, - ): Buffer - concat(list: readonly Uint8Array[], totalLength?: number): NodeJSBuffer + ): NodeJSBuffer + concat( + list: readonly Uint8Array[], + totalLength?: number, + ): NodeJSBuffer byteLength(input: string, encoding?: Encoding): number prototype: NodeJSBuffer } diff --git a/packages/lex/lex-data/src/uint8array-concat.ts b/packages/lex/lex-data/src/uint8array-concat.ts index 478351c4c30..b40f671e901 100644 --- a/packages/lex/lex-data/src/uint8array-concat.ts +++ b/packages/lex/lex-data/src/uint8array-concat.ts @@ -6,7 +6,7 @@ export const ui8ConcatNode = Buffer ? function ui8ConcatNode( array: readonly Uint8Array[], ): Uint8Array { - return Buffer.concat(array) as Uint8Array + return Buffer.concat(array) } : /* v8 ignore next -- @preserve */ null diff --git a/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts b/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts index 0406e876c0e..f6d7f37b4ae 100644 --- a/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts +++ b/packages/oauth/oauth-client-browser/src/browser-runtime-implementation.ts @@ -46,7 +46,7 @@ export class BrowserRuntimeImplementation implements RuntimeImplementation { async digest( data: Uint8Array, { name }: DigestAlgorithm, - ): Promise> { + ): Promise { switch (name) { case 'sha256': case 'sha384': diff --git a/packages/oauth/oauth-client/src/runtime-implementation.ts b/packages/oauth/oauth-client/src/runtime-implementation.ts index 2236757653d..980bca6b38d 100644 --- a/packages/oauth/oauth-client/src/runtime-implementation.ts +++ b/packages/oauth/oauth-client/src/runtime-implementation.ts @@ -10,7 +10,7 @@ export type DigestAlgorithm = { name: 'sha256' | 'sha384' | 'sha512' } export type RuntimeDigest = ( data: Uint8Array, alg: DigestAlgorithm, -) => Awaitable> +) => Awaitable export type RuntimeLock = ( name: string, diff --git a/packages/pds/tests/sync/invertible-ops.test.ts b/packages/pds/tests/sync/invertible-ops.test.ts index c5decea93f0..4d469923d60 100644 --- a/packages/pds/tests/sync/invertible-ops.test.ts +++ b/packages/pds/tests/sync/invertible-ops.test.ts @@ -65,9 +65,7 @@ describe('invertible ops', () => { const { prevData } = evt if (!prevData) continue - const { blocks, root } = await repo.readCarWithRoot( - evt.blocks as Uint8Array, - ) + const { blocks, root } = await repo.readCarWithRoot(evt.blocks) const storage = new repo.MemoryBlockstore(blocks) const slice = await repo.Repo.load(storage, root) From 53b1e0731ee0d13c350dd96cbcab88447eaad441 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Tue, 19 May 2026 18:42:48 +0200 Subject: [PATCH 51/87] Fix compilation of protobuf files (#4960) --- .changeset/wet-clowns-retire.md | 6 ++++++ package.json | 2 +- packages/bsky/buf.gen.yaml | 2 +- packages/bsky/package.json | 7 ++++--- packages/bsky/src/proto/bsky_connect.ts | 2 +- packages/bsky/src/proto/bsync_connect.ts | 2 +- packages/bsky/src/proto/courier_connect.ts | 2 +- packages/bsky/src/proto/rolodex_connect.ts | 2 +- packages/bsync/buf.gen.yaml | 2 +- packages/bsync/package.json | 4 +++- packages/bsync/src/proto/bsync_connect.ts | 2 +- 11 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 .changeset/wet-clowns-retire.md diff --git a/.changeset/wet-clowns-retire.md b/.changeset/wet-clowns-retire.md new file mode 100644 index 00000000000..f69c5b25e78 --- /dev/null +++ b/.changeset/wet-clowns-retire.md @@ -0,0 +1,6 @@ +--- +'@atproto/bsync': patch +'@atproto/bsky': patch +--- + +Update protobuf to add `.js` extension diff --git a/package.json b/package.json index 740223a3534..938306b58c2 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "verify:types": "tsc --build tsconfig.json", "format": "pnpm lint:fix && pnpm style:fix", "precodegen": "pnpm run --recursive --stream --filter '@atproto/lex-cli...' --filter '@atproto/lex...' build --force", - "codegen": "pnpm run --sort --recursive --stream --parallel codegen", + "codegen": "pnpm run --sort --recursive --stream --parallel '/^(codegen|codegen:.+)$/'", "build": "pnpm run --sort --recursive --stream build", "i18n": "pnpm run --parallel i18n:extract", "dev": "NODE_ENV=development pnpm run --recursive --parallel --stream '/^(dev|dev:.+)$/'", diff --git a/packages/bsky/buf.gen.yaml b/packages/bsky/buf.gen.yaml index a7ecaa0a540..ed380bd9b4a 100644 --- a/packages/bsky/buf.gen.yaml +++ b/packages/bsky/buf.gen.yaml @@ -8,5 +8,5 @@ plugins: - plugin: connect-es opt: - target=ts - - import_extension= + - import_extension=.js out: src/proto diff --git a/packages/bsky/package.json b/packages/bsky/package.json index 154b4273395..f467b3d4067 100644 --- a/packages/bsky/package.json +++ b/packages/bsky/package.json @@ -14,15 +14,16 @@ "directory": "packages/bsky" }, "scripts": { - "codegen": "lex build --clear --indexFile --lexicons ../../lexicons", - "prebuild": "pnpm run codegen", + "codegen:buf": "buf generate ../bsync/proto && buf generate ./proto", + "codegen:lex": "lex build --clear --indexFile --lexicons ../../lexicons", + "prebuild": "pnpm run '/^(codegen:.+)$/'", "build": "tsc --build tsconfig.build.json", "start": "node --enable-source-maps dist/bin.js", "test": "../dev-infra/with-test-redis-and-db.sh vitest run", "test:log": "tail -50 test.log | pino-pretty", "test:updateSnapshot": "../dev-infra/with-test-redis-and-db.sh vitest run --update", "migration:create": "ts-node ./bin/migration-create.ts", - "buf:gen": "buf generate ../bsync/proto && buf generate ./proto" + "buf:gen": ">&2 echo 'DEPRECATED: run `pnpm run codegen:buf` instead ' && pnpm run codegen:buf" }, "engines": { "node": ">=22" diff --git a/packages/bsky/src/proto/bsky_connect.ts b/packages/bsky/src/proto/bsky_connect.ts index a5d08c5ec95..56620437a55 100644 --- a/packages/bsky/src/proto/bsky_connect.ts +++ b/packages/bsky/src/proto/bsky_connect.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=" +// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" // @generated from file bsky.proto (package bsky, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/packages/bsky/src/proto/bsync_connect.ts b/packages/bsky/src/proto/bsync_connect.ts index 83dbb52ed77..86109857190 100644 --- a/packages/bsky/src/proto/bsync_connect.ts +++ b/packages/bsky/src/proto/bsync_connect.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=" +// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" // @generated from file bsync.proto (package bsync, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/packages/bsky/src/proto/courier_connect.ts b/packages/bsky/src/proto/courier_connect.ts index f5632c73d02..144300be462 100644 --- a/packages/bsky/src/proto/courier_connect.ts +++ b/packages/bsky/src/proto/courier_connect.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=" +// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" // @generated from file courier.proto (package courier, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/packages/bsky/src/proto/rolodex_connect.ts b/packages/bsky/src/proto/rolodex_connect.ts index 1544a34e860..6e967afd4c1 100644 --- a/packages/bsky/src/proto/rolodex_connect.ts +++ b/packages/bsky/src/proto/rolodex_connect.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=" +// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" // @generated from file rolodex.proto (package rolodex, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/packages/bsync/buf.gen.yaml b/packages/bsync/buf.gen.yaml index a7ecaa0a540..ed380bd9b4a 100644 --- a/packages/bsync/buf.gen.yaml +++ b/packages/bsync/buf.gen.yaml @@ -8,5 +8,5 @@ plugins: - plugin: connect-es opt: - target=ts - - import_extension= + - import_extension=.js out: src/proto diff --git a/packages/bsync/package.json b/packages/bsync/package.json index 77c6e1f00f6..ac2e8fd2875 100644 --- a/packages/bsync/package.json +++ b/packages/bsync/package.json @@ -14,13 +14,15 @@ "directory": "packages/bsync" }, "scripts": { + "codegen:buf": "buf generate proto", + "prebuild": "pnpm run '/^(codegen:.+)$/'", "build": "tsc --build tsconfig.build.json", "start": "node --enable-source-maps dist/bin.js", "test": "NODE_OPTIONS=--experimental-vm-modules ../dev-infra/with-test-db.sh jest", "test:log": "tail -50 test.log | pino-pretty", "test:updateSnapshot": "jest --updateSnapshot", "migration:create": "ts-node ./bin/migration-create.ts", - "buf:gen": "buf generate proto" + "buf:gen": ">&2 echo 'DEPRECATED: run `pnpm run codegen:buf` instead ' && pnpm run codegen:buf" }, "engines": { "node": ">=22" diff --git a/packages/bsync/src/proto/bsync_connect.ts b/packages/bsync/src/proto/bsync_connect.ts index 83dbb52ed77..86109857190 100644 --- a/packages/bsync/src/proto/bsync_connect.ts +++ b/packages/bsync/src/proto/bsync_connect.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=" +// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" // @generated from file bsync.proto (package bsync, syntax proto3) /* eslint-disable */ // @ts-nocheck From efcc13d2a3b5dfa44ab28bca32292a8edba899cd Mon Sep 17 00:00:00 2001 From: devin ivy Date: Tue, 19 May 2026 13:00:37 -0400 Subject: [PATCH 52/87] Migrate services to dd-trace v5 for ESM tracing (#4961) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgrade dd-trace to v5 in services/pds for ESM support dd-trace v4 only patches CJS require() calls; after the repo's switch to ESM the loader never intercepted the app's import graph. v5 ships register.js, which installs an ESM loader hook compatible with Node 22+. Drop the createRequire shim in tracer.ts now that dd-trace is imported directly, and rely on the loader hook being registered before any other static import resolves. * build * Upgrade dd-trace to v5 in services/bsky, services/bsync, services/ozone Mirrors the pds change: dd-trace v4 (and v3, which these services were pinned to) only patches CJS require() calls, so the loader never intercepted the app's import graph after the repo's switch to ESM. v5's register.js installs an ESM loader hook compatible with Node 22+. Move each service's dd-trace setup into a sibling tracer.ts loaded via node --import. Static ESM imports hoist, so the previous pattern of embedding `require('dd-trace').init(...)` at the top of the entrypoint was no longer running before @atproto/* loaded — a sibling module loaded via --import fully evaluates before the entrypoint's import graph resolves. The bsky service still reaches into dd-trace internals (`_tracer.startSpan`) to relabel dataplane http2 spans; that surface is still present in v5. --- .../workflows/build-and-push-pds-ghcr.yaml | 2 +- pnpm-lock.yaml | 623 ++++++++++-------- services/bsky/Dockerfile | 2 +- services/bsky/api.ts | 57 -- services/bsky/package.json | 2 +- services/bsky/tracer.ts | 53 ++ services/bsync/Dockerfile | 2 +- services/bsync/index.ts | 7 - services/bsync/package.json | 2 +- services/bsync/tracer.ts | 6 + services/ozone/Dockerfile | 2 +- services/ozone/api.ts | 33 +- services/ozone/daemon.ts | 7 - services/ozone/package.json | 2 +- services/ozone/tracer.ts | 24 + services/pds/package.json | 2 +- services/pds/tracer.ts | 10 +- 17 files changed, 449 insertions(+), 387 deletions(-) create mode 100644 services/bsky/tracer.ts create mode 100644 services/bsync/tracer.ts create mode 100644 services/ozone/tracer.ts diff --git a/.github/workflows/build-and-push-pds-ghcr.yaml b/.github/workflows/build-and-push-pds-ghcr.yaml index 68e9afbf8f3..9adbd0ae8e8 100644 --- a/.github/workflows/build-and-push-pds-ghcr.yaml +++ b/.github/workflows/build-and-push-pds-ghcr.yaml @@ -3,7 +3,7 @@ on: push: branches: - main - - msi/pds-lexification + - divy/esm-datadog env: REGISTRY: ghcr.io diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f3751bd714..3c92002a3c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2212,8 +2212,8 @@ importers: specifier: workspace:^ version: link:../../packages/crypto dd-trace: - specifier: 3.13.2 - version: 3.13.2 + specifier: ^5.103.0 + version: 5.103.0(@openfeature/server-sdk@1.21.0) services/bsync: dependencies: @@ -2221,8 +2221,8 @@ importers: specifier: workspace:^ version: link:../../packages/bsync dd-trace: - specifier: 3.13.2 - version: 3.13.2 + specifier: ^5.103.0 + version: 5.103.0(@openfeature/server-sdk@1.21.0) services/ozone: dependencies: @@ -2233,8 +2233,8 @@ importers: specifier: workspace:^ version: link:../../packages/ozone dd-trace: - specifier: 3.13.2 - version: 3.13.2 + specifier: ^5.103.0 + version: 5.103.0(@openfeature/server-sdk@1.21.0) services/pds: dependencies: @@ -2245,8 +2245,8 @@ importers: specifier: ^0.45.0 version: 0.45.1(@opentelemetry/api@1.9.0) dd-trace: - specifier: ^4.18.0 - version: 4.20.0 + specifier: ^5.103.0 + version: 5.103.0(@openfeature/server-sdk@1.21.0) opentelemetry-plugin-better-sqlite3: specifier: ^1.13.0 version: 1.13.0(better-sqlite3@12.9.0) @@ -4692,97 +4692,81 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@datadog/native-appsec@2.0.0: - resolution: {integrity: sha512-XHARZ6MVgbnfOUO6/F3ZoZ7poXHJCNYFlgcyS2Xetuk9ITA5bfcooX2B2F7tReVB+RLJ+j8bsm0t55SyF04KDw==} - engines: {node: '>=12'} + /@datadog/flagging-core@0.3.3: + resolution: {integrity: sha512-LnkTXMVxaCDGCOF2I+CCACndpbi4E8CP8NIsb1IbMmmATzkQHmYiL1ntFcS4mt5kNGAWXNrKquM02jhoiVc+dA==} requiresBuild: true dependencies: - node-gyp-build: 3.9.0 + spark-md5: 3.0.2 dev: false + optional: true - /@datadog/native-appsec@4.0.0: - resolution: {integrity: sha512-myTguXJ3VQHS2E1ylNsSF1avNpDmq5t+K4Q47wdzeakGc3sDIDDyEbvuFTujl9c9wBIkup94O1mZj5DR37ajzA==} - engines: {node: '>=12'} + /@datadog/libdatadog@0.9.3: + resolution: {integrity: sha512-L+scIlcRRRF0qjeSU3VQLQlqezfQHkDdnOdbmx/gLjPqewKSyqVGp7XRdKXYo2vZTzmG8dH6rPKXwgI68UQufw==} requiresBuild: true - dependencies: - node-gyp-build: 3.9.0 - dev: false - - /@datadog/native-iast-rewriter@1.1.2: - resolution: {integrity: sha512-pigRfRtAjZjMjqIXyXb98S4aDnuHz/EmqpoxAajFZsNjBLM87YonwSY5zoBdCsOyA46ddKOJRoCQd5ZalpOFMQ==} - engines: {node: '>= 10'} - dependencies: - node-gyp-build: 4.6.1 - dev: false - - /@datadog/native-iast-rewriter@2.2.1: - resolution: {integrity: sha512-DyZlE8gNa5AoOFNKGRJU4RYF/Y/tJzv4bIAMuVBbEnMA0xhiIYqpYQG8T3OKkALl3VSEeBMjYwuOR2fCrJ6gzA==} - engines: {node: '>= 10'} - dependencies: - lru-cache: 7.18.3 - node-gyp-build: 4.6.1 - dev: false - - /@datadog/native-iast-taint-tracking@1.1.0: - resolution: {integrity: sha512-TOrngpt6Qh52zWFOz1CkFXw0g43rnuUziFBtIMUsOLGzSHr9wdnTnE6HAyuvKy3f3ecAoZESlMfilGRKP93hXQ==} - dependencies: - node-gyp-build: 3.9.0 dev: false + optional: true - /@datadog/native-iast-taint-tracking@1.6.4: - resolution: {integrity: sha512-Owxk7hQ4Dxwv4zJAoMjRga0IvE6lhvxnNc8pJCHsemCWBXchjr/9bqg05Zy5JnMbKUWn4XuZeJD6RFZpRa8bfw==} + /@datadog/native-appsec@11.0.1: + resolution: {integrity: sha512-Y/XfknUmmJcw4hhQVhqzgdQvfjy+EGmXuUBgtVkI1r+/qS00egYu+wD/x7pOvjdbZNqN96znVszAnXvDQAzMDQ==} + engines: {node: '>=16'} requiresBuild: true dependencies: node-gyp-build: 3.9.0 dev: false + optional: true - /@datadog/native-metrics@1.6.0: - resolution: {integrity: sha512-+8jBzd0nlLV+ay3Vb87DLwz8JHAS817hRhSRQ6zxhud9TyvvcNTNN+VA2sb2fe5UK4aMDvj/sGVJjEtgr4RHew==} - engines: {node: '>=12'} + /@datadog/native-iast-taint-tracking@4.1.0: + resolution: {integrity: sha512-g9K9Ddx1YQfrQIC2hgtfnYUGuzAFvSvhvt2lPZOAWBPo+bkYoW5KEkMHoY5XykCigTfXBYcQicRV0xB22AMkHw==} requiresBuild: true dependencies: node-gyp-build: 3.9.0 dev: false + optional: true - /@datadog/native-metrics@2.0.0: - resolution: {integrity: sha512-YklGVwUtmKGYqFf1MNZuOHvTYdKuR4+Af1XkWcMD8BwOAjxmd9Z+97328rCOY8TFUJzlGUPaXzB8j2qgG/BMwA==} - engines: {node: '>=12'} + /@datadog/native-metrics@3.1.2: + resolution: {integrity: sha512-7AEWt0ZLr/ogR/9if1DmFBDTg3y67xM+gdhXUXKs+UQMxK0lnjrOHgN7fkpEmUG1uL+EkX2BDE3ENDlQ23J7OQ==} + engines: {node: '>=16'} requiresBuild: true dependencies: node-addon-api: 6.1.0 node-gyp-build: 3.9.0 dev: false + optional: true - /@datadog/pprof@1.1.1: - resolution: {integrity: sha512-5lYXUpikQhrJwzODtJ7aFM0oKmPccISnTCecuWhjxIj4/7UJv0DamkLak634bgEW+kiChgkKFDapHSesuXRDXQ==} - engines: {node: '>=12'} + /@datadog/openfeature-node-server@1.1.2(@openfeature/server-sdk@1.21.0): + resolution: {integrity: sha512-fr+zCaKoCSdizX22H7eA9Z3QaZrOMu5qU0yK0M2aWtUxokSAKPlLz3+9HdmqwBWU/ikqI+lbiAK0oNdvmUKeQA==} + engines: {node: '>=18.0.0'} requiresBuild: true + peerDependencies: + '@openfeature/server-sdk': '>=1.15.1' dependencies: - delay: 5.0.0 - findit2: 2.2.3 - node-gyp-build: 3.9.0 - p-limit: 3.1.0 - pify: 5.0.0 - protobufjs: 7.2.5 - source-map: 0.7.4 - split: 1.0.1 + '@datadog/flagging-core': 0.3.3 + '@openfeature/server-sdk': 1.21.0(@openfeature/core@1.10.0) dev: false + optional: true - /@datadog/pprof@4.0.1: - resolution: {integrity: sha512-TavqyiyQZOaUM9eQB07r8+K/T1CqKyOdsUGxpN79+BF+eOQBpTj/Cte6KdlhcUSKL3h5hSjC+vlgA7uW2qtVhA==} - engines: {node: '>=14'} + /@datadog/pprof@5.14.1: + resolution: {integrity: sha512-MlODCE9Gltmx7WChOg1BkIm7W2iE4CDW7K72BMwgzCvxFkG9rFWVsuA7/NEZL1nDvJ0qDe2du7DZZdZHTjcVPw==} + engines: {node: '>=16'} requiresBuild: true dependencies: - delay: 5.0.0 node-gyp-build: 3.9.0 - p-limit: 3.1.0 - pprof-format: 2.0.7 + pprof-format: 2.2.1 source-map: 0.7.4 dev: false + optional: true - /@datadog/sketches-js@2.1.0: - resolution: {integrity: sha512-smLocSfrt3s53H/XSVP3/1kP42oqvrkjUPtyaFd1F79ux24oE31BKt+q0c6lsa6hOYrFzsIwyc5GXAI5JmfOew==} + /@datadog/wasm-js-rewriter@5.0.1: + resolution: {integrity: sha512-EzbV3Lrdt3udQEsbDOVC5gB1y7yxfpBbrSIk4jaEsGjyj0Dbv2HGj7tZjs+qXzIzNonHc8h5El2bYZOGfC2wwg==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + js-yaml: 4.1.0 + lru-cache: 7.18.3 + module-details-from-path: 1.0.4 + node-gyp-build: 4.6.1 dev: false + optional: true /@did-plc/lib@0.0.1: resolution: {integrity: sha512-RkY5w9DbYMco3SjeepqIiMveqz35exjlVDipCs2gz9AXF4/cp9hvmrp9zUWEw2vny+FjV8vGEN7QpaXWaO6nhg==} @@ -4837,11 +4821,10 @@ packages: dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 - dev: true optional: true - /@emnapi/runtime@1.4.5: - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + /@emnapi/runtime@1.10.0: + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} requiresBuild: true dependencies: tslib: 2.8.1 @@ -4852,7 +4835,6 @@ packages: requiresBuild: true dependencies: tslib: 2.8.1 - dev: true optional: true /@esbuild/aix-ppc64@0.21.5: @@ -6031,7 +6013,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.10.0 dev: false optional: true @@ -6819,11 +6801,24 @@ packages: requiresBuild: true dependencies: '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.2 dev: true optional: true + /@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + requiresBuild: true + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + dev: false + optional: true + /@noble/curves@1.8.0: resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} engines: {node: ^14.21.3 || >=16} @@ -6882,6 +6877,21 @@ packages: rimraf: 3.0.2 dev: true + /@openfeature/core@1.10.0: + resolution: {integrity: sha512-C3ynxtPYhe5qVJgQIqCNxZXeRXo4t1Eo86uiROr8+sD6F2OjEJGIp6VOGxz+r6jkad2s8Br9BnUJOvskhai/3A==} + dev: false + optional: true + + /@openfeature/server-sdk@1.21.0(@openfeature/core@1.10.0): + resolution: {integrity: sha512-ZBVAiyMeN+dxurcXGJlvuOpYg9X7V923MVCI5dq/kE/5o8ys7MCOPhW44e4PS+XABHzSRTw44hcgWez93xwifw==} + engines: {node: '>=20'} + peerDependencies: + '@openfeature/core': ^1.10.0 + dependencies: + '@openfeature/core': 1.10.0 + dev: false + optional: true + /@opentelemetry/api-logs@0.208.0: resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} engines: {node: '>=8.0.0'} @@ -6889,26 +6899,11 @@ packages: '@opentelemetry/api': 1.9.0 dev: false - /@opentelemetry/api@1.7.0: - resolution: {integrity: sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==} - engines: {node: '>=8.0.0'} - dev: false - /@opentelemetry/api@1.9.0: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} dev: false - /@opentelemetry/core@1.18.1(@opentelemetry/api@1.7.0): - resolution: {integrity: sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.8.0' - dependencies: - '@opentelemetry/api': 1.7.0 - '@opentelemetry/semantic-conventions': 1.18.1 - dev: false - /@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0): resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} @@ -6949,11 +6944,6 @@ packages: - supports-color dev: false - /@opentelemetry/semantic-conventions@1.18.1: - resolution: {integrity: sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==} - engines: {node: '>=14'} - dev: false - /@opentelemetry/semantic-conventions@1.28.0: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} @@ -6964,6 +6954,195 @@ packages: engines: {node: '>=14'} dev: false + /@oxc-parser/binding-android-arm-eabi@0.129.0: + resolution: {integrity: sha512-sG37CfXLlYXdDrggAFO/mKcO4w36piwf862xAZXIuf3nzKhWK1FvW4dqie+06++z+mDto2QeOQSvhyzBeK5jsQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-android-arm64@0.129.0: + resolution: {integrity: sha512-DVyLFN2+S0VOhT6lm5++tFqlu3x2Njiby6y5DhTzjV5uRsZWpifsBn6+yjtwAxl105peEjs5BHE3ToBJuQjLTg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-darwin-arm64@0.129.0: + resolution: {integrity: sha512-QeqThtB8qax4IL+NFBWgshudyKkj5c076L8vyd8PCEx7U1wHyIbH49MEQ5J5iURFhUW5jiFmdnLKEwyOo0GAJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-darwin-x64@0.129.0: + resolution: {integrity: sha512-zn5+7nv4DlK4uFgblmhKm6xRV0QUHXOHyIDkjmhxJ53xSA9ahkb3pHNiHesNPXn/nK/VWU+C+Z6JYHdatZBh7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-freebsd-x64@0.129.0: + resolution: {integrity: sha512-SPTcDBiHWlgRpWFC1jnoi0sBWqCw4DFR+4b8+dV+NAhUu2ONERWyIVIOCfcE9a8BlvZsDCuXf3l/x7wQUs1Rsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-arm-gnueabihf@0.129.0: + resolution: {integrity: sha512-Rgc9+WNKLbc+chyDTXyyJ7gbgLo+ve27CrRnmIwGgucGflrBZbutge5jdPPegcgf46RrR4dkBbMCp0/x16mdig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-arm-musleabihf@0.129.0: + resolution: {integrity: sha512-YtSsJ51VysXqlO8Cs2mWTyXvxBRemTHj4WDQjXwKl0SAxh+CVrEdXrdH+RnjxLj3JCUMFeYuHs5c+/DImfbKkg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-arm64-gnu@0.129.0: + resolution: {integrity: sha512-9oK8iQr9KtgI5JhaJ+5IwiQsXEo6NuasFgovtJGrdK/RxbA0bO4YKRvVY7M+8lozUCVz1U7XrFFODv3emIOPRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-arm64-musl@0.129.0: + resolution: {integrity: sha512-GghE/bf9ZqgqZFxLacgP0ImVD6UiLKQOpvpgUoIsqjopu2ms/+p1L0d0Dv2Sck+8p0FbKS2WE3IjqmIlLbxJgA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-ppc64-gnu@0.129.0: + resolution: {integrity: sha512-A2PW0UbERzKGV6fKX1zoe2Tkc1zVcEJSSPW9IUSKbZAPuPe+M5/5hTA+6fQbWmevabe2B3IDky66a1lFGjpBKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-riscv64-gnu@0.129.0: + resolution: {integrity: sha512-omwxd9H+jrl1T72RI666k4ho7Eli2iHdELzf+dL0D+uXThNZXYJCbKjm5rK2hrHmDy4O+NWv7+khBrEkorLsgw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-riscv64-musl@0.129.0: + resolution: {integrity: sha512-v2hi8id+M8C0uY8uuG2t2a5vr8H9XyHXiHL12yMdMNtgn04nnM/8hlOGuoJuxVc07PhClNiaoSaY2eXehSRa7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-s390x-gnu@0.129.0: + resolution: {integrity: sha512-UXrdDyLh1Obgj5X+IVVXWoo5/FJbFsU8/uLQ/M9lkVUwBUKpRFxNEhzwBNv21qqdKgAh+pr2CCVD8J1JfRPsIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-x64-gnu@0.129.0: + resolution: {integrity: sha512-hsL/3/kdX9FGLqOj8DR3Eki4Y6zO1i3+ZHhiPwX0hDt4n+18abkfUzePCv3h8SShprwCmwdxPnlrebZ5+MZ+cw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-linux-x64-musl@0.129.0: + resolution: {integrity: sha512-kdXvJ4crOeRld3vWl0J0VU4nmnT4pZ3lKGA5tZ1y0UPWsBtElDYd+jsz4lE36tpAbCiWm0M0PG0laUNBSE+Wlw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-openharmony-arm64@0.129.0: + resolution: {integrity: sha512-DusJfcK7EGwf9TEakB+z6SXCLdHGvDZ8U8882bzWb4oVrORHpbkFl9npS7cN3YC2axcVKoktbxZevS1nxVCKFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-wasm32-wasi@0.129.0: + resolution: {integrity: sha512-Iie9CcII+ELSinKFnxTR15xhI9qriVivEhbFh3driRNbzms/5ioDAU0fwe8Mf1FEaz3n2FtiUVX0h0nwKLYk0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + dev: false + optional: true + + /@oxc-parser/binding-win32-arm64-msvc@0.129.0: + resolution: {integrity: sha512-99kH1udLyrts+wGm+u0VhPbogkb2wxc/6J1XMKOpS6Kx5DjBWGRZZfBjfCGI3xKSInpYbZn4TLWLX1Q1GURYwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-win32-ia32-msvc@0.129.0: + resolution: {integrity: sha512-tmSBR1A4yH697qV291xKyDe4OAWFchJ+cXf2wuipx/vK3n5d5Ej9MVLRtXlIcZ38n8qAjsF0/AnskaYgxM151A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@oxc-parser/binding-win32-x64-msvc@0.129.0: + resolution: {integrity: sha512-Z1PbJvkPeLASIUxa3AnrQ5H+vv1K9zC0IGnQqoKfM0ZvsvCSe0d3u5m7d9iuy+HB7GrcElHuwKb0d0qFdtG0iA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@oxc-project/types@0.129.0: + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} + requiresBuild: true + dev: false + optional: true + /@phosphor-icons/react@2.1.10(react-dom@19.0.0)(react@19.0.0): resolution: {integrity: sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA==} engines: {node: '>=10'} @@ -8911,7 +9090,6 @@ packages: requiresBuild: true dependencies: tslib: 2.8.1 - dev: true optional: true /@types/babel__core@7.20.5: @@ -11121,10 +11299,6 @@ packages: engines: {node: '>=8'} dev: false - /crypto-randomuuid@1.0.0: - resolution: {integrity: sha512-/RC5F4l1SCqD/jazwUF6+t34Cd8zTSAGZ7rvvZu1whZUhD2a5MOGKjSGowoGcpj/cbVZk1ZODIooJEQQq3nNAA==} - dev: false - /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -11179,83 +11353,31 @@ packages: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} dev: true - /dc-polyfill@0.1.3: - resolution: {integrity: sha512-Wyk5n/5KUj3GfVKV2jtDbtChC/Ff9fjKsBcg4ZtYW1yQe3DXNHcGURvmoxhqQdfOQ9TwyMjnfyv1lyYcOkFkFA==} + /dc-polyfill@0.1.11: + resolution: {integrity: sha512-TyyeGcjx0YeThAI9fTFtgsvj5qd4R+aGfVmXiUhevbgzWFDr7IK4tv4YjE6jaGzLHQTchk4h7DHdr5q4WGgaZw==} engines: {node: '>=12.17'} dev: false - /dd-trace@3.13.2: - resolution: {integrity: sha512-POO9nEcAufe5pgp2xV1X3PfWip6wh+6TpEcRSlSgZJCIIMvWVCkcIVL/J2a6KAZq6V3Yjbkl8Ktfe+MOzQf5kw==} - engines: {node: '>=14'} - requiresBuild: true - dependencies: - '@datadog/native-appsec': 2.0.0 - '@datadog/native-iast-rewriter': 1.1.2 - '@datadog/native-iast-taint-tracking': 1.1.0 - '@datadog/native-metrics': 1.6.0 - '@datadog/pprof': 1.1.1 - '@datadog/sketches-js': 2.1.0 - crypto-randomuuid: 1.0.0 - diagnostics_channel: 1.1.0 - ignore: 5.2.4 - import-in-the-middle: 1.4.2 - ipaddr.js: 2.1.0 - istanbul-lib-coverage: 3.2.0 - koalas: 1.0.2 - limiter: 1.1.5 - lodash.kebabcase: 4.1.1 - lodash.pick: 4.4.0 - lodash.sortby: 4.7.0 - lodash.uniq: 4.5.0 - lru-cache: 7.18.3 - methods: 1.1.2 - module-details-from-path: 1.0.3 - node-abort-controller: 3.1.1 - opentracing: 0.14.7 - path-to-regexp: 0.1.7 - protobufjs: 7.2.5 - retry: 0.10.1 - semver: 5.7.2 - dev: false - - /dd-trace@4.20.0: - resolution: {integrity: sha512-y7IDLSSt6nww6zMdw/I8oLdfgOQADIOkERCNdfSzlBrXHz5CHimEOFfsHN87ag0mn6vusr06aoi+CQRZSNJz2g==} - engines: {node: '>=16'} + /dd-trace@5.103.0(@openfeature/server-sdk@1.21.0): + resolution: {integrity: sha512-evIKDqY8X/zmbMKyDZ020FmzAf1IxPe0m3AIdo1mHk9YkFmO4S1RIuFuffK8dIA0BYkP56q/iQvmIfCQ5UNsrg==} + engines: {node: '>=18 <26'} requiresBuild: true dependencies: - '@datadog/native-appsec': 4.0.0 - '@datadog/native-iast-rewriter': 2.2.1 - '@datadog/native-iast-taint-tracking': 1.6.4 - '@datadog/native-metrics': 2.0.0 - '@datadog/pprof': 4.0.1 - '@datadog/sketches-js': 2.1.0 - '@opentelemetry/api': 1.7.0 - '@opentelemetry/core': 1.18.1(@opentelemetry/api@1.7.0) - crypto-randomuuid: 1.0.0 - dc-polyfill: 0.1.3 - ignore: 5.2.4 - import-in-the-middle: 1.4.2 - int64-buffer: 0.1.10 - ipaddr.js: 2.1.0 - istanbul-lib-coverage: 3.2.0 - jest-docblock: 29.7.0 - koalas: 1.0.2 - limiter: 1.1.5 - lodash.kebabcase: 4.1.1 - lodash.pick: 4.4.0 - lodash.sortby: 4.7.0 - lodash.uniq: 4.5.0 - lru-cache: 7.18.3 - methods: 1.1.2 - module-details-from-path: 1.0.3 - msgpack-lite: 0.1.26 - node-abort-controller: 3.1.1 - opentracing: 0.14.7 - path-to-regexp: 0.1.7 - pprof-format: 2.0.7 - protobufjs: 7.2.5 - retry: 0.13.1 - semver: 7.5.4 + dc-polyfill: 0.1.11 + import-in-the-middle: 3.0.1 + optionalDependencies: + '@datadog/libdatadog': 0.9.3 + '@datadog/native-appsec': 11.0.1 + '@datadog/native-iast-taint-tracking': 4.1.0 + '@datadog/native-metrics': 3.1.2 + '@datadog/openfeature-node-server': 1.1.2(@openfeature/server-sdk@1.21.0) + '@datadog/pprof': 5.14.1 + '@datadog/wasm-js-rewriter': 5.0.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.208.0 + oxc-parser: 0.129.0 + transitivePeerDependencies: + - '@openfeature/server-sdk' dev: false /debug@2.6.9: @@ -11426,6 +11548,7 @@ packages: /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + dev: true /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} @@ -11435,11 +11558,6 @@ packages: resolution: {integrity: sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==} dev: true - /diagnostics_channel@1.1.0: - resolution: {integrity: sha512-OE1ngLDjSBPG6Tx0YATELzYzy3RKHC+7veQ8gLa8yS7AAgw65mFbVdcsu3501abqOZCEZqZyAIemB0zXlqDSuw==} - engines: {node: '>=4'} - dev: false - /diff-sequences@28.1.1: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -12419,10 +12537,6 @@ packages: cockatiel: 3.2.1 dev: false - /event-lite@0.1.3: - resolution: {integrity: sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==} - dev: false - /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -12944,11 +13058,6 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /findit2@2.2.3: - resolution: {integrity: sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog==} - engines: {node: '>=0.8.22'} - dev: false - /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -13681,6 +13790,7 @@ packages: /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} + dev: true /ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -13733,6 +13843,16 @@ packages: module-details-from-path: 1.0.4 dev: false + /import-in-the-middle@3.0.1: + resolution: {integrity: sha512-pYkiyXVL2Mf3pozdlDGV6NAObxQx13Ae8knZk1UJRJ6uRW/ZRmTGHlQYtrsSl7ubuE5F8CD1z+s1n4RHNuTtuA==} + engines: {node: '>=18'} + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 2.2.0 + module-details-from-path: 1.0.4 + dev: false + /import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -13787,10 +13907,6 @@ packages: through: 2.3.8 dev: true - /int64-buffer@0.1.10: - resolution: {integrity: sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==} - dev: false - /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -14140,10 +14256,6 @@ packages: is-docker: 2.2.1 dev: false - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -14155,11 +14267,6 @@ packages: resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} dev: false - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: false - /istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -14371,13 +14478,6 @@ packages: pretty-format: 30.4.1 dev: true - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: false - /jest-docblock@30.4.0: resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -15007,11 +15107,6 @@ packages: engines: {node: '>=6'} dev: false - /koalas@1.0.2: - resolution: {integrity: sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA==} - engines: {node: '>=0.10.0'} - dev: false - /kysely@0.22.0(patch_hash=5k7pdbhmqkb2cevvbr5z6i5uee): resolution: {integrity: sha512-ZE3qWtnqLOalodzfK5QUEcm7AEulhxsPNuKaGFsC3XiqO92vMLm+mAHk/NnbSIOtC4RmGm0nsv700i8KDp1gfQ==} engines: {node: '>=14.0.0'} @@ -15287,10 +15382,6 @@ packages: lightningcss-win32-x64-msvc: 1.30.2 dev: false - /limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} - dev: false - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -15343,20 +15434,13 @@ packages: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} dev: false - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: false - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.pick@4.4.0: - resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} - dev: false - /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -15366,10 +15450,6 @@ packages: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} dev: false - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false - /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true @@ -16145,16 +16225,6 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /msgpack-lite@0.1.26: - resolution: {integrity: sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==} - hasBin: true - dependencies: - event-lite: 0.1.3 - ieee754: 1.2.1 - int64-buffer: 0.1.10 - isarray: 1.0.0 - dev: false - /multiformats@13.4.2: resolution: {integrity: sha512-eh6eHCrRi1+POZ3dA+Dq1C6jhP1GNtr9CRINMb67OKzqW9I5DUuZM/3jLPlzhgpGeiNUlEGEbkCYChXMCc/8DQ==} @@ -16226,13 +16296,11 @@ packages: semver: 7.7.4 dev: false - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: false - /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true dev: false + optional: true /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -16254,12 +16322,16 @@ packages: /node-gyp-build@3.9.0: resolution: {integrity: sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==} hasBin: true + requiresBuild: true dev: false + optional: true /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true + requiresBuild: true dev: false + optional: true /node-gyp@9.3.1: resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} @@ -16501,11 +16573,6 @@ packages: - supports-color dev: false - /opentracing@0.14.7: - resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==} - engines: {node: '>=0.10'} - dev: false - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -16554,6 +16621,36 @@ packages: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} dev: true + /oxc-parser@0.129.0: + resolution: {integrity: sha512-S6eFI+VLkpyA+/Lf8z6qURjDV6Mgo74SLNznNopHTlQW3hedv2MB/z31kBRuBCCTqZN9HHdva0ojljEhPnBKFA==} + engines: {node: ^20.19.0 || >=22.12.0} + requiresBuild: true + dependencies: + '@oxc-project/types': 0.129.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.129.0 + '@oxc-parser/binding-android-arm64': 0.129.0 + '@oxc-parser/binding-darwin-arm64': 0.129.0 + '@oxc-parser/binding-darwin-x64': 0.129.0 + '@oxc-parser/binding-freebsd-x64': 0.129.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.129.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.129.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.129.0 + '@oxc-parser/binding-linux-arm64-musl': 0.129.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.129.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.129.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.129.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.129.0 + '@oxc-parser/binding-linux-x64-gnu': 0.129.0 + '@oxc-parser/binding-linux-x64-musl': 0.129.0 + '@oxc-parser/binding-openharmony-arm64': 0.129.0 + '@oxc-parser/binding-wasm32-wasi': 0.129.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.129.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.129.0 + '@oxc-parser/binding-win32-x64-msvc': 0.129.0 + dev: false + optional: true + /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -16854,11 +16951,6 @@ packages: engines: {node: '>=6'} dev: true - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - dev: false - /pino-abstract-transport@1.0.0: resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} dependencies: @@ -17009,9 +17101,11 @@ packages: dependencies: xtend: 4.0.2 - /pprof-format@2.0.7: - resolution: {integrity: sha512-1qWaGAzwMpaXJP9opRa23nPnt2Egi7RMNoNBptEE/XwHbcn4fC2b/4U4bKc5arkGkIh2ZabpF2bEb+c5GNHEKA==} + /pprof-format@2.2.1: + resolution: {integrity: sha512-p4tVN7iK19ccDqQv8heyobzUmbHyds4N2FI6aBMcXz6y99MglTWDxIyhFkNaLeEXs6IFUEzT0zya0icbSLLY0g==} + requiresBuild: true dev: false + optional: true /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} @@ -17763,7 +17857,7 @@ packages: engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} dependencies: debug: 4.4.3 - module-details-from-path: 1.0.3 + module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color dev: false @@ -17858,20 +17952,11 @@ packages: signal-exit: 3.0.7 dev: true - /retry@0.10.1: - resolution: {integrity: sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==} - dev: false - /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false - /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -18031,11 +18116,6 @@ packages: /semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: false - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -18375,7 +18455,9 @@ packages: /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + requiresBuild: true dev: false + optional: true /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -18384,6 +18466,12 @@ packages: whatwg-url: 7.1.0 dev: true + /spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + requiresBuild: true + dev: false + optional: true + /spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} dependencies: @@ -18395,12 +18483,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - dependencies: - through: 2.3.8 - dev: false - /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -18857,6 +18939,7 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true /tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} diff --git a/services/bsky/Dockerfile b/services/bsky/Dockerfile index fc1696c38e5..ca1f85238d9 100644 --- a/services/bsky/Dockerfile +++ b/services/bsky/Dockerfile @@ -78,7 +78,7 @@ ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "api.ts"] +CMD ["node", "--heapsnapshot-signal=SIGUSR2", "--enable-source-maps", "--import=./tracer.ts", "api.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="Bsky App View" diff --git a/services/bsky/api.ts b/services/bsky/api.ts index 1ca0c252dfc..19287a32bad 100644 --- a/services/bsky/api.ts +++ b/services/bsky/api.ts @@ -1,47 +1,5 @@ -/* eslint-disable import/order */ -import { createRequire } from 'node:module' import assert from 'node:assert' import cluster from 'node:cluster' -import path from 'node:path' - -const require = createRequire(import.meta.url) -const dd = require('dd-trace') - -dd.tracer - .init() - .use('http2', { - client: true, // calls into dataplane - server: false, - }) - .use('express', { - hooks: { - request: (span: any, req: any) => { - maintainXrpcResource(span, req) - }, - }, - }) - -// modify tracer in order to track calls to dataplane as a service with proper resource names -const DATAPLANE_PREFIX = '/bsky.Service/' -const origStartSpan = dd.tracer._tracer.startSpan -dd.tracer._tracer.startSpan = function (name: string, options: any) { - if ( - name !== 'http.request' || - options?.tags?.component !== 'http2' || - !options?.tags?.['http.url'] - ) { - return origStartSpan.call(this, name, options) - } - const uri = new URL(options.tags['http.url']) - if (!uri.pathname.startsWith(DATAPLANE_PREFIX)) { - return origStartSpan.call(this, name, options) - } - options.tags['service.name'] = 'dataplane-bsky' - options.tags['resource.name'] = uri.pathname.slice(DATAPLANE_PREFIX.length) - return origStartSpan.call(this, name, options) -} - -// Tracer code above must come before anything else import { BskyAppView, ServerConfig } from '@atproto/bsky' import { Secp256k1Keypair } from '@atproto/crypto' @@ -71,21 +29,6 @@ const maybeParseInt = (str: string | undefined) => { return int } -const maintainXrpcResource = (span: any, req: any) => { - // Show actual xrpc method as resource rather than the route pattern - if (span && req.originalUrl?.startsWith('/xrpc/')) { - span.setTag( - 'resource.name', - [ - req.method, - path.posix.join(req.baseUrl || '', req.path || '', '/').slice(0, -1), // Ensures no trailing slash - ] - .filter(Boolean) - .join(' '), - ) - } -} - const workerCount = maybeParseInt(process.env.CLUSTER_WORKER_COUNT) if (workerCount) { diff --git a/services/bsky/package.json b/services/bsky/package.json index 4018bc91ac4..c033eae6723 100644 --- a/services/bsky/package.json +++ b/services/bsky/package.json @@ -6,6 +6,6 @@ "dependencies": { "@atproto/bsky": "workspace:^", "@atproto/crypto": "workspace:^", - "dd-trace": "3.13.2" + "dd-trace": "^5.103.0" } } diff --git a/services/bsky/tracer.ts b/services/bsky/tracer.ts new file mode 100644 index 00000000000..fe5e588fe61 --- /dev/null +++ b/services/bsky/tracer.ts @@ -0,0 +1,53 @@ +// Registers dd-trace's ESM loader hook for the rest of the process. Must be the +// first import so the hook is in place before any other module is resolved. +import 'dd-trace/register.js' +import path from 'node:path' +import ddTrace from 'dd-trace' + +ddTrace + .init() + .use('http2', { + client: true, // calls into dataplane + server: false, + }) + .use('express', { + hooks: { request: maintainXrpcResource }, + }) + +// Modify tracer in order to track calls to dataplane as a service with proper +// resource names. Reaches into dd-trace internals (`_tracer.startSpan`) — keep +// an eye on this when bumping the dd-trace major version. +const DATAPLANE_PREFIX = '/bsky.Service/' +const internal = ddTrace as unknown as { _tracer: any } +const origStartSpan = internal._tracer.startSpan +internal._tracer.startSpan = function (name: string, options: any) { + if ( + name !== 'http.request' || + options?.tags?.component !== 'http2' || + !options?.tags?.['http.url'] + ) { + return origStartSpan.call(this, name, options) + } + const uri = new URL(options.tags['http.url']) + if (!uri.pathname.startsWith(DATAPLANE_PREFIX)) { + return origStartSpan.call(this, name, options) + } + options.tags['service.name'] = 'dataplane-bsky' + options.tags['resource.name'] = uri.pathname.slice(DATAPLANE_PREFIX.length) + return origStartSpan.call(this, name, options) +} + +function maintainXrpcResource(span: any, req: any) { + // Show actual xrpc method as resource rather than the route pattern + if (span && req.originalUrl?.startsWith('/xrpc/')) { + span.setTag( + 'resource.name', + [ + req.method, + path.posix.join(req.baseUrl || '', req.path || '', '/').slice(0, -1), // Ensures no trailing slash + ] + .filter(Boolean) + .join(' '), + ) + } +} diff --git a/services/bsync/Dockerfile b/services/bsync/Dockerfile index e78328d2128..fa50d8e4aed 100644 --- a/services/bsync/Dockerfile +++ b/services/bsync/Dockerfile @@ -50,7 +50,7 @@ ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--enable-source-maps", "index.ts"] +CMD ["node", "--enable-source-maps", "--import=./tracer.ts", "index.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="Bsync" diff --git a/services/bsync/index.ts b/services/bsync/index.ts index 7bf69897aba..5c481e4900e 100644 --- a/services/bsync/index.ts +++ b/services/bsync/index.ts @@ -1,10 +1,3 @@ -/* eslint-disable import/order */ -import { createRequire } from 'node:module' - -const require = createRequire(import.meta.url) -require('dd-trace').init({ logInjection: true }) - -// Tracer code above must come before anything else import { BsyncService, envToCfg, httpLogger, readEnv } from '@atproto/bsync' const main = async () => { diff --git a/services/bsync/package.json b/services/bsync/package.json index bb3ebf5c9f4..c4fdbaa62dc 100644 --- a/services/bsync/package.json +++ b/services/bsync/package.json @@ -5,6 +5,6 @@ "packageManager": "pnpm@8.15.9", "dependencies": { "@atproto/bsync": "workspace:^", - "dd-trace": "3.13.2" + "dd-trace": "^5.103.0" } } diff --git a/services/bsync/tracer.ts b/services/bsync/tracer.ts new file mode 100644 index 00000000000..44981fb0fa3 --- /dev/null +++ b/services/bsync/tracer.ts @@ -0,0 +1,6 @@ +// Registers dd-trace's ESM loader hook for the rest of the process. Must be the +// first import so the hook is in place before any other module is resolved. +import 'dd-trace/register.js' +import ddTrace from 'dd-trace' + +ddTrace.init({ logInjection: true }) diff --git a/services/ozone/Dockerfile b/services/ozone/Dockerfile index f4b68310795..cb003193b23 100644 --- a/services/ozone/Dockerfile +++ b/services/ozone/Dockerfile @@ -75,7 +75,7 @@ ENV NODE_ENV=production # https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#non-root-user USER node -CMD ["node", "--enable-source-maps", "api.ts"] +CMD ["node", "--enable-source-maps", "--import=./tracer.ts", "api.ts"] LABEL org.opencontainers.image.source=https://github.com/bluesky-social/atproto LABEL org.opencontainers.image.description="Ozone" diff --git a/services/ozone/api.ts b/services/ozone/api.ts index 2054d9190c1..00c88dab4b1 100644 --- a/services/ozone/api.ts +++ b/services/ozone/api.ts @@ -1,19 +1,3 @@ -/* eslint-disable import/order */ -import { createRequire } from 'node:module' -import path from 'node:path' - -const require = createRequire(import.meta.url) -require('dd-trace') - .init({ logInjection: true }) - .tracer.use('express', { - hooks: { - request: (span: any, req: any) => { - maintainXrpcResource(span, req) - }, - }, - }) - -// Tracer code above must come before anything else import { BunnyInvalidator, CloudfrontInvalidator, @@ -34,7 +18,7 @@ const main = async () => { const secrets = envToSecrets(env) // configure zero, one, or more image invalidators - const imgUriEndpoint = process.env.OZONE_IMG_URI_ENDPOINT + const imgUriEndpoint = process.env.OZONE_IMG_URI_ENDPOINT ?? '' const bunnyAccessKey = process.env.OZONE_BUNNY_ACCESS_KEY const cfDistributionId = process.env.OZONE_CF_DISTRIBUTION_ID @@ -89,19 +73,4 @@ const main = async () => { }) } -const maintainXrpcResource = (span: any, req: any) => { - // Show actual xrpc method as resource rather than the route pattern - if (span && req.originalUrl?.startsWith('/xrpc/')) { - span.setTag( - 'resource.name', - [ - req.method, - path.posix.join(req.baseUrl || '', req.path || '', '/').slice(0, -1), // Ensures no trailing slash - ] - .filter(Boolean) - .join(' '), - ) - } -} - main() diff --git a/services/ozone/daemon.ts b/services/ozone/daemon.ts index 645cbe77fa9..a34b46791ba 100644 --- a/services/ozone/daemon.ts +++ b/services/ozone/daemon.ts @@ -1,10 +1,3 @@ -/* eslint-disable import/order */ -import { createRequire } from 'node:module' - -const require = createRequire(import.meta.url) -require('dd-trace/init') - -// Tracer code above must come before anything else import { OzoneDaemon, envToCfg, envToSecrets, readEnv } from '@atproto/ozone' const main = async () => { diff --git a/services/ozone/package.json b/services/ozone/package.json index 4149781a9c9..371abbefd13 100644 --- a/services/ozone/package.json +++ b/services/ozone/package.json @@ -6,6 +6,6 @@ "dependencies": { "@atproto/aws": "workspace:^", "@atproto/ozone": "workspace:^", - "dd-trace": "3.13.2" + "dd-trace": "^5.103.0" } } diff --git a/services/ozone/tracer.ts b/services/ozone/tracer.ts new file mode 100644 index 00000000000..4c7a3f95867 --- /dev/null +++ b/services/ozone/tracer.ts @@ -0,0 +1,24 @@ +// Registers dd-trace's ESM loader hook for the rest of the process. Must be the +// first import so the hook is in place before any other module is resolved. +import 'dd-trace/register.js' +import path from 'node:path' +import ddTrace from 'dd-trace' + +ddTrace.init({ logInjection: true }).use('express', { + hooks: { request: maintainXrpcResource }, +}) + +function maintainXrpcResource(span: any, req: any) { + // Show actual xrpc method as resource rather than the route pattern + if (span && req.originalUrl?.startsWith('/xrpc/')) { + span.setTag( + 'resource.name', + [ + req.method, + path.posix.join(req.baseUrl || '', req.path || '', '/').slice(0, -1), // Ensures no trailing slash + ] + .filter(Boolean) + .join(' '), + ) + } +} diff --git a/services/pds/package.json b/services/pds/package.json index 148fb2c5edb..16d47f5b7c0 100644 --- a/services/pds/package.json +++ b/services/pds/package.json @@ -6,7 +6,7 @@ "dependencies": { "@atproto/pds": "workspace:^", "@opentelemetry/instrumentation": "^0.45.0", - "dd-trace": "^4.18.0", + "dd-trace": "^5.103.0", "opentelemetry-plugin-better-sqlite3": "^1.13.0" } } diff --git a/services/pds/tracer.ts b/services/pds/tracer.ts index b25bd484476..b78efa85a53 100644 --- a/services/pds/tracer.ts +++ b/services/pds/tracer.ts @@ -1,13 +1,11 @@ -/* eslint-disable import/order */ -import { createRequire } from 'node:module' +// Registers dd-trace's ESM loader hook for the rest of the process. Must be the +// first import so the hook is in place before any other module is resolved. +import 'dd-trace/register.js' import path from 'node:path' - import { registerInstrumentations } from '@opentelemetry/instrumentation' +import ddTrace from 'dd-trace' import { BetterSqlite3Instrumentation } from 'opentelemetry-plugin-better-sqlite3' -const require = createRequire(import.meta.url) -const ddTrace = require('dd-trace') - const { TracerProvider } = ddTrace.init({ logInjection: true }).use('express', { hooks: { request: maintainXrpcResource }, }) From 7f7bb09f130a42bfcc594eb76d4e67183b1894cd Mon Sep 17 00:00:00 2001 From: devin ivy Date: Tue, 19 May 2026 14:42:49 -0400 Subject: [PATCH 53/87] Add bsync protos to pds, bsky, ozone service dockerfiles to fix build (#4962) chore: add bsync to pds, bsky, ozone service dockerfiles to fix build --- services/bsky/Dockerfile | 1 + services/ozone/Dockerfile | 1 + services/pds/Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/services/bsky/Dockerfile b/services/bsky/Dockerfile index ca1f85238d9..0dc2350b5cd 100644 --- a/services/bsky/Dockerfile +++ b/services/bsky/Dockerfile @@ -20,6 +20,7 @@ COPY ./packages/lex ./packages/lex COPY ./packages/api ./packages/api COPY ./packages/aws ./packages/aws COPY ./packages/bsky ./packages/bsky +COPY ./packages/bsync ./packages/bsync COPY ./packages/common-web ./packages/common-web COPY ./packages/common ./packages/common COPY ./packages/crypto ./packages/crypto diff --git a/services/ozone/Dockerfile b/services/ozone/Dockerfile index cb003193b23..85c11f10d99 100644 --- a/services/ozone/Dockerfile +++ b/services/ozone/Dockerfile @@ -20,6 +20,7 @@ COPY ./packages/lex ./packages/lex COPY ./packages/api ./packages/api COPY ./packages/aws ./packages/aws COPY ./packages/bsky ./packages/bsky +COPY ./packages/bsync ./packages/bsync COPY ./packages/common ./packages/common COPY ./packages/common-web ./packages/common-web COPY ./packages/crypto ./packages/crypto diff --git a/services/pds/Dockerfile b/services/pds/Dockerfile index c1cefc3e282..d65ee897576 100644 --- a/services/pds/Dockerfile +++ b/services/pds/Dockerfile @@ -21,6 +21,7 @@ COPY ./packages/lex ./packages/lex COPY ./packages/api ./packages/api COPY ./packages/aws ./packages/aws COPY ./packages/bsky ./packages/bsky +COPY ./packages/bsync ./packages/bsync COPY ./packages/common-web ./packages/common-web COPY ./packages/common ./packages/common COPY ./packages/crypto ./packages/crypto From 37c6fe6caeaf1b6ca598d6147e74c954c5a24854 Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 19 May 2026 20:05:51 -0300 Subject: [PATCH 54/87] Update chat lexicons (#4963) Co-authored-by: Claude Opus 4.6 (1M context) --- .changeset/bright-foxes-dance.md | 5 ++ lexicons/chat/bsky/authFullChatClient.json | 1 + .../chat/bsky/group/listMutualGroups.json | 44 ++++++++++++++++ .../bsky/moderation/subscribeModEvents.json | 1 + packages/api/src/client/index.ts | 14 +++++ packages/api/src/client/lexicons.ts | 51 +++++++++++++++++++ .../types/chat/bsky/group/listMutualGroups.ts | 44 ++++++++++++++++ .../bsky/moderation/subscribeModEvents.ts | 1 + packages/ozone/src/lexicon/index.ts | 13 +++++ packages/ozone/src/lexicon/lexicons.ts | 51 +++++++++++++++++++ .../types/chat/bsky/group/listMutualGroups.ts | 43 ++++++++++++++++ .../bsky/moderation/subscribeModEvents.ts | 1 + 12 files changed, 269 insertions(+) create mode 100644 .changeset/bright-foxes-dance.md create mode 100644 lexicons/chat/bsky/group/listMutualGroups.json create mode 100644 packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts create mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/listMutualGroups.ts diff --git a/.changeset/bright-foxes-dance.md b/.changeset/bright-foxes-dance.md new file mode 100644 index 00000000000..612bcecb8ce --- /dev/null +++ b/.changeset/bright-foxes-dance.md @@ -0,0 +1,5 @@ +--- +'@atproto/api': patch +--- + +update chat lexicons diff --git a/lexicons/chat/bsky/authFullChatClient.json b/lexicons/chat/bsky/authFullChatClient.json index 8cf70ea290d..4a194f769fa 100644 --- a/lexicons/chat/bsky/authFullChatClient.json +++ b/lexicons/chat/bsky/authFullChatClient.json @@ -49,6 +49,7 @@ "chat.bsky.group.enableJoinLink", "chat.bsky.group.getJoinLinkPreview", "chat.bsky.group.listJoinRequests", + "chat.bsky.group.listMutualGroups", "chat.bsky.group.rejectJoinRequest", "chat.bsky.group.removeMembers", "chat.bsky.group.requestJoin" diff --git a/lexicons/chat/bsky/group/listMutualGroups.json b/lexicons/chat/bsky/group/listMutualGroups.json new file mode 100644 index 00000000000..3cd8c38c859 --- /dev/null +++ b/lexicons/chat/bsky/group/listMutualGroups.json @@ -0,0 +1,44 @@ +{ + "lexicon": 1, + "id": "chat.bsky.group.listMutualGroups", + "defs": { + "main": { + "type": "query", + "description": "[NOTE: This is under active development and should be considered unstable while this note is here]. Returns a page of group conversations that both the requester and the specified actor are members of.", + "parameters": { + "type": "params", + "required": ["subject"], + "properties": { + "subject": { + "type": "string", + "format": "did" + }, + "limit": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 50 + }, + "cursor": { "type": "string" } + } + }, + "output": { + "encoding": "application/json", + "schema": { + "type": "object", + "required": ["convos"], + "properties": { + "cursor": { "type": "string" }, + "convos": { + "type": "array", + "items": { + "type": "ref", + "ref": "chat.bsky.convo.defs#convoView" + } + } + } + } + } + } + } +} diff --git a/lexicons/chat/bsky/moderation/subscribeModEvents.json b/lexicons/chat/bsky/moderation/subscribeModEvents.json index ccd69da3e88..6e71843807c 100644 --- a/lexicons/chat/bsky/moderation/subscribeModEvents.json +++ b/lexicons/chat/bsky/moderation/subscribeModEvents.json @@ -502,6 +502,7 @@ "owner_left", "owner_deactivated", "owner_deleted", + "owner_suspended", "owner_taken_down", "label_applied" ] diff --git a/packages/api/src/client/index.ts b/packages/api/src/client/index.ts index ff1bc4f77e1..43392230c46 100644 --- a/packages/api/src/client/index.ts +++ b/packages/api/src/client/index.ts @@ -191,6 +191,7 @@ import * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink import * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' import * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' import * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' +import * as ChatBskyGroupListMutualGroups from './types/chat/bsky/group/listMutualGroups.js' import * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' import * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' import * as ChatBskyGroupRequestJoin from './types/chat/bsky/group/requestJoin.js' @@ -552,6 +553,7 @@ export * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink export * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' export * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' export * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' +export * as ChatBskyGroupListMutualGroups from './types/chat/bsky/group/listMutualGroups.js' export * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' export * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' export * as ChatBskyGroupRequestJoin from './types/chat/bsky/group/requestJoin.js' @@ -4174,6 +4176,18 @@ export class ChatBskyGroupNS { }) } + listMutualGroups( + params?: ChatBskyGroupListMutualGroups.QueryParams, + opts?: ChatBskyGroupListMutualGroups.CallOptions, + ): Promise { + return this._client.call( + 'chat.bsky.group.listMutualGroups', + params, + undefined, + opts, + ) + } + rejectJoinRequest( data?: ChatBskyGroupRejectJoinRequest.InputSchema, opts?: ChatBskyGroupRejectJoinRequest.CallOptions, diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts index 8094304d1b8..d5740feeadd 100644 --- a/packages/api/src/client/lexicons.ts +++ b/packages/api/src/client/lexicons.ts @@ -12586,6 +12586,55 @@ export const schemaDict = { }, }, }, + ChatBskyGroupListMutualGroups: { + lexicon: 1, + id: 'chat.bsky.group.listMutualGroups', + defs: { + main: { + type: 'query', + description: + '[NOTE: This is under active development and should be considered unstable while this note is here]. Returns a page of group conversations that both the requester and the specified actor are members of.', + parameters: { + type: 'params', + required: ['subject'], + properties: { + subject: { + type: 'string', + format: 'did', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['convos'], + properties: { + cursor: { + type: 'string', + }, + convos: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.convo.defs#convoView', + }, + }, + }, + }, + }, + }, + }, + }, ChatBskyGroupRejectJoinRequest: { lexicon: 1, id: 'chat.bsky.group.rejectJoinRequest', @@ -13486,6 +13535,7 @@ export const schemaDict = { 'owner_left', 'owner_deactivated', 'owner_deleted', + 'owner_suspended', 'owner_taken_down', 'label_applied', ], @@ -25574,6 +25624,7 @@ export const ids = { ChatBskyGroupEnableJoinLink: 'chat.bsky.group.enableJoinLink', ChatBskyGroupGetJoinLinkPreview: 'chat.bsky.group.getJoinLinkPreview', ChatBskyGroupListJoinRequests: 'chat.bsky.group.listJoinRequests', + ChatBskyGroupListMutualGroups: 'chat.bsky.group.listMutualGroups', ChatBskyGroupRejectJoinRequest: 'chat.bsky.group.rejectJoinRequest', ChatBskyGroupRemoveMembers: 'chat.bsky.group.removeMembers', ChatBskyGroupRequestJoin: 'chat.bsky.group.requestJoin', diff --git a/packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts b/packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts new file mode 100644 index 00000000000..14f5e9edb86 --- /dev/null +++ b/packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts @@ -0,0 +1,44 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { HeadersMap, XRPCError } from '@atproto/xrpc' +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons.js' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util.js' +import type * as ChatBskyConvoDefs from '../convo/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.group.listMutualGroups' + +export type QueryParams = { + subject: string + limit?: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + convos: ChatBskyConvoDefs.ConvoView[] +} + +export interface CallOptions { + signal?: AbortSignal + headers?: HeadersMap +} + +export interface Response { + success: boolean + headers: HeadersMap + data: OutputSchema +} + +export function toKnownErr(e: any) { + return e +} diff --git a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts index 169fc39bc50..c7cc77220a8 100644 --- a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts +++ b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts @@ -333,6 +333,7 @@ export interface EventGroupChatUpdated { | 'owner_left' | 'owner_deactivated' | 'owner_deleted' + | 'owner_suspended' | 'owner_taken_down' | 'label_applied' | (string & {}) diff --git a/packages/ozone/src/lexicon/index.ts b/packages/ozone/src/lexicon/index.ts index 5c551b96481..e70c623302a 100644 --- a/packages/ozone/src/lexicon/index.ts +++ b/packages/ozone/src/lexicon/index.ts @@ -153,6 +153,7 @@ import * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink import * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' import * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' import * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' +import * as ChatBskyGroupListMutualGroups from './types/chat/bsky/group/listMutualGroups.js' import * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' import * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' import * as ChatBskyGroupRequestJoin from './types/chat/bsky/group/requestJoin.js' @@ -2353,6 +2354,18 @@ export class ChatBskyGroupNS { return this._server.xrpc.method(nsid, cfg) } + listMutualGroups( + cfg: MethodConfigOrHandler< + A, + ChatBskyGroupListMutualGroups.QueryParams, + ChatBskyGroupListMutualGroups.HandlerInput, + ChatBskyGroupListMutualGroups.HandlerOutput + >, + ) { + const nsid = 'chat.bsky.group.listMutualGroups' // @ts-ignore + return this._server.xrpc.method(nsid, cfg) + } + rejectJoinRequest( cfg: MethodConfigOrHandler< A, diff --git a/packages/ozone/src/lexicon/lexicons.ts b/packages/ozone/src/lexicon/lexicons.ts index 9fc04b30095..cc9a9d49c59 100644 --- a/packages/ozone/src/lexicon/lexicons.ts +++ b/packages/ozone/src/lexicon/lexicons.ts @@ -12586,6 +12586,55 @@ export const schemaDict = { }, }, }, + ChatBskyGroupListMutualGroups: { + lexicon: 1, + id: 'chat.bsky.group.listMutualGroups', + defs: { + main: { + type: 'query', + description: + '[NOTE: This is under active development and should be considered unstable while this note is here]. Returns a page of group conversations that both the requester and the specified actor are members of.', + parameters: { + type: 'params', + required: ['subject'], + properties: { + subject: { + type: 'string', + format: 'did', + }, + limit: { + type: 'integer', + minimum: 1, + maximum: 100, + default: 50, + }, + cursor: { + type: 'string', + }, + }, + }, + output: { + encoding: 'application/json', + schema: { + type: 'object', + required: ['convos'], + properties: { + cursor: { + type: 'string', + }, + convos: { + type: 'array', + items: { + type: 'ref', + ref: 'lex:chat.bsky.convo.defs#convoView', + }, + }, + }, + }, + }, + }, + }, + }, ChatBskyGroupRejectJoinRequest: { lexicon: 1, id: 'chat.bsky.group.rejectJoinRequest', @@ -13486,6 +13535,7 @@ export const schemaDict = { 'owner_left', 'owner_deactivated', 'owner_deleted', + 'owner_suspended', 'owner_taken_down', 'label_applied', ], @@ -25505,6 +25555,7 @@ export const ids = { ChatBskyGroupEnableJoinLink: 'chat.bsky.group.enableJoinLink', ChatBskyGroupGetJoinLinkPreview: 'chat.bsky.group.getJoinLinkPreview', ChatBskyGroupListJoinRequests: 'chat.bsky.group.listJoinRequests', + ChatBskyGroupListMutualGroups: 'chat.bsky.group.listMutualGroups', ChatBskyGroupRejectJoinRequest: 'chat.bsky.group.rejectJoinRequest', ChatBskyGroupRemoveMembers: 'chat.bsky.group.removeMembers', ChatBskyGroupRequestJoin: 'chat.bsky.group.requestJoin', diff --git a/packages/ozone/src/lexicon/types/chat/bsky/group/listMutualGroups.ts b/packages/ozone/src/lexicon/types/chat/bsky/group/listMutualGroups.ts new file mode 100644 index 00000000000..b6d5d19e9a8 --- /dev/null +++ b/packages/ozone/src/lexicon/types/chat/bsky/group/listMutualGroups.ts @@ -0,0 +1,43 @@ +/** + * GENERATED CODE - DO NOT MODIFY + */ +import { type ValidationResult, BlobRef } from '@atproto/lexicon' +import { CID } from 'multiformats/cid' +import { validate as _validate } from '../../../../lexicons.js' +import { + type $Typed, + is$typed as _is$typed, + type OmitKey, +} from '../../../../util.js' +import type * as ChatBskyConvoDefs from '../convo/defs.js' + +const is$typed = _is$typed, + validate = _validate +const id = 'chat.bsky.group.listMutualGroups' + +export type QueryParams = { + subject: string + limit: number + cursor?: string +} +export type InputSchema = undefined + +export interface OutputSchema { + cursor?: string + convos: ChatBskyConvoDefs.ConvoView[] +} + +export type HandlerInput = void + +export interface HandlerSuccess { + encoding: 'application/json' + body: OutputSchema + headers?: { [key: string]: string } +} + +export interface HandlerError { + status: number + message?: string +} + +export type HandlerOutput = HandlerError | HandlerSuccess diff --git a/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts b/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts index 5a4374cf929..93a966348c7 100644 --- a/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts +++ b/packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts @@ -353,6 +353,7 @@ export interface EventGroupChatUpdated { | 'owner_left' | 'owner_deactivated' | 'owner_deleted' + | 'owner_suspended' | 'owner_taken_down' | 'label_applied' | (string & {}) From 008158bc095b0e82eb8ea169a0e1a752089c2245 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 20 May 2026 14:20:50 +0200 Subject: [PATCH 55/87] Fix concurrency issue in `@atproto/sync` tests (#4970) Fix concurrency issue in @atproto/sync tests --- .changeset/bumpy-lines-drive.md | 2 ++ packages/sync/tests/runner.test.ts | 29 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 .changeset/bumpy-lines-drive.md diff --git a/.changeset/bumpy-lines-drive.md b/.changeset/bumpy-lines-drive.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/bumpy-lines-drive.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/sync/tests/runner.test.ts b/packages/sync/tests/runner.test.ts index 8117485f9d3..731b518ab7f 100644 --- a/packages/sync/tests/runner.test.ts +++ b/packages/sync/tests/runner.test.ts @@ -29,41 +29,48 @@ describe('EventRunner utils', () => { describe('MemoryRunner', () => { it('performs work in parallel across partitions, serial within a partition.', async () => { const runner = new MemoryRunner({ concurrency: Infinity }) - const complete: number[] = [] + const complete: { + 1: number[] + 2: number[] + } = { + 1: [], + 2: [], + } // partition 1 items start slow but get faster: slow should still complete first. runner.addTask('1', async () => { await wait(30) - complete.push(11) + complete[1].push(1) }) runner.addTask('1', async () => { await wait(20) - complete.push(12) + complete[1].push(2) }) runner.addTask('1', async () => { - await wait(1) - complete.push(13) + complete[1].push(3) }) expect(runner.partitions.size).toEqual(1) // partition 2 items complete quickly except the last, which is slowest of all events. runner.addTask('2', async () => { await wait(1) - complete.push(21) + complete[2].push(1) }) runner.addTask('2', async () => { await wait(1) - complete.push(22) + complete[2].push(2) }) runner.addTask('2', async () => { - await wait(1) - complete.push(23) + complete[2].push(3) }) runner.addTask('2', async () => { await wait(60) - complete.push(24) + complete[2].push(4) }) expect(runner.partitions.size).toEqual(2) await runner.mainQueue.onIdle() - expect(complete).toEqual([21, 22, 23, 11, 12, 13, 24]) + expect(complete).toEqual({ + 1: [1, 2, 3], + 2: [1, 2, 3, 4], + }) expect(runner.partitions.size).toEqual(0) }) From 571582ea9b1aea56938b8f24daaf49e197a987ef Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 20 May 2026 14:22:27 +0200 Subject: [PATCH 56/87] Remove proto buf generated code from version control (#4964) --- .changeset/olive-spies-yawn.md | 6 + .gitattributes | 4 - .github/workflows/repo.yaml | 1 + packages/bsky/.gitignore | 2 + packages/bsky/src/proto/bsky_connect.ts | 1063 -- packages/bsky/src/proto/bsky_pb.ts | 11137 ------------------- packages/bsky/src/proto/bsync_connect.ts | 93 - packages/bsky/src/proto/bsync_pb.ts | 909 -- packages/bsky/src/proto/courier_connect.ts | 62 - packages/bsky/src/proto/courier_pb.ts | 517 - packages/bsky/src/proto/rolodex_connect.ts | 89 - packages/bsky/src/proto/rolodex_pb.ts | 746 -- packages/bsync/.gitignore | 2 + packages/bsync/src/proto/bsync_connect.ts | 93 - packages/bsync/src/proto/bsync_pb.ts | 909 -- 15 files changed, 11 insertions(+), 15622 deletions(-) create mode 100644 .changeset/olive-spies-yawn.md delete mode 100644 packages/bsky/src/proto/bsky_connect.ts delete mode 100644 packages/bsky/src/proto/bsky_pb.ts delete mode 100644 packages/bsky/src/proto/bsync_connect.ts delete mode 100644 packages/bsky/src/proto/bsync_pb.ts delete mode 100644 packages/bsky/src/proto/courier_connect.ts delete mode 100644 packages/bsky/src/proto/courier_pb.ts delete mode 100644 packages/bsky/src/proto/rolodex_connect.ts delete mode 100644 packages/bsky/src/proto/rolodex_pb.ts create mode 100644 packages/bsync/.gitignore delete mode 100644 packages/bsync/src/proto/bsync_connect.ts delete mode 100644 packages/bsync/src/proto/bsync_pb.ts diff --git a/.changeset/olive-spies-yawn.md b/.changeset/olive-spies-yawn.md new file mode 100644 index 00000000000..f8b276f09be --- /dev/null +++ b/.changeset/olive-spies-yawn.md @@ -0,0 +1,6 @@ +--- +'@atproto/bsync': patch +'@atproto/bsky': patch +--- + +Remove proto buf generated code from version control diff --git a/.gitattributes b/.gitattributes index da3637dd037..884636f9349 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,3 @@ -# buf -packages/bsky/src/proto/** linguist-generated=true -packages/bsync/src/proto/** linguist-generated=true - # codegen packages/api/src/client/** linguist-generated=true packages/ozone/src/lexicon/** linguist-generated=true diff --git a/.github/workflows/repo.yaml b/.github/workflows/repo.yaml index 440f208adbf..5575fb6ff49 100644 --- a/.github/workflows/repo.yaml +++ b/.github/workflows/repo.yaml @@ -30,6 +30,7 @@ jobs: path: | packages/*/dist packages/*/*/dist + packages/*/src/proto packages/lex/*/src/lexicons packages/lex/*/tests/lexicons packages/oauth/oauth-client-browser-example/src/lexicons diff --git a/packages/bsky/.gitignore b/packages/bsky/.gitignore index a33cfc736a3..3fe4b2af8aa 100644 --- a/packages/bsky/.gitignore +++ b/packages/bsky/.gitignore @@ -2,3 +2,5 @@ src/lexicon # @atproto/lex src/lexicons +# @bufbuild/buf +src/proto diff --git a/packages/bsky/src/proto/bsky_connect.ts b/packages/bsky/src/proto/bsky_connect.ts deleted file mode 100644 index 56620437a55..00000000000 --- a/packages/bsky/src/proto/bsky_connect.ts +++ /dev/null @@ -1,1063 +0,0 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" -// @generated from file bsky.proto (package bsky, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import { ClearActorMutelistSubscriptionsRequest, ClearActorMutelistSubscriptionsResponse, ClearActorMutesRequest, ClearActorMutesResponse, ClearThreadMutesRequest, ClearThreadMutesResponse, CreateActorMutelistSubscriptionRequest, CreateActorMutelistSubscriptionResponse, CreateActorMuteRequest, CreateActorMuteResponse, CreateThreadMuteRequest, CreateThreadMuteResponse, DeleteActorMutelistSubscriptionRequest, DeleteActorMutelistSubscriptionResponse, DeleteActorMuteRequest, DeleteActorMuteResponse, DeleteThreadMuteRequest, DeleteThreadMuteResponse, GetActivitySubscriptionDidsRequest, GetActivitySubscriptionDidsResponse, GetActivitySubscriptionsByActorAndSubjectsRequest, GetActivitySubscriptionsByActorAndSubjectsResponse, GetActorBookmarksRequest, GetActorBookmarksResponse, GetActorChatDeclarationRecordsRequest, GetActorChatDeclarationRecordsResponse, GetActorDraftsRequest, GetActorDraftsResponse, GetActorFeedsRequest, GetActorFeedsResponse, GetActorFollowsActorsRequest, GetActorFollowsActorsResponse, GetActorLikesRequest, GetActorLikesResponse, GetActorListsRequest, GetActorListsResponse, GetActorMutesActorRequest, GetActorMutesActorResponse, GetActorMutesActorViaListRequest, GetActorMutesActorViaListResponse, GetActorRepostsRequest, GetActorRepostsResponse, GetActorsRequest, GetActorsResponse, GetActorStarterPacksRequest, GetActorStarterPacksResponse, GetActorTakedownRequest, GetActorTakedownResponse, GetAllLabelersRequest, GetAllLabelersResponse, GetAuthorFeedRequest, GetAuthorFeedResponse, GetBidirectionalBlockRequest, GetBidirectionalBlockResponse, GetBidirectionalBlockViaListRequest, GetBidirectionalBlockViaListResponse, GetBlobTakedownRequest, GetBlobTakedownResponse, GetBlockExistenceRequest, GetBlockExistenceResponse, GetBlocklistSubscriptionRequest, GetBlocklistSubscriptionResponse, GetBlocklistSubscriptionsRequest, GetBlocklistSubscriptionsResponse, GetBlockRecordsRequest, GetBlockRecordsResponse, GetBlocksRequest, GetBlocksResponse, GetBookmarksByActorAndSubjectsRequest, GetBookmarksByActorAndSubjectsResponse, GetCountsForUsersRequest, GetCountsForUsersResponse, GetDidsByHandlesRequest, GetDidsByHandlesResponse, GetFeedGeneratorRecordsRequest, GetFeedGeneratorRecordsResponse, GetFeedGeneratorStatusRequest, GetFeedGeneratorStatusResponse, GetFollowersRequest, GetFollowersResponse, GetFollowRecordsRequest, GetFollowRecordsResponse, GetFollowsFollowingRequest, GetFollowsFollowingResponse, GetFollowsRequest, GetFollowsResponse, GetFollowSuggestionsRequest, GetFollowSuggestionsResponse, GetGermDeclarationRecordsRequest, GetGermDeclarationRecordsResponse, GetIdentityByDidRequest, GetIdentityByDidResponse, GetIdentityByHandleRequest, GetIdentityByHandleResponse, GetInteractionCountsRequest, GetInteractionCountsResponse, GetLabelerRecordsRequest, GetLabelerRecordsResponse, GetLabelsRequest, GetLabelsResponse, GetLatestRevRequest, GetLatestRevResponse, GetLikeRecordsRequest, GetLikeRecordsResponse, GetLikesByActorAndSubjectsRequest, GetLikesByActorAndSubjectsResponse, GetLikesBySubjectRequest, GetLikesBySubjectResponse, GetLikesBySubjectSortedRequest, GetLikesBySubjectSortedResponse, GetListBlockRecordsRequest, GetListBlockRecordsResponse, GetListCountRequest, GetListCountResponse, GetListCountsRequest, GetListCountsResponse, GetListFeedRequest, GetListFeedResponse, GetListItemRecordsRequest, GetListItemRecordsResponse, GetListMembershipRequest, GetListMembershipResponse, GetListMembersRequest, GetListMembersResponse, GetListRecordsRequest, GetListRecordsResponse, GetMutelistSubscriptionRequest, GetMutelistSubscriptionResponse, GetMutelistSubscriptionsRequest, GetMutelistSubscriptionsResponse, GetMutesRequest, GetMutesResponse, GetNewUserCountForRangeRequest, GetNewUserCountForRangeResponse, GetNotificationDeclarationRecordsRequest, GetNotificationDeclarationRecordsResponse, GetNotificationPreferencesRequest, GetNotificationPreferencesResponse, GetNotificationSeenRequest, GetNotificationSeenResponse, GetNotificationsRequest, GetNotificationsResponse, GetPostgateRecordsRequest, GetPostgateRecordsResponse, GetPostRecordsRequest, GetPostRecordsResponse, GetProfileRecordsRequest, GetProfileRecordsResponse, GetQuotesBySubjectSortedRequest, GetQuotesBySubjectSortedResponse, GetRecordTakedownRequest, GetRecordTakedownResponse, GetRelationshipsRequest, GetRelationshipsResponse, GetRepostRecordsRequest, GetRepostRecordsResponse, GetRepostsByActorAndSubjectsRequest, GetRepostsByActorAndSubjectsResponse, GetRepostsBySubjectRequest, GetRepostsBySubjectResponse, GetSitemapIndexRequest, GetSitemapIndexResponse, GetSitemapPageRequest, GetSitemapPageResponse, GetStarterPackCountsRequest, GetStarterPackCountsResponse, GetStarterPackRecordsRequest, GetStarterPackRecordsResponse, GetStatusRecordsRequest, GetStatusRecordsResponse, GetSuggestedEntitiesRequest, GetSuggestedEntitiesResponse, GetSuggestedFeedsRequest, GetSuggestedFeedsResponse, GetThreadGateRecordsRequest, GetThreadGateRecordsResponse, GetThreadMutesOnSubjectsRequest, GetThreadMutesOnSubjectsResponse, GetThreadRequest, GetThreadResponse, GetTimelineRequest, GetTimelineResponse, GetUnreadNotificationCountRequest, GetUnreadNotificationCountResponse, GetVerificationRecordsRequest, GetVerificationRecordsResponse, GetVerificationsIssuedRequest, GetVerificationsIssuedResponse, GetVerificationsReceivedRequest, GetVerificationsReceivedResponse, PingRequest, PingResponse, SearchActorsRequest, SearchActorsResponse, SearchFeedGeneratorsRequest, SearchFeedGeneratorsResponse, SearchPostsRequest, SearchPostsResponse, SearchStarterPacksRequest, SearchStarterPacksResponse, TakedownActorRequest, TakedownActorResponse, TakedownBlobRequest, TakedownBlobResponse, TakedownRecordRequest, TakedownRecordResponse, UntakedownActorRequest, UntakedownActorResponse, UntakedownBlobRequest, UntakedownBlobResponse, UntakedownRecordRequest, UntakedownRecordResponse, UpdateActorUpstreamStatusRequest, UpdateActorUpstreamStatusResponse, UpdateNotificationSeenRequest, UpdateNotificationSeenResponse } from "./bsky_pb.js"; -import { MethodKind } from "@bufbuild/protobuf"; - -/** - * - * Read Path - * - * - * @generated from service bsky.Service - */ -export const Service = { - typeName: "bsky.Service", - methods: { - /** - * Records - * - * @generated from rpc bsky.Service.GetBlockRecords - */ - getBlockRecords: { - name: "GetBlockRecords", - I: GetBlockRecordsRequest, - O: GetBlockRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetFeedGeneratorRecords - */ - getFeedGeneratorRecords: { - name: "GetFeedGeneratorRecords", - I: GetFeedGeneratorRecordsRequest, - O: GetFeedGeneratorRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetFollowRecords - */ - getFollowRecords: { - name: "GetFollowRecords", - I: GetFollowRecordsRequest, - O: GetFollowRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetLikeRecords - */ - getLikeRecords: { - name: "GetLikeRecords", - I: GetLikeRecordsRequest, - O: GetLikeRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListBlockRecords - */ - getListBlockRecords: { - name: "GetListBlockRecords", - I: GetListBlockRecordsRequest, - O: GetListBlockRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListItemRecords - */ - getListItemRecords: { - name: "GetListItemRecords", - I: GetListItemRecordsRequest, - O: GetListItemRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListRecords - */ - getListRecords: { - name: "GetListRecords", - I: GetListRecordsRequest, - O: GetListRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetPostRecords - */ - getPostRecords: { - name: "GetPostRecords", - I: GetPostRecordsRequest, - O: GetPostRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetProfileRecords - */ - getProfileRecords: { - name: "GetProfileRecords", - I: GetProfileRecordsRequest, - O: GetProfileRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetActorChatDeclarationRecords - */ - getActorChatDeclarationRecords: { - name: "GetActorChatDeclarationRecords", - I: GetActorChatDeclarationRecordsRequest, - O: GetActorChatDeclarationRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetNotificationDeclarationRecords - */ - getNotificationDeclarationRecords: { - name: "GetNotificationDeclarationRecords", - I: GetNotificationDeclarationRecordsRequest, - O: GetNotificationDeclarationRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetGermDeclarationRecords - */ - getGermDeclarationRecords: { - name: "GetGermDeclarationRecords", - I: GetGermDeclarationRecordsRequest, - O: GetGermDeclarationRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetStatusRecords - */ - getStatusRecords: { - name: "GetStatusRecords", - I: GetStatusRecordsRequest, - O: GetStatusRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetRepostRecords - */ - getRepostRecords: { - name: "GetRepostRecords", - I: GetRepostRecordsRequest, - O: GetRepostRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetThreadGateRecords - */ - getThreadGateRecords: { - name: "GetThreadGateRecords", - I: GetThreadGateRecordsRequest, - O: GetThreadGateRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetPostgateRecords - */ - getPostgateRecords: { - name: "GetPostgateRecords", - I: GetPostgateRecordsRequest, - O: GetPostgateRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetLabelerRecords - */ - getLabelerRecords: { - name: "GetLabelerRecords", - I: GetLabelerRecordsRequest, - O: GetLabelerRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetStarterPackRecords - */ - getStarterPackRecords: { - name: "GetStarterPackRecords", - I: GetStarterPackRecordsRequest, - O: GetStarterPackRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * Follows - * - * @generated from rpc bsky.Service.GetActorFollowsActors - */ - getActorFollowsActors: { - name: "GetActorFollowsActors", - I: GetActorFollowsActorsRequest, - O: GetActorFollowsActorsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetFollowers - */ - getFollowers: { - name: "GetFollowers", - I: GetFollowersRequest, - O: GetFollowersResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetFollows - */ - getFollows: { - name: "GetFollows", - I: GetFollowsRequest, - O: GetFollowsResponse, - kind: MethodKind.Unary, - }, - /** - * Verifications - * - * @generated from rpc bsky.Service.GetVerificationRecords - */ - getVerificationRecords: { - name: "GetVerificationRecords", - I: GetVerificationRecordsRequest, - O: GetVerificationRecordsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetVerificationsIssued - */ - getVerificationsIssued: { - name: "GetVerificationsIssued", - I: GetVerificationsIssuedRequest, - O: GetVerificationsIssuedResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetVerificationsReceived - */ - getVerificationsReceived: { - name: "GetVerificationsReceived", - I: GetVerificationsReceivedRequest, - O: GetVerificationsReceivedResponse, - kind: MethodKind.Unary, - }, - /** - * Likes - * - * @generated from rpc bsky.Service.GetLikesBySubject - */ - getLikesBySubject: { - name: "GetLikesBySubject", - I: GetLikesBySubjectRequest, - O: GetLikesBySubjectResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetLikesBySubjectSorted - */ - getLikesBySubjectSorted: { - name: "GetLikesBySubjectSorted", - I: GetLikesBySubjectSortedRequest, - O: GetLikesBySubjectSortedResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetLikesByActorAndSubjects - */ - getLikesByActorAndSubjects: { - name: "GetLikesByActorAndSubjects", - I: GetLikesByActorAndSubjectsRequest, - O: GetLikesByActorAndSubjectsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetActorLikes - */ - getActorLikes: { - name: "GetActorLikes", - I: GetActorLikesRequest, - O: GetActorLikesResponse, - kind: MethodKind.Unary, - }, - /** - * Reposts - * - * @generated from rpc bsky.Service.GetRepostsBySubject - */ - getRepostsBySubject: { - name: "GetRepostsBySubject", - I: GetRepostsBySubjectRequest, - O: GetRepostsBySubjectResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetRepostsByActorAndSubjects - */ - getRepostsByActorAndSubjects: { - name: "GetRepostsByActorAndSubjects", - I: GetRepostsByActorAndSubjectsRequest, - O: GetRepostsByActorAndSubjectsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetActorReposts - */ - getActorReposts: { - name: "GetActorReposts", - I: GetActorRepostsRequest, - O: GetActorRepostsResponse, - kind: MethodKind.Unary, - }, - /** - * Quotes - * - * @generated from rpc bsky.Service.GetQuotesBySubjectSorted - */ - getQuotesBySubjectSorted: { - name: "GetQuotesBySubjectSorted", - I: GetQuotesBySubjectSortedRequest, - O: GetQuotesBySubjectSortedResponse, - kind: MethodKind.Unary, - }, - /** - * Interaction Counts - * - * @generated from rpc bsky.Service.GetInteractionCounts - */ - getInteractionCounts: { - name: "GetInteractionCounts", - I: GetInteractionCountsRequest, - O: GetInteractionCountsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetCountsForUsers - */ - getCountsForUsers: { - name: "GetCountsForUsers", - I: GetCountsForUsersRequest, - O: GetCountsForUsersResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetStarterPackCounts - */ - getStarterPackCounts: { - name: "GetStarterPackCounts", - I: GetStarterPackCountsRequest, - O: GetStarterPackCountsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListCounts - */ - getListCounts: { - name: "GetListCounts", - I: GetListCountsRequest, - O: GetListCountsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetNewUserCountForRange - */ - getNewUserCountForRange: { - name: "GetNewUserCountForRange", - I: GetNewUserCountForRangeRequest, - O: GetNewUserCountForRangeResponse, - kind: MethodKind.Unary, - }, - /** - * Profile - * - * @generated from rpc bsky.Service.GetActors - */ - getActors: { - name: "GetActors", - I: GetActorsRequest, - O: GetActorsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetDidsByHandles - */ - getDidsByHandles: { - name: "GetDidsByHandles", - I: GetDidsByHandlesRequest, - O: GetDidsByHandlesResponse, - kind: MethodKind.Unary, - }, - /** - * Relationships - * - * @generated from rpc bsky.Service.GetRelationships - */ - getRelationships: { - name: "GetRelationships", - I: GetRelationshipsRequest, - O: GetRelationshipsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetBlockExistence - */ - getBlockExistence: { - name: "GetBlockExistence", - I: GetBlockExistenceRequest, - O: GetBlockExistenceResponse, - kind: MethodKind.Unary, - }, - /** - * Lists - * - * @generated from rpc bsky.Service.GetActorLists - */ - getActorLists: { - name: "GetActorLists", - I: GetActorListsRequest, - O: GetActorListsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListMembers - */ - getListMembers: { - name: "GetListMembers", - I: GetListMembersRequest, - O: GetListMembersResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListMembership - */ - getListMembership: { - name: "GetListMembership", - I: GetListMembershipRequest, - O: GetListMembershipResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListCount - */ - getListCount: { - name: "GetListCount", - I: GetListCountRequest, - O: GetListCountResponse, - kind: MethodKind.Unary, - }, - /** - * Mutes - * - * @generated from rpc bsky.Service.GetActorMutesActor - */ - getActorMutesActor: { - name: "GetActorMutesActor", - I: GetActorMutesActorRequest, - O: GetActorMutesActorResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetMutes - */ - getMutes: { - name: "GetMutes", - I: GetMutesRequest, - O: GetMutesResponse, - kind: MethodKind.Unary, - }, - /** - * Mutelists - * - * @generated from rpc bsky.Service.GetActorMutesActorViaList - */ - getActorMutesActorViaList: { - name: "GetActorMutesActorViaList", - I: GetActorMutesActorViaListRequest, - O: GetActorMutesActorViaListResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetMutelistSubscription - */ - getMutelistSubscription: { - name: "GetMutelistSubscription", - I: GetMutelistSubscriptionRequest, - O: GetMutelistSubscriptionResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetMutelistSubscriptions - */ - getMutelistSubscriptions: { - name: "GetMutelistSubscriptions", - I: GetMutelistSubscriptionsRequest, - O: GetMutelistSubscriptionsResponse, - kind: MethodKind.Unary, - }, - /** - * Thread Mutes - * - * @generated from rpc bsky.Service.GetThreadMutesOnSubjects - */ - getThreadMutesOnSubjects: { - name: "GetThreadMutesOnSubjects", - I: GetThreadMutesOnSubjectsRequest, - O: GetThreadMutesOnSubjectsResponse, - kind: MethodKind.Unary, - }, - /** - * Blocks - * - * @generated from rpc bsky.Service.GetBidirectionalBlock - */ - getBidirectionalBlock: { - name: "GetBidirectionalBlock", - I: GetBidirectionalBlockRequest, - O: GetBidirectionalBlockResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetBlocks - */ - getBlocks: { - name: "GetBlocks", - I: GetBlocksRequest, - O: GetBlocksResponse, - kind: MethodKind.Unary, - }, - /** - * Blocklists - * - * @generated from rpc bsky.Service.GetBidirectionalBlockViaList - */ - getBidirectionalBlockViaList: { - name: "GetBidirectionalBlockViaList", - I: GetBidirectionalBlockViaListRequest, - O: GetBidirectionalBlockViaListResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetBlocklistSubscription - */ - getBlocklistSubscription: { - name: "GetBlocklistSubscription", - I: GetBlocklistSubscriptionRequest, - O: GetBlocklistSubscriptionResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetBlocklistSubscriptions - */ - getBlocklistSubscriptions: { - name: "GetBlocklistSubscriptions", - I: GetBlocklistSubscriptionsRequest, - O: GetBlocklistSubscriptionsResponse, - kind: MethodKind.Unary, - }, - /** - * Notifications - * - * @generated from rpc bsky.Service.GetNotificationPreferences - */ - getNotificationPreferences: { - name: "GetNotificationPreferences", - I: GetNotificationPreferencesRequest, - O: GetNotificationPreferencesResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetNotifications - */ - getNotifications: { - name: "GetNotifications", - I: GetNotificationsRequest, - O: GetNotificationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetNotificationSeen - */ - getNotificationSeen: { - name: "GetNotificationSeen", - I: GetNotificationSeenRequest, - O: GetNotificationSeenResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetUnreadNotificationCount - */ - getUnreadNotificationCount: { - name: "GetUnreadNotificationCount", - I: GetUnreadNotificationCountRequest, - O: GetUnreadNotificationCountResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetActivitySubscriptionDids - */ - getActivitySubscriptionDids: { - name: "GetActivitySubscriptionDids", - I: GetActivitySubscriptionDidsRequest, - O: GetActivitySubscriptionDidsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetActivitySubscriptionsByActorAndSubjects - */ - getActivitySubscriptionsByActorAndSubjects: { - name: "GetActivitySubscriptionsByActorAndSubjects", - I: GetActivitySubscriptionsByActorAndSubjectsRequest, - O: GetActivitySubscriptionsByActorAndSubjectsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.UpdateNotificationSeen - */ - updateNotificationSeen: { - name: "UpdateNotificationSeen", - I: UpdateNotificationSeenRequest, - O: UpdateNotificationSeenResponse, - kind: MethodKind.Unary, - }, - /** - * FeedGenerators - * - * @generated from rpc bsky.Service.GetActorFeeds - */ - getActorFeeds: { - name: "GetActorFeeds", - I: GetActorFeedsRequest, - O: GetActorFeedsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetSuggestedFeeds - */ - getSuggestedFeeds: { - name: "GetSuggestedFeeds", - I: GetSuggestedFeedsRequest, - O: GetSuggestedFeedsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetFeedGeneratorStatus - */ - getFeedGeneratorStatus: { - name: "GetFeedGeneratorStatus", - I: GetFeedGeneratorStatusRequest, - O: GetFeedGeneratorStatusResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.SearchFeedGenerators - */ - searchFeedGenerators: { - name: "SearchFeedGenerators", - I: SearchFeedGeneratorsRequest, - O: SearchFeedGeneratorsResponse, - kind: MethodKind.Unary, - }, - /** - * Feeds - * - * @generated from rpc bsky.Service.GetAuthorFeed - */ - getAuthorFeed: { - name: "GetAuthorFeed", - I: GetAuthorFeedRequest, - O: GetAuthorFeedResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetTimeline - */ - getTimeline: { - name: "GetTimeline", - I: GetTimelineRequest, - O: GetTimelineResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetListFeed - */ - getListFeed: { - name: "GetListFeed", - I: GetListFeedRequest, - O: GetListFeedResponse, - kind: MethodKind.Unary, - }, - /** - * Threads - * - * @generated from rpc bsky.Service.GetThread - */ - getThread: { - name: "GetThread", - I: GetThreadRequest, - O: GetThreadResponse, - kind: MethodKind.Unary, - }, - /** - * Search - * - * @generated from rpc bsky.Service.SearchActors - */ - searchActors: { - name: "SearchActors", - I: SearchActorsRequest, - O: SearchActorsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.SearchPosts - */ - searchPosts: { - name: "SearchPosts", - I: SearchPostsRequest, - O: SearchPostsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.SearchStarterPacks - */ - searchStarterPacks: { - name: "SearchStarterPacks", - I: SearchStarterPacksRequest, - O: SearchStarterPacksResponse, - kind: MethodKind.Unary, - }, - /** - * Suggestions - * - * @generated from rpc bsky.Service.GetFollowSuggestions - */ - getFollowSuggestions: { - name: "GetFollowSuggestions", - I: GetFollowSuggestionsRequest, - O: GetFollowSuggestionsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetSuggestedEntities - */ - getSuggestedEntities: { - name: "GetSuggestedEntities", - I: GetSuggestedEntitiesRequest, - O: GetSuggestedEntitiesResponse, - kind: MethodKind.Unary, - }, - /** - * Labels - * - * @generated from rpc bsky.Service.GetLabels - */ - getLabels: { - name: "GetLabels", - I: GetLabelsRequest, - O: GetLabelsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetAllLabelers - */ - getAllLabelers: { - name: "GetAllLabelers", - I: GetAllLabelersRequest, - O: GetAllLabelersResponse, - kind: MethodKind.Unary, - }, - /** - * Starter packs - * - * @generated from rpc bsky.Service.GetActorStarterPacks - */ - getActorStarterPacks: { - name: "GetActorStarterPacks", - I: GetActorStarterPacksRequest, - O: GetActorStarterPacksResponse, - kind: MethodKind.Unary, - }, - /** - * Sync - * - * @generated from rpc bsky.Service.GetLatestRev - */ - getLatestRev: { - name: "GetLatestRev", - I: GetLatestRevRequest, - O: GetLatestRevResponse, - kind: MethodKind.Unary, - }, - /** - * Moderation - * - * @generated from rpc bsky.Service.GetBlobTakedown - */ - getBlobTakedown: { - name: "GetBlobTakedown", - I: GetBlobTakedownRequest, - O: GetBlobTakedownResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetRecordTakedown - */ - getRecordTakedown: { - name: "GetRecordTakedown", - I: GetRecordTakedownRequest, - O: GetRecordTakedownResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetActorTakedown - */ - getActorTakedown: { - name: "GetActorTakedown", - I: GetActorTakedownRequest, - O: GetActorTakedownResponse, - kind: MethodKind.Unary, - }, - /** - * Bookmarks - * Returns bookmarks created by the actor for the specified URIs. - * - * @generated from rpc bsky.Service.GetBookmarksByActorAndSubjects - */ - getBookmarksByActorAndSubjects: { - name: "GetBookmarksByActorAndSubjects", - I: GetBookmarksByActorAndSubjectsRequest, - O: GetBookmarksByActorAndSubjectsResponse, - kind: MethodKind.Unary, - }, - /** - * Returns the bookmarks created by the actor. - * - * @generated from rpc bsky.Service.GetActorBookmarks - */ - getActorBookmarks: { - name: "GetActorBookmarks", - I: GetActorBookmarksRequest, - O: GetActorBookmarksResponse, - kind: MethodKind.Unary, - }, - /** - * Drafts - * Returns a page of drafts for a user. - * - * @generated from rpc bsky.Service.GetActorDrafts - */ - getActorDrafts: { - name: "GetActorDrafts", - I: GetActorDraftsRequest, - O: GetActorDraftsResponse, - kind: MethodKind.Unary, - }, - /** - * Identity - * - * @generated from rpc bsky.Service.GetIdentityByDid - */ - getIdentityByDid: { - name: "GetIdentityByDid", - I: GetIdentityByDidRequest, - O: GetIdentityByDidResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetIdentityByHandle - */ - getIdentityByHandle: { - name: "GetIdentityByHandle", - I: GetIdentityByHandleRequest, - O: GetIdentityByHandleResponse, - kind: MethodKind.Unary, - }, - /** - * Graph - * - * @generated from rpc bsky.Service.GetFollowsFollowing - */ - getFollowsFollowing: { - name: "GetFollowsFollowing", - I: GetFollowsFollowingRequest, - O: GetFollowsFollowingResponse, - kind: MethodKind.Unary, - }, - /** - * Sitemaps - * - * @generated from rpc bsky.Service.GetSitemapIndex - */ - getSitemapIndex: { - name: "GetSitemapIndex", - I: GetSitemapIndexRequest, - O: GetSitemapIndexResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.GetSitemapPage - */ - getSitemapPage: { - name: "GetSitemapPage", - I: GetSitemapPageRequest, - O: GetSitemapPageResponse, - kind: MethodKind.Unary, - }, - /** - * Ping - * - * @generated from rpc bsky.Service.Ping - */ - ping: { - name: "Ping", - I: PingRequest, - O: PingResponse, - kind: MethodKind.Unary, - }, - /** - * Moderation - * - * @generated from rpc bsky.Service.TakedownBlob - */ - takedownBlob: { - name: "TakedownBlob", - I: TakedownBlobRequest, - O: TakedownBlobResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.TakedownRecord - */ - takedownRecord: { - name: "TakedownRecord", - I: TakedownRecordRequest, - O: TakedownRecordResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.TakedownActor - */ - takedownActor: { - name: "TakedownActor", - I: TakedownActorRequest, - O: TakedownActorResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.UpdateActorUpstreamStatus - */ - updateActorUpstreamStatus: { - name: "UpdateActorUpstreamStatus", - I: UpdateActorUpstreamStatusRequest, - O: UpdateActorUpstreamStatusResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.UntakedownBlob - */ - untakedownBlob: { - name: "UntakedownBlob", - I: UntakedownBlobRequest, - O: UntakedownBlobResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.UntakedownRecord - */ - untakedownRecord: { - name: "UntakedownRecord", - I: UntakedownRecordRequest, - O: UntakedownRecordResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.UntakedownActor - */ - untakedownActor: { - name: "UntakedownActor", - I: UntakedownActorRequest, - O: UntakedownActorResponse, - kind: MethodKind.Unary, - }, - /** - * Ingestion - * - * @generated from rpc bsky.Service.CreateActorMute - */ - createActorMute: { - name: "CreateActorMute", - I: CreateActorMuteRequest, - O: CreateActorMuteResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.DeleteActorMute - */ - deleteActorMute: { - name: "DeleteActorMute", - I: DeleteActorMuteRequest, - O: DeleteActorMuteResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.ClearActorMutes - */ - clearActorMutes: { - name: "ClearActorMutes", - I: ClearActorMutesRequest, - O: ClearActorMutesResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.CreateActorMutelistSubscription - */ - createActorMutelistSubscription: { - name: "CreateActorMutelistSubscription", - I: CreateActorMutelistSubscriptionRequest, - O: CreateActorMutelistSubscriptionResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.DeleteActorMutelistSubscription - */ - deleteActorMutelistSubscription: { - name: "DeleteActorMutelistSubscription", - I: DeleteActorMutelistSubscriptionRequest, - O: DeleteActorMutelistSubscriptionResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.ClearActorMutelistSubscriptions - */ - clearActorMutelistSubscriptions: { - name: "ClearActorMutelistSubscriptions", - I: ClearActorMutelistSubscriptionsRequest, - O: ClearActorMutelistSubscriptionsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.CreateThreadMute - */ - createThreadMute: { - name: "CreateThreadMute", - I: CreateThreadMuteRequest, - O: CreateThreadMuteResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.DeleteThreadMute - */ - deleteThreadMute: { - name: "DeleteThreadMute", - I: DeleteThreadMuteRequest, - O: DeleteThreadMuteResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsky.Service.ClearThreadMutes - */ - clearThreadMutes: { - name: "ClearThreadMutes", - I: ClearThreadMutesRequest, - O: ClearThreadMutesResponse, - kind: MethodKind.Unary, - }, - } -} as const; - diff --git a/packages/bsky/src/proto/bsky_pb.ts b/packages/bsky/src/proto/bsky_pb.ts deleted file mode 100644 index 130e5c426b3..00000000000 --- a/packages/bsky/src/proto/bsky_pb.ts +++ /dev/null @@ -1,11137 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file bsky.proto (package bsky, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf"; - -/** - * @generated from enum bsky.NotificationInclude - */ -export enum NotificationInclude { - /** - * @generated from enum value: NOTIFICATION_INCLUDE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: NOTIFICATION_INCLUDE_ALL = 1; - */ - ALL = 1, - - /** - * @generated from enum value: NOTIFICATION_INCLUDE_FOLLOWS = 2; - */ - FOLLOWS = 2, -} -// Retrieve enum metadata with: proto3.getEnumType(NotificationInclude) -proto3.util.setEnumType(NotificationInclude, "bsky.NotificationInclude", [ - { no: 0, name: "NOTIFICATION_INCLUDE_UNSPECIFIED" }, - { no: 1, name: "NOTIFICATION_INCLUDE_ALL" }, - { no: 2, name: "NOTIFICATION_INCLUDE_FOLLOWS" }, -]); - -/** - * @generated from enum bsky.ChatNotificationInclude - */ -export enum ChatNotificationInclude { - /** - * @generated from enum value: CHAT_NOTIFICATION_INCLUDE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: CHAT_NOTIFICATION_INCLUDE_ALL = 1; - */ - ALL = 1, - - /** - * @generated from enum value: CHAT_NOTIFICATION_INCLUDE_ACCEPTED = 2; - */ - ACCEPTED = 2, -} -// Retrieve enum metadata with: proto3.getEnumType(ChatNotificationInclude) -proto3.util.setEnumType(ChatNotificationInclude, "bsky.ChatNotificationInclude", [ - { no: 0, name: "CHAT_NOTIFICATION_INCLUDE_UNSPECIFIED" }, - { no: 1, name: "CHAT_NOTIFICATION_INCLUDE_ALL" }, - { no: 2, name: "CHAT_NOTIFICATION_INCLUDE_ACCEPTED" }, -]); - -/** - * @generated from enum bsky.FeedType - */ -export enum FeedType { - /** - * @generated from enum value: FEED_TYPE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: FEED_TYPE_POSTS_AND_AUTHOR_THREADS = 1; - */ - POSTS_AND_AUTHOR_THREADS = 1, - - /** - * @generated from enum value: FEED_TYPE_POSTS_NO_REPLIES = 2; - */ - POSTS_NO_REPLIES = 2, - - /** - * @generated from enum value: FEED_TYPE_POSTS_WITH_MEDIA = 3; - */ - POSTS_WITH_MEDIA = 3, - - /** - * @generated from enum value: FEED_TYPE_POSTS_WITH_VIDEO = 4; - */ - POSTS_WITH_VIDEO = 4, -} -// Retrieve enum metadata with: proto3.getEnumType(FeedType) -proto3.util.setEnumType(FeedType, "bsky.FeedType", [ - { no: 0, name: "FEED_TYPE_UNSPECIFIED" }, - { no: 1, name: "FEED_TYPE_POSTS_AND_AUTHOR_THREADS" }, - { no: 2, name: "FEED_TYPE_POSTS_NO_REPLIES" }, - { no: 3, name: "FEED_TYPE_POSTS_WITH_MEDIA" }, - { no: 4, name: "FEED_TYPE_POSTS_WITH_VIDEO" }, -]); - -/** - * @generated from enum bsky.SitemapPageType - */ -export enum SitemapPageType { - /** - * @generated from enum value: SITEMAP_PAGE_TYPE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: SITEMAP_PAGE_TYPE_USER = 1; - */ - USER = 1, -} -// Retrieve enum metadata with: proto3.getEnumType(SitemapPageType) -proto3.util.setEnumType(SitemapPageType, "bsky.SitemapPageType", [ - { no: 0, name: "SITEMAP_PAGE_TYPE_UNSPECIFIED" }, - { no: 1, name: "SITEMAP_PAGE_TYPE_USER" }, -]); - -/** - * @generated from message bsky.Record - */ -export class Record extends Message { - /** - * @generated from field: bytes record = 1; - */ - record = new Uint8Array(0); - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - /** - * @generated from field: google.protobuf.Timestamp indexed_at = 4; - */ - indexedAt?: Timestamp; - - /** - * @generated from field: bool taken_down = 5; - */ - takenDown = false; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 6; - */ - createdAt?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp sorted_at = 7; - */ - sortedAt?: Timestamp; - - /** - * @generated from field: string takedown_ref = 8; - */ - takedownRef = ""; - - /** - * @generated from field: repeated string tags = 9; - */ - tags: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.Record"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "record", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "indexed_at", kind: "message", T: Timestamp }, - { no: 5, name: "taken_down", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "created_at", kind: "message", T: Timestamp }, - { no: 7, name: "sorted_at", kind: "message", T: Timestamp }, - { no: 8, name: "takedown_ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 9, name: "tags", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Record { - return new Record().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Record { - return new Record().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Record { - return new Record().fromJsonString(jsonString, options); - } - - static equals(a: Record | PlainMessage | undefined, b: Record | PlainMessage | undefined): boolean { - return proto3.util.equals(Record, a, b); - } -} - -/** - * @generated from message bsky.GetBlockRecordsRequest - */ -export class GetBlockRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlockRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlockRecordsRequest { - return new GetBlockRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlockRecordsRequest { - return new GetBlockRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlockRecordsRequest { - return new GetBlockRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBlockRecordsRequest | PlainMessage | undefined, b: GetBlockRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlockRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBlockRecordsResponse - */ -export class GetBlockRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlockRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlockRecordsResponse { - return new GetBlockRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlockRecordsResponse { - return new GetBlockRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlockRecordsResponse { - return new GetBlockRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBlockRecordsResponse | PlainMessage | undefined, b: GetBlockRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlockRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetFeedGeneratorRecordsRequest - */ -export class GetFeedGeneratorRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFeedGeneratorRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFeedGeneratorRecordsRequest { - return new GetFeedGeneratorRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFeedGeneratorRecordsRequest { - return new GetFeedGeneratorRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFeedGeneratorRecordsRequest { - return new GetFeedGeneratorRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFeedGeneratorRecordsRequest | PlainMessage | undefined, b: GetFeedGeneratorRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFeedGeneratorRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetFeedGeneratorRecordsResponse - */ -export class GetFeedGeneratorRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFeedGeneratorRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFeedGeneratorRecordsResponse { - return new GetFeedGeneratorRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFeedGeneratorRecordsResponse { - return new GetFeedGeneratorRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFeedGeneratorRecordsResponse { - return new GetFeedGeneratorRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFeedGeneratorRecordsResponse | PlainMessage | undefined, b: GetFeedGeneratorRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFeedGeneratorRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetFollowRecordsRequest - */ -export class GetFollowRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowRecordsRequest { - return new GetFollowRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowRecordsRequest { - return new GetFollowRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowRecordsRequest { - return new GetFollowRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowRecordsRequest | PlainMessage | undefined, b: GetFollowRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetFollowRecordsResponse - */ -export class GetFollowRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowRecordsResponse { - return new GetFollowRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowRecordsResponse { - return new GetFollowRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowRecordsResponse { - return new GetFollowRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowRecordsResponse | PlainMessage | undefined, b: GetFollowRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetLikeRecordsRequest - */ -export class GetLikeRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikeRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikeRecordsRequest { - return new GetLikeRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikeRecordsRequest { - return new GetLikeRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikeRecordsRequest { - return new GetLikeRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLikeRecordsRequest | PlainMessage | undefined, b: GetLikeRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikeRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLikeRecordsResponse - */ -export class GetLikeRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikeRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikeRecordsResponse { - return new GetLikeRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikeRecordsResponse { - return new GetLikeRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikeRecordsResponse { - return new GetLikeRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLikeRecordsResponse | PlainMessage | undefined, b: GetLikeRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikeRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetListBlockRecordsRequest - */ -export class GetListBlockRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListBlockRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListBlockRecordsRequest { - return new GetListBlockRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListBlockRecordsRequest { - return new GetListBlockRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListBlockRecordsRequest { - return new GetListBlockRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListBlockRecordsRequest | PlainMessage | undefined, b: GetListBlockRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListBlockRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListBlockRecordsResponse - */ -export class GetListBlockRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListBlockRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListBlockRecordsResponse { - return new GetListBlockRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListBlockRecordsResponse { - return new GetListBlockRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListBlockRecordsResponse { - return new GetListBlockRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListBlockRecordsResponse | PlainMessage | undefined, b: GetListBlockRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListBlockRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetListItemRecordsRequest - */ -export class GetListItemRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListItemRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListItemRecordsRequest { - return new GetListItemRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListItemRecordsRequest { - return new GetListItemRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListItemRecordsRequest { - return new GetListItemRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListItemRecordsRequest | PlainMessage | undefined, b: GetListItemRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListItemRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListItemRecordsResponse - */ -export class GetListItemRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListItemRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListItemRecordsResponse { - return new GetListItemRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListItemRecordsResponse { - return new GetListItemRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListItemRecordsResponse { - return new GetListItemRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListItemRecordsResponse | PlainMessage | undefined, b: GetListItemRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListItemRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetListRecordsRequest - */ -export class GetListRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListRecordsRequest { - return new GetListRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListRecordsRequest { - return new GetListRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListRecordsRequest { - return new GetListRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListRecordsRequest | PlainMessage | undefined, b: GetListRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListRecordsResponse - */ -export class GetListRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListRecordsResponse { - return new GetListRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListRecordsResponse { - return new GetListRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListRecordsResponse { - return new GetListRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListRecordsResponse | PlainMessage | undefined, b: GetListRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.PostRecordMeta - */ -export class PostRecordMeta extends Message { - /** - * @generated from field: bool violates_thread_gate = 1; - */ - violatesThreadGate = false; - - /** - * @generated from field: bool has_media = 2; - */ - hasMedia = false; - - /** - * @generated from field: bool is_reply = 3; - */ - isReply = false; - - /** - * @generated from field: bool violates_embedding_rules = 4; - */ - violatesEmbeddingRules = false; - - /** - * @generated from field: bool has_post_gate = 5; - */ - hasPostGate = false; - - /** - * @generated from field: bool has_thread_gate = 6; - */ - hasThreadGate = false; - - /** - * @generated from field: bool has_video = 7; - */ - hasVideo = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.PostRecordMeta"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "violates_thread_gate", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 2, name: "has_media", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 3, name: "is_reply", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 4, name: "violates_embedding_rules", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 5, name: "has_post_gate", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "has_thread_gate", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 7, name: "has_video", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PostRecordMeta { - return new PostRecordMeta().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PostRecordMeta { - return new PostRecordMeta().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PostRecordMeta { - return new PostRecordMeta().fromJsonString(jsonString, options); - } - - static equals(a: PostRecordMeta | PlainMessage | undefined, b: PostRecordMeta | PlainMessage | undefined): boolean { - return proto3.util.equals(PostRecordMeta, a, b); - } -} - -/** - * @generated from message bsky.GetPostRecordsRequest - */ -export class GetPostRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: optional string process_dynamic_tags_for_view = 2; - */ - processDynamicTagsForView?: string; - - /** - * @generated from field: optional string viewer_did = 3; - */ - viewerDid?: string; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetPostRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "process_dynamic_tags_for_view", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, - { no: 3, name: "viewer_did", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetPostRecordsRequest { - return new GetPostRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetPostRecordsRequest { - return new GetPostRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetPostRecordsRequest { - return new GetPostRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetPostRecordsRequest | PlainMessage | undefined, b: GetPostRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetPostRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetPostRecordsResponse - */ -export class GetPostRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - /** - * @generated from field: repeated bsky.PostRecordMeta meta = 2; - */ - meta: PostRecordMeta[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetPostRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - { no: 2, name: "meta", kind: "message", T: PostRecordMeta, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetPostRecordsResponse { - return new GetPostRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetPostRecordsResponse { - return new GetPostRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetPostRecordsResponse { - return new GetPostRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetPostRecordsResponse | PlainMessage | undefined, b: GetPostRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetPostRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetProfileRecordsRequest - */ -export class GetProfileRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetProfileRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetProfileRecordsRequest { - return new GetProfileRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetProfileRecordsRequest { - return new GetProfileRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetProfileRecordsRequest { - return new GetProfileRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetProfileRecordsRequest | PlainMessage | undefined, b: GetProfileRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetProfileRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetProfileRecordsResponse - */ -export class GetProfileRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetProfileRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetProfileRecordsResponse { - return new GetProfileRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetProfileRecordsResponse { - return new GetProfileRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetProfileRecordsResponse { - return new GetProfileRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetProfileRecordsResponse | PlainMessage | undefined, b: GetProfileRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetProfileRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetActorChatDeclarationRecordsRequest - */ -export class GetActorChatDeclarationRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorChatDeclarationRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorChatDeclarationRecordsRequest { - return new GetActorChatDeclarationRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorChatDeclarationRecordsRequest { - return new GetActorChatDeclarationRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorChatDeclarationRecordsRequest { - return new GetActorChatDeclarationRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorChatDeclarationRecordsRequest | PlainMessage | undefined, b: GetActorChatDeclarationRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorChatDeclarationRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorChatDeclarationRecordsResponse - */ -export class GetActorChatDeclarationRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorChatDeclarationRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorChatDeclarationRecordsResponse { - return new GetActorChatDeclarationRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorChatDeclarationRecordsResponse { - return new GetActorChatDeclarationRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorChatDeclarationRecordsResponse { - return new GetActorChatDeclarationRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorChatDeclarationRecordsResponse | PlainMessage | undefined, b: GetActorChatDeclarationRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorChatDeclarationRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetNotificationDeclarationRecordsRequest - */ -export class GetNotificationDeclarationRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationDeclarationRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationDeclarationRecordsRequest { - return new GetNotificationDeclarationRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationDeclarationRecordsRequest { - return new GetNotificationDeclarationRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationDeclarationRecordsRequest { - return new GetNotificationDeclarationRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationDeclarationRecordsRequest | PlainMessage | undefined, b: GetNotificationDeclarationRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationDeclarationRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetNotificationDeclarationRecordsResponse - */ -export class GetNotificationDeclarationRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationDeclarationRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationDeclarationRecordsResponse { - return new GetNotificationDeclarationRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationDeclarationRecordsResponse { - return new GetNotificationDeclarationRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationDeclarationRecordsResponse { - return new GetNotificationDeclarationRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationDeclarationRecordsResponse | PlainMessage | undefined, b: GetNotificationDeclarationRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationDeclarationRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetGermDeclarationRecordsRequest - */ -export class GetGermDeclarationRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetGermDeclarationRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetGermDeclarationRecordsRequest { - return new GetGermDeclarationRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetGermDeclarationRecordsRequest { - return new GetGermDeclarationRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetGermDeclarationRecordsRequest { - return new GetGermDeclarationRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetGermDeclarationRecordsRequest | PlainMessage | undefined, b: GetGermDeclarationRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetGermDeclarationRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetGermDeclarationRecordsResponse - */ -export class GetGermDeclarationRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetGermDeclarationRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetGermDeclarationRecordsResponse { - return new GetGermDeclarationRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetGermDeclarationRecordsResponse { - return new GetGermDeclarationRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetGermDeclarationRecordsResponse { - return new GetGermDeclarationRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetGermDeclarationRecordsResponse | PlainMessage | undefined, b: GetGermDeclarationRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetGermDeclarationRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetStatusRecordsRequest - */ -export class GetStatusRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetStatusRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetStatusRecordsRequest { - return new GetStatusRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetStatusRecordsRequest { - return new GetStatusRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetStatusRecordsRequest { - return new GetStatusRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetStatusRecordsRequest | PlainMessage | undefined, b: GetStatusRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetStatusRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetStatusRecordsResponse - */ -export class GetStatusRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetStatusRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetStatusRecordsResponse { - return new GetStatusRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetStatusRecordsResponse { - return new GetStatusRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetStatusRecordsResponse { - return new GetStatusRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetStatusRecordsResponse | PlainMessage | undefined, b: GetStatusRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetStatusRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetRepostRecordsRequest - */ -export class GetRepostRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRepostRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRepostRecordsRequest { - return new GetRepostRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRepostRecordsRequest { - return new GetRepostRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRepostRecordsRequest { - return new GetRepostRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetRepostRecordsRequest | PlainMessage | undefined, b: GetRepostRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRepostRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetRepostRecordsResponse - */ -export class GetRepostRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRepostRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRepostRecordsResponse { - return new GetRepostRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRepostRecordsResponse { - return new GetRepostRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRepostRecordsResponse { - return new GetRepostRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetRepostRecordsResponse | PlainMessage | undefined, b: GetRepostRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRepostRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetThreadGateRecordsRequest - */ -export class GetThreadGateRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetThreadGateRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetThreadGateRecordsRequest { - return new GetThreadGateRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetThreadGateRecordsRequest { - return new GetThreadGateRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetThreadGateRecordsRequest { - return new GetThreadGateRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetThreadGateRecordsRequest | PlainMessage | undefined, b: GetThreadGateRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetThreadGateRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetThreadGateRecordsResponse - */ -export class GetThreadGateRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetThreadGateRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetThreadGateRecordsResponse { - return new GetThreadGateRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetThreadGateRecordsResponse { - return new GetThreadGateRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetThreadGateRecordsResponse { - return new GetThreadGateRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetThreadGateRecordsResponse | PlainMessage | undefined, b: GetThreadGateRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetThreadGateRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetPostgateRecordsRequest - */ -export class GetPostgateRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetPostgateRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetPostgateRecordsRequest { - return new GetPostgateRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetPostgateRecordsRequest { - return new GetPostgateRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetPostgateRecordsRequest { - return new GetPostgateRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetPostgateRecordsRequest | PlainMessage | undefined, b: GetPostgateRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetPostgateRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetPostgateRecordsResponse - */ -export class GetPostgateRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetPostgateRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetPostgateRecordsResponse { - return new GetPostgateRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetPostgateRecordsResponse { - return new GetPostgateRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetPostgateRecordsResponse { - return new GetPostgateRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetPostgateRecordsResponse | PlainMessage | undefined, b: GetPostgateRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetPostgateRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetLabelerRecordsRequest - */ -export class GetLabelerRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLabelerRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLabelerRecordsRequest { - return new GetLabelerRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLabelerRecordsRequest { - return new GetLabelerRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLabelerRecordsRequest { - return new GetLabelerRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLabelerRecordsRequest | PlainMessage | undefined, b: GetLabelerRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLabelerRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLabelerRecordsResponse - */ -export class GetLabelerRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLabelerRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLabelerRecordsResponse { - return new GetLabelerRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLabelerRecordsResponse { - return new GetLabelerRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLabelerRecordsResponse { - return new GetLabelerRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLabelerRecordsResponse | PlainMessage | undefined, b: GetLabelerRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLabelerRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetAllLabelersRequest - */ -export class GetAllLabelersRequest extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetAllLabelersRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetAllLabelersRequest { - return new GetAllLabelersRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetAllLabelersRequest { - return new GetAllLabelersRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetAllLabelersRequest { - return new GetAllLabelersRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetAllLabelersRequest | PlainMessage | undefined, b: GetAllLabelersRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetAllLabelersRequest, a, b); - } -} - -/** - * @generated from message bsky.GetAllLabelersResponse - */ -export class GetAllLabelersResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: repeated bsky.Record records = 2; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetAllLabelersResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetAllLabelersResponse { - return new GetAllLabelersResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetAllLabelersResponse { - return new GetAllLabelersResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetAllLabelersResponse { - return new GetAllLabelersResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetAllLabelersResponse | PlainMessage | undefined, b: GetAllLabelersResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetAllLabelersResponse, a, b); - } -} - -/** - * @generated from message bsky.GetStarterPackRecordsRequest - */ -export class GetStarterPackRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetStarterPackRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetStarterPackRecordsRequest { - return new GetStarterPackRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetStarterPackRecordsRequest { - return new GetStarterPackRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetStarterPackRecordsRequest { - return new GetStarterPackRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetStarterPackRecordsRequest | PlainMessage | undefined, b: GetStarterPackRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetStarterPackRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetStarterPackRecordsResponse - */ -export class GetStarterPackRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetStarterPackRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetStarterPackRecordsResponse { - return new GetStarterPackRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetStarterPackRecordsResponse { - return new GetStarterPackRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetStarterPackRecordsResponse { - return new GetStarterPackRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetStarterPackRecordsResponse | PlainMessage | undefined, b: GetStarterPackRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetStarterPackRecordsResponse, a, b); - } -} - -/** - * - Return follow uris where user A follows users B, C, D, … - * - E.g. for viewer state on `getProfiles` - * - * @generated from message bsky.GetActorFollowsActorsRequest - */ -export class GetActorFollowsActorsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string target_dids = 2; - */ - targetDids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorFollowsActorsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorFollowsActorsRequest { - return new GetActorFollowsActorsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorFollowsActorsRequest { - return new GetActorFollowsActorsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorFollowsActorsRequest { - return new GetActorFollowsActorsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorFollowsActorsRequest | PlainMessage | undefined, b: GetActorFollowsActorsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorFollowsActorsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorFollowsActorsResponse - */ -export class GetActorFollowsActorsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorFollowsActorsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorFollowsActorsResponse { - return new GetActorFollowsActorsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorFollowsActorsResponse { - return new GetActorFollowsActorsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorFollowsActorsResponse { - return new GetActorFollowsActorsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorFollowsActorsResponse | PlainMessage | undefined, b: GetActorFollowsActorsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorFollowsActorsResponse, a, b); - } -} - -/** - * - Return follow uris of users who follows user A - * - For `getFollowers` list - * - * @generated from message bsky.GetFollowersRequest - */ -export class GetFollowersRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowersRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowersRequest { - return new GetFollowersRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowersRequest { - return new GetFollowersRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowersRequest { - return new GetFollowersRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowersRequest | PlainMessage | undefined, b: GetFollowersRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowersRequest, a, b); - } -} - -/** - * @generated from message bsky.FollowInfo - */ -export class FollowInfo extends Message { - /** - * @generated from field: string uri = 1; - */ - uri = ""; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: string subject_did = 3; - */ - subjectDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.FollowInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): FollowInfo { - return new FollowInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): FollowInfo { - return new FollowInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): FollowInfo { - return new FollowInfo().fromJsonString(jsonString, options); - } - - static equals(a: FollowInfo | PlainMessage | undefined, b: FollowInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(FollowInfo, a, b); - } -} - -/** - * @generated from message bsky.GetFollowersResponse - */ -export class GetFollowersResponse extends Message { - /** - * @generated from field: repeated bsky.FollowInfo followers = 1; - */ - followers: FollowInfo[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowersResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "followers", kind: "message", T: FollowInfo, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowersResponse { - return new GetFollowersResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowersResponse { - return new GetFollowersResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowersResponse { - return new GetFollowersResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowersResponse | PlainMessage | undefined, b: GetFollowersResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowersResponse, a, b); - } -} - -/** - * - Return follow uris of users A follows - * - For `getFollows` list - * - * @generated from message bsky.GetFollowsRequest - */ -export class GetFollowsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowsRequest { - return new GetFollowsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowsRequest { - return new GetFollowsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowsRequest { - return new GetFollowsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowsRequest | PlainMessage | undefined, b: GetFollowsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetFollowsResponse - */ -export class GetFollowsResponse extends Message { - /** - * @generated from field: repeated bsky.FollowInfo follows = 1; - */ - follows: FollowInfo[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "follows", kind: "message", T: FollowInfo, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowsResponse { - return new GetFollowsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowsResponse { - return new GetFollowsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowsResponse { - return new GetFollowsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowsResponse | PlainMessage | undefined, b: GetFollowsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowsResponse, a, b); - } -} - -/** - * @generated from message bsky.VerificationMeta - */ -export class VerificationMeta extends Message { - /** - * @generated from field: string rkey = 1; - */ - rkey = ""; - - /** - * @generated from field: string handle = 2; - */ - handle = ""; - - /** - * @generated from field: string display_name = 3; - */ - displayName = ""; - - /** - * @generated from field: google.protobuf.Timestamp sorted_at = 4; - */ - sortedAt?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.VerificationMeta"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "rkey", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "handle", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "display_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "sorted_at", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): VerificationMeta { - return new VerificationMeta().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): VerificationMeta { - return new VerificationMeta().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): VerificationMeta { - return new VerificationMeta().fromJsonString(jsonString, options); - } - - static equals(a: VerificationMeta | PlainMessage | undefined, b: VerificationMeta | PlainMessage | undefined): boolean { - return proto3.util.equals(VerificationMeta, a, b); - } -} - -/** - * @generated from message bsky.GetVerificationRecordsRequest - */ -export class GetVerificationRecordsRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetVerificationRecordsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetVerificationRecordsRequest { - return new GetVerificationRecordsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetVerificationRecordsRequest { - return new GetVerificationRecordsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetVerificationRecordsRequest { - return new GetVerificationRecordsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetVerificationRecordsRequest | PlainMessage | undefined, b: GetVerificationRecordsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetVerificationRecordsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetVerificationRecordsResponse - */ -export class GetVerificationRecordsResponse extends Message { - /** - * @generated from field: repeated bsky.Record records = 1; - */ - records: Record[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetVerificationRecordsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "records", kind: "message", T: Record, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetVerificationRecordsResponse { - return new GetVerificationRecordsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetVerificationRecordsResponse { - return new GetVerificationRecordsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetVerificationRecordsResponse { - return new GetVerificationRecordsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetVerificationRecordsResponse | PlainMessage | undefined, b: GetVerificationRecordsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetVerificationRecordsResponse, a, b); - } -} - -/** - * @generated from message bsky.VerificationIssued - */ -export class VerificationIssued extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string rkey = 2; - */ - rkey = ""; - - /** - * @generated from field: string subject_did = 3; - */ - subjectDid = ""; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 7; - */ - createdAt?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp indexed_at = 8; - */ - indexedAt?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp sorted_at = 9; - */ - sortedAt?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.VerificationIssued"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "rkey", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 7, name: "created_at", kind: "message", T: Timestamp }, - { no: 8, name: "indexed_at", kind: "message", T: Timestamp }, - { no: 9, name: "sorted_at", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): VerificationIssued { - return new VerificationIssued().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): VerificationIssued { - return new VerificationIssued().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): VerificationIssued { - return new VerificationIssued().fromJsonString(jsonString, options); - } - - static equals(a: VerificationIssued | PlainMessage | undefined, b: VerificationIssued | PlainMessage | undefined): boolean { - return proto3.util.equals(VerificationIssued, a, b); - } -} - -/** - * @generated from message bsky.GetVerificationsIssuedRequest - */ -export class GetVerificationsIssuedRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetVerificationsIssuedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetVerificationsIssuedRequest { - return new GetVerificationsIssuedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetVerificationsIssuedRequest { - return new GetVerificationsIssuedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetVerificationsIssuedRequest { - return new GetVerificationsIssuedRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetVerificationsIssuedRequest | PlainMessage | undefined, b: GetVerificationsIssuedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetVerificationsIssuedRequest, a, b); - } -} - -/** - * @generated from message bsky.GetVerificationsIssuedResponse - */ -export class GetVerificationsIssuedResponse extends Message { - /** - * @generated from field: repeated bsky.VerificationIssued verifications = 1; - */ - verifications: VerificationIssued[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetVerificationsIssuedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "verifications", kind: "message", T: VerificationIssued, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetVerificationsIssuedResponse { - return new GetVerificationsIssuedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetVerificationsIssuedResponse { - return new GetVerificationsIssuedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetVerificationsIssuedResponse { - return new GetVerificationsIssuedResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetVerificationsIssuedResponse | PlainMessage | undefined, b: GetVerificationsIssuedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetVerificationsIssuedResponse, a, b); - } -} - -/** - * @generated from message bsky.VerificationReceived - */ -export class VerificationReceived extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string rkey = 2; - */ - rkey = ""; - - /** - * @generated from field: string subject_did = 3; - */ - subjectDid = ""; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 7; - */ - createdAt?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp indexed_at = 8; - */ - indexedAt?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp sorted_at = 9; - */ - sortedAt?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.VerificationReceived"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "rkey", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 7, name: "created_at", kind: "message", T: Timestamp }, - { no: 8, name: "indexed_at", kind: "message", T: Timestamp }, - { no: 9, name: "sorted_at", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): VerificationReceived { - return new VerificationReceived().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): VerificationReceived { - return new VerificationReceived().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): VerificationReceived { - return new VerificationReceived().fromJsonString(jsonString, options); - } - - static equals(a: VerificationReceived | PlainMessage | undefined, b: VerificationReceived | PlainMessage | undefined): boolean { - return proto3.util.equals(VerificationReceived, a, b); - } -} - -/** - * @generated from message bsky.GetVerificationsReceivedRequest - */ -export class GetVerificationsReceivedRequest extends Message { - /** - * @generated from field: string subject_did = 1; - */ - subjectDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetVerificationsReceivedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetVerificationsReceivedRequest { - return new GetVerificationsReceivedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetVerificationsReceivedRequest { - return new GetVerificationsReceivedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetVerificationsReceivedRequest { - return new GetVerificationsReceivedRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetVerificationsReceivedRequest | PlainMessage | undefined, b: GetVerificationsReceivedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetVerificationsReceivedRequest, a, b); - } -} - -/** - * @generated from message bsky.GetVerificationsReceivedResponse - */ -export class GetVerificationsReceivedResponse extends Message { - /** - * @generated from field: repeated bsky.VerificationReceived verifications = 1; - */ - verifications: VerificationReceived[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetVerificationsReceivedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "verifications", kind: "message", T: VerificationReceived, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetVerificationsReceivedResponse { - return new GetVerificationsReceivedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetVerificationsReceivedResponse { - return new GetVerificationsReceivedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetVerificationsReceivedResponse { - return new GetVerificationsReceivedResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetVerificationsReceivedResponse | PlainMessage | undefined, b: GetVerificationsReceivedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetVerificationsReceivedResponse, a, b); - } -} - -/** - * - return like uris where subject uri is subject A - * - `getLikes` list for a post - * - * @generated from message bsky.GetLikesBySubjectRequest - */ -export class GetLikesBySubjectRequest extends Message { - /** - * @generated from field: bsky.RecordRef subject = 1; - */ - subject?: RecordRef; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikesBySubjectRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subject", kind: "message", T: RecordRef }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikesBySubjectRequest { - return new GetLikesBySubjectRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikesBySubjectRequest { - return new GetLikesBySubjectRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikesBySubjectRequest { - return new GetLikesBySubjectRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLikesBySubjectRequest | PlainMessage | undefined, b: GetLikesBySubjectRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikesBySubjectRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLikesBySubjectResponse - */ -export class GetLikesBySubjectResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikesBySubjectResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikesBySubjectResponse { - return new GetLikesBySubjectResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikesBySubjectResponse { - return new GetLikesBySubjectResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikesBySubjectResponse { - return new GetLikesBySubjectResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLikesBySubjectResponse | PlainMessage | undefined, b: GetLikesBySubjectResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikesBySubjectResponse, a, b); - } -} - -/** - * @generated from message bsky.GetLikesBySubjectSortedRequest - */ -export class GetLikesBySubjectSortedRequest extends Message { - /** - * @generated from field: bsky.RecordRef subject = 1; - */ - subject?: RecordRef; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikesBySubjectSortedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subject", kind: "message", T: RecordRef }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikesBySubjectSortedRequest { - return new GetLikesBySubjectSortedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikesBySubjectSortedRequest { - return new GetLikesBySubjectSortedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikesBySubjectSortedRequest { - return new GetLikesBySubjectSortedRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLikesBySubjectSortedRequest | PlainMessage | undefined, b: GetLikesBySubjectSortedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikesBySubjectSortedRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLikesBySubjectSortedResponse - */ -export class GetLikesBySubjectSortedResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikesBySubjectSortedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikesBySubjectSortedResponse { - return new GetLikesBySubjectSortedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikesBySubjectSortedResponse { - return new GetLikesBySubjectSortedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikesBySubjectSortedResponse { - return new GetLikesBySubjectSortedResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLikesBySubjectSortedResponse | PlainMessage | undefined, b: GetLikesBySubjectSortedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikesBySubjectSortedResponse, a, b); - } -} - -/** - * @generated from message bsky.GetQuotesBySubjectSortedRequest - */ -export class GetQuotesBySubjectSortedRequest extends Message { - /** - * @generated from field: bsky.RecordRef subject = 1; - */ - subject?: RecordRef; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetQuotesBySubjectSortedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subject", kind: "message", T: RecordRef }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetQuotesBySubjectSortedRequest { - return new GetQuotesBySubjectSortedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetQuotesBySubjectSortedRequest { - return new GetQuotesBySubjectSortedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetQuotesBySubjectSortedRequest { - return new GetQuotesBySubjectSortedRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetQuotesBySubjectSortedRequest | PlainMessage | undefined, b: GetQuotesBySubjectSortedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetQuotesBySubjectSortedRequest, a, b); - } -} - -/** - * @generated from message bsky.GetQuotesBySubjectSortedResponse - */ -export class GetQuotesBySubjectSortedResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetQuotesBySubjectSortedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetQuotesBySubjectSortedResponse { - return new GetQuotesBySubjectSortedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetQuotesBySubjectSortedResponse { - return new GetQuotesBySubjectSortedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetQuotesBySubjectSortedResponse { - return new GetQuotesBySubjectSortedResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetQuotesBySubjectSortedResponse | PlainMessage | undefined, b: GetQuotesBySubjectSortedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetQuotesBySubjectSortedResponse, a, b); - } -} - -/** - * - return like uris for user A on subject B, C, D... - * - viewer state on posts - * - * @generated from message bsky.GetLikesByActorAndSubjectsRequest - */ -export class GetLikesByActorAndSubjectsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated bsky.RecordRef refs = 2; - */ - refs: RecordRef[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikesByActorAndSubjectsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "refs", kind: "message", T: RecordRef, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikesByActorAndSubjectsRequest { - return new GetLikesByActorAndSubjectsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikesByActorAndSubjectsRequest { - return new GetLikesByActorAndSubjectsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikesByActorAndSubjectsRequest { - return new GetLikesByActorAndSubjectsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLikesByActorAndSubjectsRequest | PlainMessage | undefined, b: GetLikesByActorAndSubjectsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikesByActorAndSubjectsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLikesByActorAndSubjectsResponse - */ -export class GetLikesByActorAndSubjectsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLikesByActorAndSubjectsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLikesByActorAndSubjectsResponse { - return new GetLikesByActorAndSubjectsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLikesByActorAndSubjectsResponse { - return new GetLikesByActorAndSubjectsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLikesByActorAndSubjectsResponse { - return new GetLikesByActorAndSubjectsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLikesByActorAndSubjectsResponse | PlainMessage | undefined, b: GetLikesByActorAndSubjectsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLikesByActorAndSubjectsResponse, a, b); - } -} - -/** - * - return recent like uris for user A - * - `getActorLikes` list for a user - * - * @generated from message bsky.GetActorLikesRequest - */ -export class GetActorLikesRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorLikesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorLikesRequest { - return new GetActorLikesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorLikesRequest { - return new GetActorLikesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorLikesRequest { - return new GetActorLikesRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorLikesRequest | PlainMessage | undefined, b: GetActorLikesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorLikesRequest, a, b); - } -} - -/** - * @generated from message bsky.LikeInfo - */ -export class LikeInfo extends Message { - /** - * @generated from field: string uri = 1; - */ - uri = ""; - - /** - * @generated from field: string subject = 2; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.LikeInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): LikeInfo { - return new LikeInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): LikeInfo { - return new LikeInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): LikeInfo { - return new LikeInfo().fromJsonString(jsonString, options); - } - - static equals(a: LikeInfo | PlainMessage | undefined, b: LikeInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(LikeInfo, a, b); - } -} - -/** - * @generated from message bsky.GetActorLikesResponse - */ -export class GetActorLikesResponse extends Message { - /** - * @generated from field: repeated bsky.LikeInfo likes = 1; - */ - likes: LikeInfo[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorLikesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "likes", kind: "message", T: LikeInfo, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorLikesResponse { - return new GetActorLikesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorLikesResponse { - return new GetActorLikesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorLikesResponse { - return new GetActorLikesResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorLikesResponse | PlainMessage | undefined, b: GetActorLikesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorLikesResponse, a, b); - } -} - -/** - * - * Interactions - * - * - * @generated from message bsky.GetInteractionCountsRequest - */ -export class GetInteractionCountsRequest extends Message { - /** - * @generated from field: repeated bsky.RecordRef refs = 1; - */ - refs: RecordRef[] = []; - - /** - * @generated from field: repeated string skip_cache_for_dids = 2; - */ - skipCacheForDids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetInteractionCountsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "refs", kind: "message", T: RecordRef, repeated: true }, - { no: 2, name: "skip_cache_for_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetInteractionCountsRequest { - return new GetInteractionCountsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetInteractionCountsRequest { - return new GetInteractionCountsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetInteractionCountsRequest { - return new GetInteractionCountsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetInteractionCountsRequest | PlainMessage | undefined, b: GetInteractionCountsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetInteractionCountsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetInteractionCountsResponse - */ -export class GetInteractionCountsResponse extends Message { - /** - * @generated from field: repeated int32 likes = 1; - */ - likes: number[] = []; - - /** - * @generated from field: repeated int32 reposts = 2; - */ - reposts: number[] = []; - - /** - * @generated from field: repeated int32 replies = 3; - */ - replies: number[] = []; - - /** - * @generated from field: repeated int32 quotes = 4; - */ - quotes: number[] = []; - - /** - * @generated from field: repeated int32 bookmarks = 5; - */ - bookmarks: number[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetInteractionCountsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "likes", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 2, name: "reposts", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 3, name: "replies", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 4, name: "quotes", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 5, name: "bookmarks", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetInteractionCountsResponse { - return new GetInteractionCountsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetInteractionCountsResponse { - return new GetInteractionCountsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetInteractionCountsResponse { - return new GetInteractionCountsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetInteractionCountsResponse | PlainMessage | undefined, b: GetInteractionCountsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetInteractionCountsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetCountsForUsersRequest - */ -export class GetCountsForUsersRequest extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetCountsForUsersRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetCountsForUsersRequest { - return new GetCountsForUsersRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetCountsForUsersRequest { - return new GetCountsForUsersRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetCountsForUsersRequest { - return new GetCountsForUsersRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetCountsForUsersRequest | PlainMessage | undefined, b: GetCountsForUsersRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetCountsForUsersRequest, a, b); - } -} - -/** - * @generated from message bsky.GetCountsForUsersResponse - */ -export class GetCountsForUsersResponse extends Message { - /** - * @generated from field: repeated int32 posts = 1; - */ - posts: number[] = []; - - /** - * @generated from field: repeated int32 reposts = 2; - */ - reposts: number[] = []; - - /** - * @generated from field: repeated int32 following = 3; - */ - following: number[] = []; - - /** - * @generated from field: repeated int32 followers = 4; - */ - followers: number[] = []; - - /** - * @generated from field: repeated int32 lists = 5; - */ - lists: number[] = []; - - /** - * @generated from field: repeated int32 feeds = 6; - */ - feeds: number[] = []; - - /** - * @generated from field: repeated int32 starter_packs = 7; - */ - starterPacks: number[] = []; - - /** - * @generated from field: repeated int32 drafts = 8; - */ - drafts: number[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetCountsForUsersResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "posts", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 2, name: "reposts", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 3, name: "following", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 4, name: "followers", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 5, name: "lists", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 6, name: "feeds", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 7, name: "starter_packs", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 8, name: "drafts", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetCountsForUsersResponse { - return new GetCountsForUsersResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetCountsForUsersResponse { - return new GetCountsForUsersResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetCountsForUsersResponse { - return new GetCountsForUsersResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetCountsForUsersResponse | PlainMessage | undefined, b: GetCountsForUsersResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetCountsForUsersResponse, a, b); - } -} - -/** - * @generated from message bsky.GetStarterPackCountsRequest - */ -export class GetStarterPackCountsRequest extends Message { - /** - * @generated from field: repeated bsky.RecordRef refs = 1; - */ - refs: RecordRef[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetStarterPackCountsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "refs", kind: "message", T: RecordRef, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetStarterPackCountsRequest { - return new GetStarterPackCountsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetStarterPackCountsRequest { - return new GetStarterPackCountsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetStarterPackCountsRequest { - return new GetStarterPackCountsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetStarterPackCountsRequest | PlainMessage | undefined, b: GetStarterPackCountsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetStarterPackCountsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetStarterPackCountsResponse - */ -export class GetStarterPackCountsResponse extends Message { - /** - * @generated from field: repeated int32 joined_week = 1; - */ - joinedWeek: number[] = []; - - /** - * @generated from field: repeated int32 joined_all_time = 2; - */ - joinedAllTime: number[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetStarterPackCountsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "joined_week", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - { no: 2, name: "joined_all_time", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetStarterPackCountsResponse { - return new GetStarterPackCountsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetStarterPackCountsResponse { - return new GetStarterPackCountsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetStarterPackCountsResponse { - return new GetStarterPackCountsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetStarterPackCountsResponse | PlainMessage | undefined, b: GetStarterPackCountsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetStarterPackCountsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetListCountsRequest - */ -export class GetListCountsRequest extends Message { - /** - * @generated from field: repeated bsky.RecordRef refs = 1; - */ - refs: RecordRef[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListCountsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "refs", kind: "message", T: RecordRef, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListCountsRequest { - return new GetListCountsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListCountsRequest { - return new GetListCountsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListCountsRequest { - return new GetListCountsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListCountsRequest | PlainMessage | undefined, b: GetListCountsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListCountsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListCountsResponse - */ -export class GetListCountsResponse extends Message { - /** - * @generated from field: repeated int32 list_items = 1; - */ - listItems: number[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListCountsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_items", kind: "scalar", T: 5 /* ScalarType.INT32 */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListCountsResponse { - return new GetListCountsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListCountsResponse { - return new GetListCountsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListCountsResponse { - return new GetListCountsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListCountsResponse | PlainMessage | undefined, b: GetListCountsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListCountsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetNewUserCountForRangeRequest - */ -export class GetNewUserCountForRangeRequest extends Message { - /** - * @generated from field: google.protobuf.Timestamp start = 1; - */ - start?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp end = 2; - */ - end?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNewUserCountForRangeRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "start", kind: "message", T: Timestamp }, - { no: 2, name: "end", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNewUserCountForRangeRequest { - return new GetNewUserCountForRangeRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNewUserCountForRangeRequest { - return new GetNewUserCountForRangeRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNewUserCountForRangeRequest { - return new GetNewUserCountForRangeRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetNewUserCountForRangeRequest | PlainMessage | undefined, b: GetNewUserCountForRangeRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNewUserCountForRangeRequest, a, b); - } -} - -/** - * @generated from message bsky.GetNewUserCountForRangeResponse - */ -export class GetNewUserCountForRangeResponse extends Message { - /** - * @generated from field: int32 count = 1; - */ - count = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNewUserCountForRangeResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNewUserCountForRangeResponse { - return new GetNewUserCountForRangeResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNewUserCountForRangeResponse { - return new GetNewUserCountForRangeResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNewUserCountForRangeResponse { - return new GetNewUserCountForRangeResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetNewUserCountForRangeResponse | PlainMessage | undefined, b: GetNewUserCountForRangeResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNewUserCountForRangeResponse, a, b); - } -} - -/** - * - return repost uris where subject uri is subject A - * - `getReposts` list for a post - * - * @generated from message bsky.GetRepostsBySubjectRequest - */ -export class GetRepostsBySubjectRequest extends Message { - /** - * @generated from field: bsky.RecordRef subject = 1; - */ - subject?: RecordRef; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRepostsBySubjectRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subject", kind: "message", T: RecordRef }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRepostsBySubjectRequest { - return new GetRepostsBySubjectRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRepostsBySubjectRequest { - return new GetRepostsBySubjectRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRepostsBySubjectRequest { - return new GetRepostsBySubjectRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetRepostsBySubjectRequest | PlainMessage | undefined, b: GetRepostsBySubjectRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRepostsBySubjectRequest, a, b); - } -} - -/** - * @generated from message bsky.GetRepostsBySubjectResponse - */ -export class GetRepostsBySubjectResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRepostsBySubjectResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRepostsBySubjectResponse { - return new GetRepostsBySubjectResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRepostsBySubjectResponse { - return new GetRepostsBySubjectResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRepostsBySubjectResponse { - return new GetRepostsBySubjectResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetRepostsBySubjectResponse | PlainMessage | undefined, b: GetRepostsBySubjectResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRepostsBySubjectResponse, a, b); - } -} - -/** - * - return repost uris for user A on subject B, C, D... - * - viewer state on posts - * - * @generated from message bsky.GetRepostsByActorAndSubjectsRequest - */ -export class GetRepostsByActorAndSubjectsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated bsky.RecordRef refs = 2; - */ - refs: RecordRef[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRepostsByActorAndSubjectsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "refs", kind: "message", T: RecordRef, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRepostsByActorAndSubjectsRequest { - return new GetRepostsByActorAndSubjectsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRepostsByActorAndSubjectsRequest { - return new GetRepostsByActorAndSubjectsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRepostsByActorAndSubjectsRequest { - return new GetRepostsByActorAndSubjectsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetRepostsByActorAndSubjectsRequest | PlainMessage | undefined, b: GetRepostsByActorAndSubjectsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRepostsByActorAndSubjectsRequest, a, b); - } -} - -/** - * @generated from message bsky.RecordRef - */ -export class RecordRef extends Message { - /** - * @generated from field: string uri = 1; - */ - uri = ""; - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.RecordRef"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RecordRef { - return new RecordRef().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RecordRef { - return new RecordRef().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RecordRef { - return new RecordRef().fromJsonString(jsonString, options); - } - - static equals(a: RecordRef | PlainMessage | undefined, b: RecordRef | PlainMessage | undefined): boolean { - return proto3.util.equals(RecordRef, a, b); - } -} - -/** - * @generated from message bsky.GetRepostsByActorAndSubjectsResponse - */ -export class GetRepostsByActorAndSubjectsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRepostsByActorAndSubjectsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRepostsByActorAndSubjectsResponse { - return new GetRepostsByActorAndSubjectsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRepostsByActorAndSubjectsResponse { - return new GetRepostsByActorAndSubjectsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRepostsByActorAndSubjectsResponse { - return new GetRepostsByActorAndSubjectsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetRepostsByActorAndSubjectsResponse | PlainMessage | undefined, b: GetRepostsByActorAndSubjectsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRepostsByActorAndSubjectsResponse, a, b); - } -} - -/** - * - return recent repost uris for user A - * - `getActorReposts` list for a user - * - * @generated from message bsky.GetActorRepostsRequest - */ -export class GetActorRepostsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorRepostsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorRepostsRequest { - return new GetActorRepostsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorRepostsRequest { - return new GetActorRepostsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorRepostsRequest { - return new GetActorRepostsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorRepostsRequest | PlainMessage | undefined, b: GetActorRepostsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorRepostsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorRepostsResponse - */ -export class GetActorRepostsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorRepostsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorRepostsResponse { - return new GetActorRepostsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorRepostsResponse { - return new GetActorRepostsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorRepostsResponse { - return new GetActorRepostsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorRepostsResponse | PlainMessage | undefined, b: GetActorRepostsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorRepostsResponse, a, b); - } -} - -/** - * - return actor information for dids A, B, C… - * - profile hydration - * - should this include handles? apply repo takedown? - * - * @generated from message bsky.GetActorsRequest - */ -export class GetActorsRequest extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - /** - * @generated from field: repeated string skip_cache_for_dids = 2; - */ - skipCacheForDids: string[] = []; - - /** - * @generated from field: repeated string return_age_assurance_for_dids = 3; - */ - returnAgeAssuranceForDids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "skip_cache_for_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 3, name: "return_age_assurance_for_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorsRequest { - return new GetActorsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorsRequest { - return new GetActorsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorsRequest { - return new GetActorsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorsRequest | PlainMessage | undefined, b: GetActorsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorsRequest, a, b); - } -} - -/** - * @generated from message bsky.ActorInfo - */ -export class ActorInfo extends Message { - /** - * @generated from field: bool exists = 1; - */ - exists = false; - - /** - * @generated from field: string handle = 2; - */ - handle = ""; - - /** - * @generated from field: bsky.Record profile = 3; - */ - profile?: Record; - - /** - * @generated from field: bool taken_down = 4; - */ - takenDown = false; - - /** - * @generated from field: string takedown_ref = 5; - */ - takedownRef = ""; - - /** - * @generated from field: google.protobuf.Timestamp tombstoned_at = 6; - */ - tombstonedAt?: Timestamp; - - /** - * @generated from field: bool labeler = 7; - */ - labeler = false; - - /** - * @generated from field: string allow_incoming_chats_from = 8; - */ - allowIncomingChatsFrom = ""; - - /** - * @generated from field: string upstream_status = 9; - */ - upstreamStatus = ""; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 10; - */ - createdAt?: Timestamp; - - /** - * @generated from field: bool priority_notifications = 11; - */ - priorityNotifications = false; - - /** - * @generated from field: double pagerank = 12; - */ - pagerank = 0; - - /** - * @generated from field: bool trusted_verifier = 13; - */ - trustedVerifier = false; - - /** - * @generated from field: map verified_by = 14; - */ - verifiedBy: { [key: string]: VerificationMeta } = {}; - - /** - * Tags being applied to the account itself - * - * @generated from field: repeated string tags = 15; - */ - tags: string[] = []; - - /** - * Tags being applied to the profile record - * - * @generated from field: repeated string profile_tags = 16; - */ - profileTags: string[] = []; - - /** - * @generated from field: bsky.Record status_record = 17; - */ - statusRecord?: Record; - - /** - * @generated from field: string allow_activity_subscriptions_from = 18; - */ - allowActivitySubscriptionsFrom = ""; - - /** - * @generated from field: optional bsky.AgeAssuranceStatus age_assurance_status = 19; - */ - ageAssuranceStatus?: AgeAssuranceStatus; - - /** - * @generated from field: bsky.Record germ_record = 21; - */ - germRecord?: Record; - - /** - * @generated from field: string allow_group_chat_invites_from = 22; - */ - allowGroupChatInvitesFrom = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ActorInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "exists", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 2, name: "handle", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "profile", kind: "message", T: Record }, - { no: 4, name: "taken_down", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 5, name: "takedown_ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 6, name: "tombstoned_at", kind: "message", T: Timestamp }, - { no: 7, name: "labeler", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 8, name: "allow_incoming_chats_from", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 9, name: "upstream_status", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 10, name: "created_at", kind: "message", T: Timestamp }, - { no: 11, name: "priority_notifications", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 12, name: "pagerank", kind: "scalar", T: 1 /* ScalarType.DOUBLE */ }, - { no: 13, name: "trusted_verifier", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 14, name: "verified_by", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: VerificationMeta} }, - { no: 15, name: "tags", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 16, name: "profile_tags", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 17, name: "status_record", kind: "message", T: Record }, - { no: 18, name: "allow_activity_subscriptions_from", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 19, name: "age_assurance_status", kind: "message", T: AgeAssuranceStatus, opt: true }, - { no: 21, name: "germ_record", kind: "message", T: Record }, - { no: 22, name: "allow_group_chat_invites_from", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ActorInfo { - return new ActorInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ActorInfo { - return new ActorInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ActorInfo { - return new ActorInfo().fromJsonString(jsonString, options); - } - - static equals(a: ActorInfo | PlainMessage | undefined, b: ActorInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(ActorInfo, a, b); - } -} - -/** - * @generated from message bsky.AgeAssuranceStatus - */ -export class AgeAssuranceStatus extends Message { - /** - * @generated from field: string status = 1; - */ - status = ""; - - /** - * @generated from field: google.protobuf.Timestamp last_initiated_at = 2; - */ - lastInitiatedAt?: Timestamp; - - /** - * @generated from field: bool override_applied = 3; - */ - overrideApplied = false; - - /** - * @generated from field: string access = 4; - */ - access = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.AgeAssuranceStatus"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "status", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "last_initiated_at", kind: "message", T: Timestamp }, - { no: 3, name: "override_applied", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 4, name: "access", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AgeAssuranceStatus { - return new AgeAssuranceStatus().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AgeAssuranceStatus { - return new AgeAssuranceStatus().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AgeAssuranceStatus { - return new AgeAssuranceStatus().fromJsonString(jsonString, options); - } - - static equals(a: AgeAssuranceStatus | PlainMessage | undefined, b: AgeAssuranceStatus | PlainMessage | undefined): boolean { - return proto3.util.equals(AgeAssuranceStatus, a, b); - } -} - -/** - * @generated from message bsky.GetActorsResponse - */ -export class GetActorsResponse extends Message { - /** - * @generated from field: repeated bsky.ActorInfo actors = 1; - */ - actors: ActorInfo[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actors", kind: "message", T: ActorInfo, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorsResponse { - return new GetActorsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorsResponse { - return new GetActorsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorsResponse { - return new GetActorsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorsResponse | PlainMessage | undefined, b: GetActorsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorsResponse, a, b); - } -} - -/** - * - return did for handle A - * - `resolveHandle` - * - answering queries where the query param is a handle - * - * @generated from message bsky.GetDidsByHandlesRequest - */ -export class GetDidsByHandlesRequest extends Message { - /** - * @generated from field: repeated string handles = 1; - */ - handles: string[] = []; - - /** - * @generated from field: bool lookup_unidirectional = 2; - */ - lookupUnidirectional = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetDidsByHandlesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "handles", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "lookup_unidirectional", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetDidsByHandlesRequest { - return new GetDidsByHandlesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetDidsByHandlesRequest { - return new GetDidsByHandlesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetDidsByHandlesRequest { - return new GetDidsByHandlesRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetDidsByHandlesRequest | PlainMessage | undefined, b: GetDidsByHandlesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetDidsByHandlesRequest, a, b); - } -} - -/** - * @generated from message bsky.GetDidsByHandlesResponse - */ -export class GetDidsByHandlesResponse extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetDidsByHandlesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetDidsByHandlesResponse { - return new GetDidsByHandlesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetDidsByHandlesResponse { - return new GetDidsByHandlesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetDidsByHandlesResponse { - return new GetDidsByHandlesResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetDidsByHandlesResponse | PlainMessage | undefined, b: GetDidsByHandlesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetDidsByHandlesResponse, a, b); - } -} - -/** - * - return relationships between user A and users B, C, D... - * - profile hydration - * - block application - * - * @generated from message bsky.GetRelationshipsRequest - */ -export class GetRelationshipsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string target_dids = 2; - */ - targetDids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRelationshipsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRelationshipsRequest { - return new GetRelationshipsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRelationshipsRequest { - return new GetRelationshipsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRelationshipsRequest { - return new GetRelationshipsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetRelationshipsRequest | PlainMessage | undefined, b: GetRelationshipsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRelationshipsRequest, a, b); - } -} - -/** - * @generated from message bsky.Relationships - */ -export class Relationships extends Message { - /** - * @generated from field: bool muted = 1; - */ - muted = false; - - /** - * @generated from field: string muted_by_list = 2; - */ - mutedByList = ""; - - /** - * @generated from field: string blocked_by = 3; - */ - blockedBy = ""; - - /** - * @generated from field: string blocking = 4; - */ - blocking = ""; - - /** - * @generated from field: string blocked_by_list = 5; - */ - blockedByList = ""; - - /** - * @generated from field: string blocking_by_list = 6; - */ - blockingByList = ""; - - /** - * @generated from field: string following = 7; - */ - following = ""; - - /** - * @generated from field: string followed_by = 8; - */ - followedBy = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.Relationships"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "muted", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 2, name: "muted_by_list", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "blocked_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "blocking", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "blocked_by_list", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 6, name: "blocking_by_list", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 7, name: "following", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 8, name: "followed_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Relationships { - return new Relationships().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Relationships { - return new Relationships().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Relationships { - return new Relationships().fromJsonString(jsonString, options); - } - - static equals(a: Relationships | PlainMessage | undefined, b: Relationships | PlainMessage | undefined): boolean { - return proto3.util.equals(Relationships, a, b); - } -} - -/** - * @generated from message bsky.GetRelationshipsResponse - */ -export class GetRelationshipsResponse extends Message { - /** - * @generated from field: repeated bsky.Relationships relationships = 1; - */ - relationships: Relationships[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRelationshipsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "relationships", kind: "message", T: Relationships, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRelationshipsResponse { - return new GetRelationshipsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRelationshipsResponse { - return new GetRelationshipsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRelationshipsResponse { - return new GetRelationshipsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetRelationshipsResponse | PlainMessage | undefined, b: GetRelationshipsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRelationshipsResponse, a, b); - } -} - -/** - * - return whether a block (bidrectionally and either direct or through a list) exists between two dids - * - enforcing 3rd party block violations - * - * @generated from message bsky.RelationshipPair - */ -export class RelationshipPair extends Message { - /** - * @generated from field: string a = 1; - */ - a = ""; - - /** - * @generated from field: string b = 2; - */ - b = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.RelationshipPair"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "a", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "b", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RelationshipPair { - return new RelationshipPair().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RelationshipPair { - return new RelationshipPair().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RelationshipPair { - return new RelationshipPair().fromJsonString(jsonString, options); - } - - static equals(a: RelationshipPair | PlainMessage | undefined, b: RelationshipPair | PlainMessage | undefined): boolean { - return proto3.util.equals(RelationshipPair, a, b); - } -} - -/** - * @generated from message bsky.BlockExistence - */ -export class BlockExistence extends Message { - /** - * @generated from field: string blocked_by = 1; - */ - blockedBy = ""; - - /** - * @generated from field: string blocking = 2; - */ - blocking = ""; - - /** - * @generated from field: string blocked_by_list = 3; - */ - blockedByList = ""; - - /** - * @generated from field: string blocking_by_list = 4; - */ - blockingByList = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.BlockExistence"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "blocked_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "blocking", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "blocked_by_list", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "blocking_by_list", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): BlockExistence { - return new BlockExistence().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): BlockExistence { - return new BlockExistence().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): BlockExistence { - return new BlockExistence().fromJsonString(jsonString, options); - } - - static equals(a: BlockExistence | PlainMessage | undefined, b: BlockExistence | PlainMessage | undefined): boolean { - return proto3.util.equals(BlockExistence, a, b); - } -} - -/** - * @generated from message bsky.GetBlockExistenceRequest - */ -export class GetBlockExistenceRequest extends Message { - /** - * @generated from field: repeated bsky.RelationshipPair pairs = 1; - */ - pairs: RelationshipPair[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlockExistenceRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "pairs", kind: "message", T: RelationshipPair, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlockExistenceRequest { - return new GetBlockExistenceRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlockExistenceRequest { - return new GetBlockExistenceRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlockExistenceRequest { - return new GetBlockExistenceRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBlockExistenceRequest | PlainMessage | undefined, b: GetBlockExistenceRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlockExistenceRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBlockExistenceResponse - */ -export class GetBlockExistenceResponse extends Message { - /** - * @generated from field: repeated bool exists = 1; - */ - exists: boolean[] = []; - - /** - * @generated from field: repeated bsky.BlockExistence blocks = 2; - */ - blocks: BlockExistence[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlockExistenceResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "exists", kind: "scalar", T: 8 /* ScalarType.BOOL */, repeated: true }, - { no: 2, name: "blocks", kind: "message", T: BlockExistence, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlockExistenceResponse { - return new GetBlockExistenceResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlockExistenceResponse { - return new GetBlockExistenceResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlockExistenceResponse { - return new GetBlockExistenceResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBlockExistenceResponse | PlainMessage | undefined, b: GetBlockExistenceResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlockExistenceResponse, a, b); - } -} - -/** - * @generated from message bsky.ListItemInfo - */ -export class ListItemInfo extends Message { - /** - * @generated from field: string uri = 1; - */ - uri = ""; - - /** - * @generated from field: string did = 2; - */ - did = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ListItemInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ListItemInfo { - return new ListItemInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ListItemInfo { - return new ListItemInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ListItemInfo { - return new ListItemInfo().fromJsonString(jsonString, options); - } - - static equals(a: ListItemInfo | PlainMessage | undefined, b: ListItemInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(ListItemInfo, a, b); - } -} - -/** - * - Return dids of users in list A - * - E.g. to view items in one of your mute lists - * - * @generated from message bsky.GetListMembersRequest - */ -export class GetListMembersRequest extends Message { - /** - * @generated from field: string list_uri = 1; - */ - listUri = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListMembersRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListMembersRequest { - return new GetListMembersRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListMembersRequest { - return new GetListMembersRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListMembersRequest { - return new GetListMembersRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListMembersRequest | PlainMessage | undefined, b: GetListMembersRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListMembersRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListMembersResponse - */ -export class GetListMembersResponse extends Message { - /** - * @generated from field: repeated bsky.ListItemInfo listitems = 1; - */ - listitems: ListItemInfo[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListMembersResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "listitems", kind: "message", T: ListItemInfo, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListMembersResponse { - return new GetListMembersResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListMembersResponse { - return new GetListMembersResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListMembersResponse { - return new GetListMembersResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListMembersResponse | PlainMessage | undefined, b: GetListMembersResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListMembersResponse, a, b); - } -} - -/** - * - Return list uris where user A in list B, C, D… - * - Used in thread reply gates - * - * @generated from message bsky.GetListMembershipRequest - */ -export class GetListMembershipRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string list_uris = 2; - */ - listUris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListMembershipRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "list_uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListMembershipRequest { - return new GetListMembershipRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListMembershipRequest { - return new GetListMembershipRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListMembershipRequest { - return new GetListMembershipRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListMembershipRequest | PlainMessage | undefined, b: GetListMembershipRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListMembershipRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListMembershipResponse - */ -export class GetListMembershipResponse extends Message { - /** - * @generated from field: repeated string listitem_uris = 1; - */ - listitemUris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListMembershipResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "listitem_uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListMembershipResponse { - return new GetListMembershipResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListMembershipResponse { - return new GetListMembershipResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListMembershipResponse { - return new GetListMembershipResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListMembershipResponse | PlainMessage | undefined, b: GetListMembershipResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListMembershipResponse, a, b); - } -} - -/** - * - Return number of items in list A - * - For aggregate - * - * @generated from message bsky.GetListCountRequest - */ -export class GetListCountRequest extends Message { - /** - * @generated from field: string list_uri = 1; - */ - listUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListCountRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListCountRequest { - return new GetListCountRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListCountRequest { - return new GetListCountRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListCountRequest { - return new GetListCountRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListCountRequest | PlainMessage | undefined, b: GetListCountRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListCountRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListCountResponse - */ -export class GetListCountResponse extends Message { - /** - * @generated from field: int32 count = 1; - */ - count = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListCountResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListCountResponse { - return new GetListCountResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListCountResponse { - return new GetListCountResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListCountResponse { - return new GetListCountResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListCountResponse | PlainMessage | undefined, b: GetListCountResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListCountResponse, a, b); - } -} - -/** - * - return list of uris of lists created by A - * - `getLists` - * - * @generated from message bsky.GetActorListsRequest - */ -export class GetActorListsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorListsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorListsRequest { - return new GetActorListsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorListsRequest { - return new GetActorListsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorListsRequest { - return new GetActorListsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorListsRequest | PlainMessage | undefined, b: GetActorListsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorListsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorListsResponse - */ -export class GetActorListsResponse extends Message { - /** - * @generated from field: repeated string list_uris = 1; - */ - listUris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorListsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorListsResponse { - return new GetActorListsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorListsResponse { - return new GetActorListsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorListsResponse { - return new GetActorListsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorListsResponse | PlainMessage | undefined, b: GetActorListsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorListsResponse, a, b); - } -} - -/** - * - return boolean if user A has muted user B - * - hydrating mute state onto profiles - * - * @generated from message bsky.GetActorMutesActorRequest - */ -export class GetActorMutesActorRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string target_did = 2; - */ - targetDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorMutesActorRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorMutesActorRequest { - return new GetActorMutesActorRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorMutesActorRequest { - return new GetActorMutesActorRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorMutesActorRequest { - return new GetActorMutesActorRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorMutesActorRequest | PlainMessage | undefined, b: GetActorMutesActorRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorMutesActorRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorMutesActorResponse - */ -export class GetActorMutesActorResponse extends Message { - /** - * @generated from field: bool muted = 1; - */ - muted = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorMutesActorResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "muted", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorMutesActorResponse { - return new GetActorMutesActorResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorMutesActorResponse { - return new GetActorMutesActorResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorMutesActorResponse { - return new GetActorMutesActorResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorMutesActorResponse | PlainMessage | undefined, b: GetActorMutesActorResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorMutesActorResponse, a, b); - } -} - -/** - * - return list of user dids of users who A mutes - * - `getMutes` - * - * @generated from message bsky.GetMutesRequest - */ -export class GetMutesRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetMutesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMutesRequest { - return new GetMutesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMutesRequest { - return new GetMutesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMutesRequest { - return new GetMutesRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetMutesRequest | PlainMessage | undefined, b: GetMutesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMutesRequest, a, b); - } -} - -/** - * @generated from message bsky.GetMutesResponse - */ -export class GetMutesResponse extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetMutesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMutesResponse { - return new GetMutesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMutesResponse { - return new GetMutesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMutesResponse { - return new GetMutesResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetMutesResponse | PlainMessage | undefined, b: GetMutesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMutesResponse, a, b); - } -} - -/** - * - return list uri of *any* list through which user A has muted user B - * - hydrating mute state onto profiles - * - note: we only need *one* uri even if a user is muted by multiple lists - * - * @generated from message bsky.GetActorMutesActorViaListRequest - */ -export class GetActorMutesActorViaListRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string target_did = 2; - */ - targetDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorMutesActorViaListRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorMutesActorViaListRequest { - return new GetActorMutesActorViaListRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorMutesActorViaListRequest { - return new GetActorMutesActorViaListRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorMutesActorViaListRequest { - return new GetActorMutesActorViaListRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorMutesActorViaListRequest | PlainMessage | undefined, b: GetActorMutesActorViaListRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorMutesActorViaListRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorMutesActorViaListResponse - */ -export class GetActorMutesActorViaListResponse extends Message { - /** - * @generated from field: string list_uri = 1; - */ - listUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorMutesActorViaListResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorMutesActorViaListResponse { - return new GetActorMutesActorViaListResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorMutesActorViaListResponse { - return new GetActorMutesActorViaListResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorMutesActorViaListResponse { - return new GetActorMutesActorViaListResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorMutesActorViaListResponse | PlainMessage | undefined, b: GetActorMutesActorViaListResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorMutesActorViaListResponse, a, b); - } -} - -/** - * - return boolean if actor A has subscribed to mutelist B - * - list view hydration - * - * @generated from message bsky.GetMutelistSubscriptionRequest - */ -export class GetMutelistSubscriptionRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string list_uri = 2; - */ - listUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetMutelistSubscriptionRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMutelistSubscriptionRequest { - return new GetMutelistSubscriptionRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMutelistSubscriptionRequest { - return new GetMutelistSubscriptionRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMutelistSubscriptionRequest { - return new GetMutelistSubscriptionRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetMutelistSubscriptionRequest | PlainMessage | undefined, b: GetMutelistSubscriptionRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMutelistSubscriptionRequest, a, b); - } -} - -/** - * @generated from message bsky.GetMutelistSubscriptionResponse - */ -export class GetMutelistSubscriptionResponse extends Message { - /** - * @generated from field: bool subscribed = 1; - */ - subscribed = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetMutelistSubscriptionResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subscribed", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMutelistSubscriptionResponse { - return new GetMutelistSubscriptionResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMutelistSubscriptionResponse { - return new GetMutelistSubscriptionResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMutelistSubscriptionResponse { - return new GetMutelistSubscriptionResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetMutelistSubscriptionResponse | PlainMessage | undefined, b: GetMutelistSubscriptionResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMutelistSubscriptionResponse, a, b); - } -} - -/** - * - return list of list uris of mutelists that A subscribes to - * - `getListMutes` - * - * @generated from message bsky.GetMutelistSubscriptionsRequest - */ -export class GetMutelistSubscriptionsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetMutelistSubscriptionsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMutelistSubscriptionsRequest { - return new GetMutelistSubscriptionsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMutelistSubscriptionsRequest { - return new GetMutelistSubscriptionsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMutelistSubscriptionsRequest { - return new GetMutelistSubscriptionsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetMutelistSubscriptionsRequest | PlainMessage | undefined, b: GetMutelistSubscriptionsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMutelistSubscriptionsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetMutelistSubscriptionsResponse - */ -export class GetMutelistSubscriptionsResponse extends Message { - /** - * @generated from field: repeated string list_uris = 1; - */ - listUris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetMutelistSubscriptionsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMutelistSubscriptionsResponse { - return new GetMutelistSubscriptionsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMutelistSubscriptionsResponse { - return new GetMutelistSubscriptionsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMutelistSubscriptionsResponse { - return new GetMutelistSubscriptionsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetMutelistSubscriptionsResponse | PlainMessage | undefined, b: GetMutelistSubscriptionsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMutelistSubscriptionsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetThreadMutesOnSubjectsRequest - */ -export class GetThreadMutesOnSubjectsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string thread_roots = 2; - */ - threadRoots: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetThreadMutesOnSubjectsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "thread_roots", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetThreadMutesOnSubjectsRequest { - return new GetThreadMutesOnSubjectsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetThreadMutesOnSubjectsRequest { - return new GetThreadMutesOnSubjectsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetThreadMutesOnSubjectsRequest { - return new GetThreadMutesOnSubjectsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetThreadMutesOnSubjectsRequest | PlainMessage | undefined, b: GetThreadMutesOnSubjectsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetThreadMutesOnSubjectsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetThreadMutesOnSubjectsResponse - */ -export class GetThreadMutesOnSubjectsResponse extends Message { - /** - * @generated from field: repeated bool muted = 1; - */ - muted: boolean[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetThreadMutesOnSubjectsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "muted", kind: "scalar", T: 8 /* ScalarType.BOOL */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetThreadMutesOnSubjectsResponse { - return new GetThreadMutesOnSubjectsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetThreadMutesOnSubjectsResponse { - return new GetThreadMutesOnSubjectsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetThreadMutesOnSubjectsResponse { - return new GetThreadMutesOnSubjectsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetThreadMutesOnSubjectsResponse | PlainMessage | undefined, b: GetThreadMutesOnSubjectsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetThreadMutesOnSubjectsResponse, a, b); - } -} - -/** - * - Return block uri if there is a block between users A & B (bidirectional) - * - hydrating (& actioning) block state on profiles - * - handling 3rd party blocks - * - * @generated from message bsky.GetBidirectionalBlockRequest - */ -export class GetBidirectionalBlockRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string target_did = 2; - */ - targetDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBidirectionalBlockRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBidirectionalBlockRequest { - return new GetBidirectionalBlockRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBidirectionalBlockRequest { - return new GetBidirectionalBlockRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBidirectionalBlockRequest { - return new GetBidirectionalBlockRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBidirectionalBlockRequest | PlainMessage | undefined, b: GetBidirectionalBlockRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBidirectionalBlockRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBidirectionalBlockResponse - */ -export class GetBidirectionalBlockResponse extends Message { - /** - * @generated from field: string block_uri = 1; - */ - blockUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBidirectionalBlockResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "block_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBidirectionalBlockResponse { - return new GetBidirectionalBlockResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBidirectionalBlockResponse { - return new GetBidirectionalBlockResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBidirectionalBlockResponse { - return new GetBidirectionalBlockResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBidirectionalBlockResponse | PlainMessage | undefined, b: GetBidirectionalBlockResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBidirectionalBlockResponse, a, b); - } -} - -/** - * - Return list of block uris and user dids of users who A blocks - * - `getBlocks` - * - * @generated from message bsky.GetBlocksRequest - */ -export class GetBlocksRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlocksRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlocksRequest { - return new GetBlocksRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlocksRequest { - return new GetBlocksRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlocksRequest { - return new GetBlocksRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBlocksRequest | PlainMessage | undefined, b: GetBlocksRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlocksRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBlocksResponse - */ -export class GetBlocksResponse extends Message { - /** - * @generated from field: repeated string block_uris = 1; - */ - blockUris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlocksResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "block_uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlocksResponse { - return new GetBlocksResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlocksResponse { - return new GetBlocksResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlocksResponse { - return new GetBlocksResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBlocksResponse | PlainMessage | undefined, b: GetBlocksResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlocksResponse, a, b); - } -} - -/** - * - Return list uri of ***any*** list through which users A & B have a block (bidirectional) - * - hydrating (& actioning) block state on profiles - * - handling 3rd party blocks - * - * @generated from message bsky.GetBidirectionalBlockViaListRequest - */ -export class GetBidirectionalBlockViaListRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string target_did = 2; - */ - targetDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBidirectionalBlockViaListRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBidirectionalBlockViaListRequest { - return new GetBidirectionalBlockViaListRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBidirectionalBlockViaListRequest { - return new GetBidirectionalBlockViaListRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBidirectionalBlockViaListRequest { - return new GetBidirectionalBlockViaListRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBidirectionalBlockViaListRequest | PlainMessage | undefined, b: GetBidirectionalBlockViaListRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBidirectionalBlockViaListRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBidirectionalBlockViaListResponse - */ -export class GetBidirectionalBlockViaListResponse extends Message { - /** - * @generated from field: string list_uri = 1; - */ - listUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBidirectionalBlockViaListResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBidirectionalBlockViaListResponse { - return new GetBidirectionalBlockViaListResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBidirectionalBlockViaListResponse { - return new GetBidirectionalBlockViaListResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBidirectionalBlockViaListResponse { - return new GetBidirectionalBlockViaListResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBidirectionalBlockViaListResponse | PlainMessage | undefined, b: GetBidirectionalBlockViaListResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBidirectionalBlockViaListResponse, a, b); - } -} - -/** - * - return boolean if user A has subscribed to blocklist B - * - list view hydration - * - * @generated from message bsky.GetBlocklistSubscriptionRequest - */ -export class GetBlocklistSubscriptionRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string list_uri = 2; - */ - listUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlocklistSubscriptionRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlocklistSubscriptionRequest { - return new GetBlocklistSubscriptionRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlocklistSubscriptionRequest { - return new GetBlocklistSubscriptionRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlocklistSubscriptionRequest { - return new GetBlocklistSubscriptionRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBlocklistSubscriptionRequest | PlainMessage | undefined, b: GetBlocklistSubscriptionRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlocklistSubscriptionRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBlocklistSubscriptionResponse - */ -export class GetBlocklistSubscriptionResponse extends Message { - /** - * @generated from field: string listblock_uri = 1; - */ - listblockUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlocklistSubscriptionResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "listblock_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlocklistSubscriptionResponse { - return new GetBlocklistSubscriptionResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlocklistSubscriptionResponse { - return new GetBlocklistSubscriptionResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlocklistSubscriptionResponse { - return new GetBlocklistSubscriptionResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBlocklistSubscriptionResponse | PlainMessage | undefined, b: GetBlocklistSubscriptionResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlocklistSubscriptionResponse, a, b); - } -} - -/** - * - return list of list uris of Blockslists that A subscribes to - * - `getListBlocks` - * - * @generated from message bsky.GetBlocklistSubscriptionsRequest - */ -export class GetBlocklistSubscriptionsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlocklistSubscriptionsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlocklistSubscriptionsRequest { - return new GetBlocklistSubscriptionsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlocklistSubscriptionsRequest { - return new GetBlocklistSubscriptionsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlocklistSubscriptionsRequest { - return new GetBlocklistSubscriptionsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBlocklistSubscriptionsRequest | PlainMessage | undefined, b: GetBlocklistSubscriptionsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlocklistSubscriptionsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBlocklistSubscriptionsResponse - */ -export class GetBlocklistSubscriptionsResponse extends Message { - /** - * @generated from field: repeated string list_uris = 1; - */ - listUris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlocklistSubscriptionsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlocklistSubscriptionsResponse { - return new GetBlocklistSubscriptionsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlocklistSubscriptionsResponse { - return new GetBlocklistSubscriptionsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlocklistSubscriptionsResponse { - return new GetBlocklistSubscriptionsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBlocklistSubscriptionsResponse | PlainMessage | undefined, b: GetBlocklistSubscriptionsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlocklistSubscriptionsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetNotificationPreferencesRequest - */ -export class GetNotificationPreferencesRequest extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationPreferencesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationPreferencesRequest { - return new GetNotificationPreferencesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationPreferencesRequest { - return new GetNotificationPreferencesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationPreferencesRequest { - return new GetNotificationPreferencesRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationPreferencesRequest | PlainMessage | undefined, b: GetNotificationPreferencesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationPreferencesRequest, a, b); - } -} - -/** - * @generated from message bsky.NotificationChannelList - */ -export class NotificationChannelList extends Message { - /** - * @generated from field: bool enabled = 1; - */ - enabled = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.NotificationChannelList"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): NotificationChannelList { - return new NotificationChannelList().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): NotificationChannelList { - return new NotificationChannelList().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): NotificationChannelList { - return new NotificationChannelList().fromJsonString(jsonString, options); - } - - static equals(a: NotificationChannelList | PlainMessage | undefined, b: NotificationChannelList | PlainMessage | undefined): boolean { - return proto3.util.equals(NotificationChannelList, a, b); - } -} - -/** - * @generated from message bsky.NotificationChannelPush - */ -export class NotificationChannelPush extends Message { - /** - * @generated from field: bool enabled = 1; - */ - enabled = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.NotificationChannelPush"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): NotificationChannelPush { - return new NotificationChannelPush().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): NotificationChannelPush { - return new NotificationChannelPush().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): NotificationChannelPush { - return new NotificationChannelPush().fromJsonString(jsonString, options); - } - - static equals(a: NotificationChannelPush | PlainMessage | undefined, b: NotificationChannelPush | PlainMessage | undefined): boolean { - return proto3.util.equals(NotificationChannelPush, a, b); - } -} - -/** - * @generated from message bsky.FilterableNotificationPreference - */ -export class FilterableNotificationPreference extends Message { - /** - * @generated from field: bsky.NotificationInclude include = 1; - */ - include = NotificationInclude.UNSPECIFIED; - - /** - * @generated from field: bsky.NotificationChannelList list = 2; - */ - list?: NotificationChannelList; - - /** - * @generated from field: bsky.NotificationChannelPush push = 3; - */ - push?: NotificationChannelPush; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.FilterableNotificationPreference"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "include", kind: "enum", T: proto3.getEnumType(NotificationInclude) }, - { no: 2, name: "list", kind: "message", T: NotificationChannelList }, - { no: 3, name: "push", kind: "message", T: NotificationChannelPush }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): FilterableNotificationPreference { - return new FilterableNotificationPreference().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): FilterableNotificationPreference { - return new FilterableNotificationPreference().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): FilterableNotificationPreference { - return new FilterableNotificationPreference().fromJsonString(jsonString, options); - } - - static equals(a: FilterableNotificationPreference | PlainMessage | undefined, b: FilterableNotificationPreference | PlainMessage | undefined): boolean { - return proto3.util.equals(FilterableNotificationPreference, a, b); - } -} - -/** - * @generated from message bsky.NotificationPreference - */ -export class NotificationPreference extends Message { - /** - * @generated from field: bsky.NotificationChannelList list = 1; - */ - list?: NotificationChannelList; - - /** - * @generated from field: bsky.NotificationChannelPush push = 2; - */ - push?: NotificationChannelPush; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.NotificationPreference"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list", kind: "message", T: NotificationChannelList }, - { no: 2, name: "push", kind: "message", T: NotificationChannelPush }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): NotificationPreference { - return new NotificationPreference().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): NotificationPreference { - return new NotificationPreference().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): NotificationPreference { - return new NotificationPreference().fromJsonString(jsonString, options); - } - - static equals(a: NotificationPreference | PlainMessage | undefined, b: NotificationPreference | PlainMessage | undefined): boolean { - return proto3.util.equals(NotificationPreference, a, b); - } -} - -/** - * @generated from message bsky.ChatNotificationPreference - */ -export class ChatNotificationPreference extends Message { - /** - * @generated from field: bsky.ChatNotificationInclude include = 1; - */ - include = ChatNotificationInclude.UNSPECIFIED; - - /** - * @generated from field: bsky.NotificationChannelPush push = 2; - */ - push?: NotificationChannelPush; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ChatNotificationPreference"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "include", kind: "enum", T: proto3.getEnumType(ChatNotificationInclude) }, - { no: 2, name: "push", kind: "message", T: NotificationChannelPush }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ChatNotificationPreference { - return new ChatNotificationPreference().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ChatNotificationPreference { - return new ChatNotificationPreference().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ChatNotificationPreference { - return new ChatNotificationPreference().fromJsonString(jsonString, options); - } - - static equals(a: ChatNotificationPreference | PlainMessage | undefined, b: ChatNotificationPreference | PlainMessage | undefined): boolean { - return proto3.util.equals(ChatNotificationPreference, a, b); - } -} - -/** - * @generated from message bsky.NotificationPreferences - */ -export class NotificationPreferences extends Message { - /** - * @generated from field: bytes entry = 1; - */ - entry = new Uint8Array(0); - - /** - * @generated from field: bsky.ChatNotificationPreference chat = 2; - */ - chat?: ChatNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference follow = 3; - */ - follow?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference like = 4; - */ - like?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference like_via_repost = 5; - */ - likeViaRepost?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference mention = 6; - */ - mention?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference quote = 7; - */ - quote?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference reply = 8; - */ - reply?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference repost = 9; - */ - repost?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.FilterableNotificationPreference repost_via_repost = 10; - */ - repostViaRepost?: FilterableNotificationPreference; - - /** - * @generated from field: bsky.NotificationPreference starterpack_joined = 11; - */ - starterpackJoined?: NotificationPreference; - - /** - * @generated from field: bsky.NotificationPreference subscribed_post = 12; - */ - subscribedPost?: NotificationPreference; - - /** - * @generated from field: bsky.NotificationPreference unverified = 13; - */ - unverified?: NotificationPreference; - - /** - * @generated from field: bsky.NotificationPreference verified = 14; - */ - verified?: NotificationPreference; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.NotificationPreferences"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "entry", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 2, name: "chat", kind: "message", T: ChatNotificationPreference }, - { no: 3, name: "follow", kind: "message", T: FilterableNotificationPreference }, - { no: 4, name: "like", kind: "message", T: FilterableNotificationPreference }, - { no: 5, name: "like_via_repost", kind: "message", T: FilterableNotificationPreference }, - { no: 6, name: "mention", kind: "message", T: FilterableNotificationPreference }, - { no: 7, name: "quote", kind: "message", T: FilterableNotificationPreference }, - { no: 8, name: "reply", kind: "message", T: FilterableNotificationPreference }, - { no: 9, name: "repost", kind: "message", T: FilterableNotificationPreference }, - { no: 10, name: "repost_via_repost", kind: "message", T: FilterableNotificationPreference }, - { no: 11, name: "starterpack_joined", kind: "message", T: NotificationPreference }, - { no: 12, name: "subscribed_post", kind: "message", T: NotificationPreference }, - { no: 13, name: "unverified", kind: "message", T: NotificationPreference }, - { no: 14, name: "verified", kind: "message", T: NotificationPreference }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): NotificationPreferences { - return new NotificationPreferences().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): NotificationPreferences { - return new NotificationPreferences().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): NotificationPreferences { - return new NotificationPreferences().fromJsonString(jsonString, options); - } - - static equals(a: NotificationPreferences | PlainMessage | undefined, b: NotificationPreferences | PlainMessage | undefined): boolean { - return proto3.util.equals(NotificationPreferences, a, b); - } -} - -/** - * @generated from message bsky.GetNotificationPreferencesResponse - */ -export class GetNotificationPreferencesResponse extends Message { - /** - * @generated from field: repeated bsky.NotificationPreferences preferences = 1; - */ - preferences: NotificationPreferences[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationPreferencesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "preferences", kind: "message", T: NotificationPreferences, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationPreferencesResponse { - return new GetNotificationPreferencesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationPreferencesResponse { - return new GetNotificationPreferencesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationPreferencesResponse { - return new GetNotificationPreferencesResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationPreferencesResponse | PlainMessage | undefined, b: GetNotificationPreferencesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationPreferencesResponse, a, b); - } -} - -/** - * - list recent notifications for a user - * - notifications should include a uri for the record that caused the notif & a “reason” for the notification (reply, like, quotepost, etc) - * - this should include both read & unread notifs - * - * @generated from message bsky.GetNotificationsRequest - */ -export class GetNotificationsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - /** - * @generated from field: bool priority = 4; - */ - priority = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationsRequest { - return new GetNotificationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationsRequest { - return new GetNotificationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationsRequest { - return new GetNotificationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationsRequest | PlainMessage | undefined, b: GetNotificationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationsRequest, a, b); - } -} - -/** - * @generated from message bsky.Notification - */ -export class Notification extends Message { - /** - * @generated from field: string recipient_did = 1; - */ - recipientDid = ""; - - /** - * @generated from field: string uri = 2; - */ - uri = ""; - - /** - * @generated from field: string reason = 3; - */ - reason = ""; - - /** - * @generated from field: string reason_subject = 4; - */ - reasonSubject = ""; - - /** - * @generated from field: google.protobuf.Timestamp timestamp = 5; - */ - timestamp?: Timestamp; - - /** - * @generated from field: bool priority = 6; - */ - priority = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.Notification"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "recipient_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "reason", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "reason_subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "timestamp", kind: "message", T: Timestamp }, - { no: 6, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Notification { - return new Notification().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Notification { - return new Notification().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Notification { - return new Notification().fromJsonString(jsonString, options); - } - - static equals(a: Notification | PlainMessage | undefined, b: Notification | PlainMessage | undefined): boolean { - return proto3.util.equals(Notification, a, b); - } -} - -/** - * @generated from message bsky.GetNotificationsResponse - */ -export class GetNotificationsResponse extends Message { - /** - * @generated from field: repeated bsky.Notification notifications = 1; - */ - notifications: Notification[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "notifications", kind: "message", T: Notification, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationsResponse { - return new GetNotificationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationsResponse { - return new GetNotificationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationsResponse { - return new GetNotificationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationsResponse | PlainMessage | undefined, b: GetNotificationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationsResponse, a, b); - } -} - -/** - * - update a user’s “last seen time” - * - `updateSeen` - * - * @generated from message bsky.UpdateNotificationSeenRequest - */ -export class UpdateNotificationSeenRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: google.protobuf.Timestamp timestamp = 2; - */ - timestamp?: Timestamp; - - /** - * @generated from field: bool priority = 3; - */ - priority = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UpdateNotificationSeenRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "timestamp", kind: "message", T: Timestamp }, - { no: 3, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UpdateNotificationSeenRequest { - return new UpdateNotificationSeenRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UpdateNotificationSeenRequest { - return new UpdateNotificationSeenRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UpdateNotificationSeenRequest { - return new UpdateNotificationSeenRequest().fromJsonString(jsonString, options); - } - - static equals(a: UpdateNotificationSeenRequest | PlainMessage | undefined, b: UpdateNotificationSeenRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(UpdateNotificationSeenRequest, a, b); - } -} - -/** - * @generated from message bsky.UpdateNotificationSeenResponse - */ -export class UpdateNotificationSeenResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UpdateNotificationSeenResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UpdateNotificationSeenResponse { - return new UpdateNotificationSeenResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UpdateNotificationSeenResponse { - return new UpdateNotificationSeenResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UpdateNotificationSeenResponse { - return new UpdateNotificationSeenResponse().fromJsonString(jsonString, options); - } - - static equals(a: UpdateNotificationSeenResponse | PlainMessage | undefined, b: UpdateNotificationSeenResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(UpdateNotificationSeenResponse, a, b); - } -} - -/** - * - get a user’s “last seen time” - * - hydrating read state onto notifications - * - * @generated from message bsky.GetNotificationSeenRequest - */ -export class GetNotificationSeenRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: bool priority = 2; - */ - priority = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationSeenRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationSeenRequest { - return new GetNotificationSeenRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationSeenRequest { - return new GetNotificationSeenRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationSeenRequest { - return new GetNotificationSeenRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationSeenRequest | PlainMessage | undefined, b: GetNotificationSeenRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationSeenRequest, a, b); - } -} - -/** - * @generated from message bsky.GetNotificationSeenResponse - */ -export class GetNotificationSeenResponse extends Message { - /** - * @generated from field: google.protobuf.Timestamp timestamp = 1; - */ - timestamp?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetNotificationSeenResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "timestamp", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetNotificationSeenResponse { - return new GetNotificationSeenResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetNotificationSeenResponse { - return new GetNotificationSeenResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetNotificationSeenResponse { - return new GetNotificationSeenResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetNotificationSeenResponse | PlainMessage | undefined, b: GetNotificationSeenResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetNotificationSeenResponse, a, b); - } -} - -/** - * - get a count of all unread notifications (notifications after `updateSeen`) - * - `getUnreadCount` - * - * @generated from message bsky.GetUnreadNotificationCountRequest - */ -export class GetUnreadNotificationCountRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: bool priority = 2; - */ - priority = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetUnreadNotificationCountRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetUnreadNotificationCountRequest { - return new GetUnreadNotificationCountRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetUnreadNotificationCountRequest { - return new GetUnreadNotificationCountRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetUnreadNotificationCountRequest { - return new GetUnreadNotificationCountRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetUnreadNotificationCountRequest | PlainMessage | undefined, b: GetUnreadNotificationCountRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetUnreadNotificationCountRequest, a, b); - } -} - -/** - * @generated from message bsky.GetUnreadNotificationCountResponse - */ -export class GetUnreadNotificationCountResponse extends Message { - /** - * @generated from field: int32 count = 1; - */ - count = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetUnreadNotificationCountResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetUnreadNotificationCountResponse { - return new GetUnreadNotificationCountResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetUnreadNotificationCountResponse { - return new GetUnreadNotificationCountResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetUnreadNotificationCountResponse { - return new GetUnreadNotificationCountResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetUnreadNotificationCountResponse | PlainMessage | undefined, b: GetUnreadNotificationCountResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetUnreadNotificationCountResponse, a, b); - } -} - -/** - * @generated from message bsky.GetActivitySubscriptionDidsRequest - */ -export class GetActivitySubscriptionDidsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActivitySubscriptionDidsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActivitySubscriptionDidsRequest { - return new GetActivitySubscriptionDidsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActivitySubscriptionDidsRequest { - return new GetActivitySubscriptionDidsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActivitySubscriptionDidsRequest { - return new GetActivitySubscriptionDidsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActivitySubscriptionDidsRequest | PlainMessage | undefined, b: GetActivitySubscriptionDidsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActivitySubscriptionDidsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActivitySubscriptionDidsResponse - */ -export class GetActivitySubscriptionDidsResponse extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActivitySubscriptionDidsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActivitySubscriptionDidsResponse { - return new GetActivitySubscriptionDidsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActivitySubscriptionDidsResponse { - return new GetActivitySubscriptionDidsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActivitySubscriptionDidsResponse { - return new GetActivitySubscriptionDidsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActivitySubscriptionDidsResponse | PlainMessage | undefined, b: GetActivitySubscriptionDidsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActivitySubscriptionDidsResponse, a, b); - } -} - -/** - * @generated from message bsky.PostActivitySubscription - */ -export class PostActivitySubscription extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.PostActivitySubscription"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PostActivitySubscription { - return new PostActivitySubscription().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PostActivitySubscription { - return new PostActivitySubscription().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PostActivitySubscription { - return new PostActivitySubscription().fromJsonString(jsonString, options); - } - - static equals(a: PostActivitySubscription | PlainMessage | undefined, b: PostActivitySubscription | PlainMessage | undefined): boolean { - return proto3.util.equals(PostActivitySubscription, a, b); - } -} - -/** - * @generated from message bsky.ReplyActivitySubscription - */ -export class ReplyActivitySubscription extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ReplyActivitySubscription"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ReplyActivitySubscription { - return new ReplyActivitySubscription().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ReplyActivitySubscription { - return new ReplyActivitySubscription().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ReplyActivitySubscription { - return new ReplyActivitySubscription().fromJsonString(jsonString, options); - } - - static equals(a: ReplyActivitySubscription | PlainMessage | undefined, b: ReplyActivitySubscription | PlainMessage | undefined): boolean { - return proto3.util.equals(ReplyActivitySubscription, a, b); - } -} - -/** - * @generated from message bsky.ActivitySubscription - */ -export class ActivitySubscription extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 2; - */ - namespace = ""; - - /** - * @generated from field: string key = 3; - */ - key = ""; - - /** - * @generated from field: optional bsky.PostActivitySubscription post = 4; - */ - post?: PostActivitySubscription; - - /** - * @generated from field: optional bsky.ReplyActivitySubscription reply = 5; - */ - reply?: ReplyActivitySubscription; - - /** - * @generated from field: string subject_did = 6; - */ - subjectDid = ""; - - /** - * @generated from field: google.protobuf.Timestamp indexed_at = 7; - */ - indexedAt?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ActivitySubscription"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "post", kind: "message", T: PostActivitySubscription, opt: true }, - { no: 5, name: "reply", kind: "message", T: ReplyActivitySubscription, opt: true }, - { no: 6, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 7, name: "indexed_at", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ActivitySubscription { - return new ActivitySubscription().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ActivitySubscription { - return new ActivitySubscription().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ActivitySubscription { - return new ActivitySubscription().fromJsonString(jsonString, options); - } - - static equals(a: ActivitySubscription | PlainMessage | undefined, b: ActivitySubscription | PlainMessage | undefined): boolean { - return proto3.util.equals(ActivitySubscription, a, b); - } -} - -/** - * @generated from message bsky.GetActivitySubscriptionsByActorAndSubjectsRequest - */ -export class GetActivitySubscriptionsByActorAndSubjectsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string subject_dids = 2; - */ - subjectDids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActivitySubscriptionsByActorAndSubjectsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActivitySubscriptionsByActorAndSubjectsRequest { - return new GetActivitySubscriptionsByActorAndSubjectsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActivitySubscriptionsByActorAndSubjectsRequest { - return new GetActivitySubscriptionsByActorAndSubjectsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActivitySubscriptionsByActorAndSubjectsRequest { - return new GetActivitySubscriptionsByActorAndSubjectsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActivitySubscriptionsByActorAndSubjectsRequest | PlainMessage | undefined, b: GetActivitySubscriptionsByActorAndSubjectsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActivitySubscriptionsByActorAndSubjectsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActivitySubscriptionsByActorAndSubjectsResponse - */ -export class GetActivitySubscriptionsByActorAndSubjectsResponse extends Message { - /** - * @generated from field: repeated bsky.ActivitySubscription subscriptions = 1; - */ - subscriptions: ActivitySubscription[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActivitySubscriptionsByActorAndSubjectsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subscriptions", kind: "message", T: ActivitySubscription, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActivitySubscriptionsByActorAndSubjectsResponse { - return new GetActivitySubscriptionsByActorAndSubjectsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActivitySubscriptionsByActorAndSubjectsResponse { - return new GetActivitySubscriptionsByActorAndSubjectsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActivitySubscriptionsByActorAndSubjectsResponse { - return new GetActivitySubscriptionsByActorAndSubjectsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActivitySubscriptionsByActorAndSubjectsResponse | PlainMessage | undefined, b: GetActivitySubscriptionsByActorAndSubjectsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActivitySubscriptionsByActorAndSubjectsResponse, a, b); - } -} - -/** - * - Return uris of feed generator records created by user A - * - `getActorFeeds` - * - * @generated from message bsky.GetActorFeedsRequest - */ -export class GetActorFeedsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorFeedsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorFeedsRequest { - return new GetActorFeedsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorFeedsRequest { - return new GetActorFeedsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorFeedsRequest { - return new GetActorFeedsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorFeedsRequest | PlainMessage | undefined, b: GetActorFeedsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorFeedsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorFeedsResponse - */ -export class GetActorFeedsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorFeedsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorFeedsResponse { - return new GetActorFeedsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorFeedsResponse { - return new GetActorFeedsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorFeedsResponse { - return new GetActorFeedsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorFeedsResponse | PlainMessage | undefined, b: GetActorFeedsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorFeedsResponse, a, b); - } -} - -/** - * - Returns a list of suggested feed generator uris for an actor, paginated - * - `getSuggestedFeeds` - * - This is currently just hardcoded in the Appview DB - * - * @generated from message bsky.GetSuggestedFeedsRequest - */ -export class GetSuggestedFeedsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSuggestedFeedsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSuggestedFeedsRequest { - return new GetSuggestedFeedsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSuggestedFeedsRequest { - return new GetSuggestedFeedsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSuggestedFeedsRequest { - return new GetSuggestedFeedsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetSuggestedFeedsRequest | PlainMessage | undefined, b: GetSuggestedFeedsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSuggestedFeedsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetSuggestedFeedsResponse - */ -export class GetSuggestedFeedsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSuggestedFeedsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSuggestedFeedsResponse { - return new GetSuggestedFeedsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSuggestedFeedsResponse { - return new GetSuggestedFeedsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSuggestedFeedsResponse { - return new GetSuggestedFeedsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetSuggestedFeedsResponse | PlainMessage | undefined, b: GetSuggestedFeedsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSuggestedFeedsResponse, a, b); - } -} - -/** - * @generated from message bsky.SearchFeedGeneratorsRequest - */ -export class SearchFeedGeneratorsRequest extends Message { - /** - * @generated from field: string query = 1; - */ - query = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchFeedGeneratorsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "query", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchFeedGeneratorsRequest { - return new SearchFeedGeneratorsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchFeedGeneratorsRequest { - return new SearchFeedGeneratorsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchFeedGeneratorsRequest { - return new SearchFeedGeneratorsRequest().fromJsonString(jsonString, options); - } - - static equals(a: SearchFeedGeneratorsRequest | PlainMessage | undefined, b: SearchFeedGeneratorsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchFeedGeneratorsRequest, a, b); - } -} - -/** - * @generated from message bsky.SearchFeedGeneratorsResponse - */ -export class SearchFeedGeneratorsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchFeedGeneratorsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchFeedGeneratorsResponse { - return new SearchFeedGeneratorsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchFeedGeneratorsResponse { - return new SearchFeedGeneratorsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchFeedGeneratorsResponse { - return new SearchFeedGeneratorsResponse().fromJsonString(jsonString, options); - } - - static equals(a: SearchFeedGeneratorsResponse | PlainMessage | undefined, b: SearchFeedGeneratorsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchFeedGeneratorsResponse, a, b); - } -} - -/** - * - Returns feed generator validity and online status with uris A, B, C… - * - Not currently being used, but could be worhthwhile. - * - * @generated from message bsky.GetFeedGeneratorStatusRequest - */ -export class GetFeedGeneratorStatusRequest extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFeedGeneratorStatusRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFeedGeneratorStatusRequest { - return new GetFeedGeneratorStatusRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFeedGeneratorStatusRequest { - return new GetFeedGeneratorStatusRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFeedGeneratorStatusRequest { - return new GetFeedGeneratorStatusRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFeedGeneratorStatusRequest | PlainMessage | undefined, b: GetFeedGeneratorStatusRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFeedGeneratorStatusRequest, a, b); - } -} - -/** - * @generated from message bsky.GetFeedGeneratorStatusResponse - */ -export class GetFeedGeneratorStatusResponse extends Message { - /** - * @generated from field: repeated string status = 1; - */ - status: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFeedGeneratorStatusResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "status", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFeedGeneratorStatusResponse { - return new GetFeedGeneratorStatusResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFeedGeneratorStatusResponse { - return new GetFeedGeneratorStatusResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFeedGeneratorStatusResponse { - return new GetFeedGeneratorStatusResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFeedGeneratorStatusResponse | PlainMessage | undefined, b: GetFeedGeneratorStatusResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFeedGeneratorStatusResponse, a, b); - } -} - -/** - * - Returns recent posts authored by a given DID, paginated - * - `getAuthorFeed` - * - Optionally: filter by if a post is/isn’t a reply and if a post has a media object in it - * - * @generated from message bsky.GetAuthorFeedRequest - */ -export class GetAuthorFeedRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - /** - * @generated from field: bsky.FeedType feed_type = 4; - */ - feedType = FeedType.UNSPECIFIED; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetAuthorFeedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "feed_type", kind: "enum", T: proto3.getEnumType(FeedType) }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetAuthorFeedRequest { - return new GetAuthorFeedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetAuthorFeedRequest { - return new GetAuthorFeedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetAuthorFeedRequest { - return new GetAuthorFeedRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetAuthorFeedRequest | PlainMessage | undefined, b: GetAuthorFeedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetAuthorFeedRequest, a, b); - } -} - -/** - * @generated from message bsky.AuthorFeedItem - */ -export class AuthorFeedItem extends Message { - /** - * @generated from field: string uri = 1; - */ - uri = ""; - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - /** - * @generated from field: string repost = 3; - */ - repost = ""; - - /** - * @generated from field: string repost_cid = 4; - */ - repostCid = ""; - - /** - * @generated from field: bool posts_and_author_threads = 5; - */ - postsAndAuthorThreads = false; - - /** - * @generated from field: bool posts_no_replies = 6; - */ - postsNoReplies = false; - - /** - * @generated from field: bool posts_with_media = 7; - */ - postsWithMedia = false; - - /** - * @generated from field: bool is_reply = 8; - */ - isReply = false; - - /** - * @generated from field: bool is_repost = 9; - */ - isRepost = false; - - /** - * @generated from field: bool is_quote_post = 10; - */ - isQuotePost = false; - - /** - * @generated from field: bool posts_with_video = 11; - */ - postsWithVideo = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.AuthorFeedItem"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "repost", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "repost_cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "posts_and_author_threads", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "posts_no_replies", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 7, name: "posts_with_media", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 8, name: "is_reply", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 9, name: "is_repost", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 10, name: "is_quote_post", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 11, name: "posts_with_video", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AuthorFeedItem { - return new AuthorFeedItem().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AuthorFeedItem { - return new AuthorFeedItem().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AuthorFeedItem { - return new AuthorFeedItem().fromJsonString(jsonString, options); - } - - static equals(a: AuthorFeedItem | PlainMessage | undefined, b: AuthorFeedItem | PlainMessage | undefined): boolean { - return proto3.util.equals(AuthorFeedItem, a, b); - } -} - -/** - * @generated from message bsky.GetAuthorFeedResponse - */ -export class GetAuthorFeedResponse extends Message { - /** - * @generated from field: repeated bsky.AuthorFeedItem items = 1; - */ - items: AuthorFeedItem[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetAuthorFeedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "items", kind: "message", T: AuthorFeedItem, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetAuthorFeedResponse { - return new GetAuthorFeedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetAuthorFeedResponse { - return new GetAuthorFeedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetAuthorFeedResponse { - return new GetAuthorFeedResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetAuthorFeedResponse | PlainMessage | undefined, b: GetAuthorFeedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetAuthorFeedResponse, a, b); - } -} - -/** - * - Returns recent posts authored by users followed by a given DID, paginated - * - `getTimeline` - * - * @generated from message bsky.GetTimelineRequest - */ -export class GetTimelineRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - /** - * @generated from field: bool exclude_replies = 4; - */ - excludeReplies = false; - - /** - * @generated from field: bool exclude_reposts = 5; - */ - excludeReposts = false; - - /** - * @generated from field: bool exclude_quotes = 6; - */ - excludeQuotes = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetTimelineRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "exclude_replies", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 5, name: "exclude_reposts", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "exclude_quotes", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetTimelineRequest { - return new GetTimelineRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetTimelineRequest { - return new GetTimelineRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetTimelineRequest { - return new GetTimelineRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetTimelineRequest | PlainMessage | undefined, b: GetTimelineRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetTimelineRequest, a, b); - } -} - -/** - * @generated from message bsky.GetTimelineResponse - */ -export class GetTimelineResponse extends Message { - /** - * @generated from field: repeated bsky.TimelineFeedItem items = 1; - */ - items: TimelineFeedItem[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetTimelineResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "items", kind: "message", T: TimelineFeedItem, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetTimelineResponse { - return new GetTimelineResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetTimelineResponse { - return new GetTimelineResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetTimelineResponse { - return new GetTimelineResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetTimelineResponse | PlainMessage | undefined, b: GetTimelineResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetTimelineResponse, a, b); - } -} - -/** - * @generated from message bsky.TimelineFeedItem - */ -export class TimelineFeedItem extends Message { - /** - * @generated from field: string uri = 1; - */ - uri = ""; - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - /** - * @generated from field: string repost = 3; - */ - repost = ""; - - /** - * @generated from field: string repost_cid = 4; - */ - repostCid = ""; - - /** - * @generated from field: bool is_reply = 5; - */ - isReply = false; - - /** - * @generated from field: bool is_repost = 6; - */ - isRepost = false; - - /** - * @generated from field: bool is_quote_post = 7; - */ - isQuotePost = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TimelineFeedItem"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "repost", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "repost_cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "is_reply", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "is_repost", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 7, name: "is_quote_post", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TimelineFeedItem { - return new TimelineFeedItem().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TimelineFeedItem { - return new TimelineFeedItem().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TimelineFeedItem { - return new TimelineFeedItem().fromJsonString(jsonString, options); - } - - static equals(a: TimelineFeedItem | PlainMessage | undefined, b: TimelineFeedItem | PlainMessage | undefined): boolean { - return proto3.util.equals(TimelineFeedItem, a, b); - } -} - -/** - * - Return recent post uris from users in list A - * - `getListFeed` - * - (This is essentially the same as `getTimeline` but instead of follows of a did, it is list items of a list) - * - * @generated from message bsky.GetListFeedRequest - */ -export class GetListFeedRequest extends Message { - /** - * @generated from field: string list_uri = 1; - */ - listUri = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - /** - * @generated from field: bool exclude_replies = 4; - */ - excludeReplies = false; - - /** - * @generated from field: bool exclude_reposts = 5; - */ - excludeReposts = false; - - /** - * @generated from field: bool exclude_quotes = 6; - */ - excludeQuotes = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListFeedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "list_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "exclude_replies", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 5, name: "exclude_reposts", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 6, name: "exclude_quotes", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListFeedRequest { - return new GetListFeedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListFeedRequest { - return new GetListFeedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListFeedRequest { - return new GetListFeedRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetListFeedRequest | PlainMessage | undefined, b: GetListFeedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListFeedRequest, a, b); - } -} - -/** - * @generated from message bsky.GetListFeedResponse - */ -export class GetListFeedResponse extends Message { - /** - * @generated from field: repeated bsky.TimelineFeedItem items = 1; - */ - items: TimelineFeedItem[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetListFeedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "items", kind: "message", T: TimelineFeedItem, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetListFeedResponse { - return new GetListFeedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetListFeedResponse { - return new GetListFeedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetListFeedResponse { - return new GetListFeedResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetListFeedResponse | PlainMessage | undefined, b: GetListFeedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetListFeedResponse, a, b); - } -} - -/** - * Return posts uris of any replies N levels above or M levels below post A - * - * @generated from message bsky.GetThreadRequest - */ -export class GetThreadRequest extends Message { - /** - * @generated from field: string post_uri = 1; - */ - postUri = ""; - - /** - * @generated from field: int32 above = 2; - */ - above = 0; - - /** - * @generated from field: int32 below = 3; - */ - below = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetThreadRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "post_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "above", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "below", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetThreadRequest { - return new GetThreadRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetThreadRequest { - return new GetThreadRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetThreadRequest { - return new GetThreadRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetThreadRequest | PlainMessage | undefined, b: GetThreadRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetThreadRequest, a, b); - } -} - -/** - * @generated from message bsky.GetThreadResponse - */ -export class GetThreadResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetThreadResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetThreadResponse { - return new GetThreadResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetThreadResponse { - return new GetThreadResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetThreadResponse { - return new GetThreadResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetThreadResponse | PlainMessage | undefined, b: GetThreadResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetThreadResponse, a, b); - } -} - -/** - * - Return DIDs of actors matching term, paginated - * - `searchActors` skeleton - * - * @generated from message bsky.SearchActorsRequest - */ -export class SearchActorsRequest extends Message { - /** - * @generated from field: string term = 1; - */ - term = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchActorsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "term", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchActorsRequest { - return new SearchActorsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchActorsRequest { - return new SearchActorsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchActorsRequest { - return new SearchActorsRequest().fromJsonString(jsonString, options); - } - - static equals(a: SearchActorsRequest | PlainMessage | undefined, b: SearchActorsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchActorsRequest, a, b); - } -} - -/** - * @generated from message bsky.SearchActorsResponse - */ -export class SearchActorsResponse extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchActorsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchActorsResponse { - return new SearchActorsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchActorsResponse { - return new SearchActorsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchActorsResponse { - return new SearchActorsResponse().fromJsonString(jsonString, options); - } - - static equals(a: SearchActorsResponse | PlainMessage | undefined, b: SearchActorsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchActorsResponse, a, b); - } -} - -/** - * - Return uris of posts matching term, paginated - * - `searchPosts` skeleton - * - * @generated from message bsky.SearchPostsRequest - */ -export class SearchPostsRequest extends Message { - /** - * @generated from field: string term = 1; - */ - term = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchPostsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "term", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchPostsRequest { - return new SearchPostsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchPostsRequest { - return new SearchPostsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchPostsRequest { - return new SearchPostsRequest().fromJsonString(jsonString, options); - } - - static equals(a: SearchPostsRequest | PlainMessage | undefined, b: SearchPostsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchPostsRequest, a, b); - } -} - -/** - * @generated from message bsky.SearchPostsResponse - */ -export class SearchPostsResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchPostsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchPostsResponse { - return new SearchPostsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchPostsResponse { - return new SearchPostsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchPostsResponse { - return new SearchPostsResponse().fromJsonString(jsonString, options); - } - - static equals(a: SearchPostsResponse | PlainMessage | undefined, b: SearchPostsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchPostsResponse, a, b); - } -} - -/** - * - Return uris of starter packs matching term, paginated - * - `searchStarterPacks` skeleton - * - * @generated from message bsky.SearchStarterPacksRequest - */ -export class SearchStarterPacksRequest extends Message { - /** - * @generated from field: string term = 1; - */ - term = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchStarterPacksRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "term", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchStarterPacksRequest { - return new SearchStarterPacksRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchStarterPacksRequest { - return new SearchStarterPacksRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchStarterPacksRequest { - return new SearchStarterPacksRequest().fromJsonString(jsonString, options); - } - - static equals(a: SearchStarterPacksRequest | PlainMessage | undefined, b: SearchStarterPacksRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchStarterPacksRequest, a, b); - } -} - -/** - * @generated from message bsky.SearchStarterPacksResponse - */ -export class SearchStarterPacksResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SearchStarterPacksResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SearchStarterPacksResponse { - return new SearchStarterPacksResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SearchStarterPacksResponse { - return new SearchStarterPacksResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SearchStarterPacksResponse { - return new SearchStarterPacksResponse().fromJsonString(jsonString, options); - } - - static equals(a: SearchStarterPacksResponse | PlainMessage | undefined, b: SearchStarterPacksResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(SearchStarterPacksResponse, a, b); - } -} - -/** - * - Return DIDs of suggested follows for a user, excluding anyone they already follow - * - `getSuggestions`, `getSuggestedFollowsByActor` - * - * @generated from message bsky.GetFollowSuggestionsRequest - */ -export class GetFollowSuggestionsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string relative_to_did = 2; - */ - relativeToDid = ""; - - /** - * @generated from field: int32 limit = 3; - */ - limit = 0; - - /** - * @generated from field: string cursor = 4; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowSuggestionsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "relative_to_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 4, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowSuggestionsRequest { - return new GetFollowSuggestionsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowSuggestionsRequest { - return new GetFollowSuggestionsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowSuggestionsRequest { - return new GetFollowSuggestionsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowSuggestionsRequest | PlainMessage | undefined, b: GetFollowSuggestionsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowSuggestionsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetFollowSuggestionsResponse - */ -export class GetFollowSuggestionsResponse extends Message { - /** - * @generated from field: repeated string dids = 1; - */ - dids: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowSuggestionsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowSuggestionsResponse { - return new GetFollowSuggestionsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowSuggestionsResponse { - return new GetFollowSuggestionsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowSuggestionsResponse { - return new GetFollowSuggestionsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowSuggestionsResponse | PlainMessage | undefined, b: GetFollowSuggestionsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowSuggestionsResponse, a, b); - } -} - -/** - * @generated from message bsky.SuggestedEntity - */ -export class SuggestedEntity extends Message { - /** - * @generated from field: string tag = 1; - */ - tag = ""; - - /** - * @generated from field: string subject = 2; - */ - subject = ""; - - /** - * @generated from field: string subject_type = 3; - */ - subjectType = ""; - - /** - * @generated from field: int64 priority = 4; - */ - priority = protoInt64.zero; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.SuggestedEntity"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "tag", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject_type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "priority", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SuggestedEntity { - return new SuggestedEntity().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SuggestedEntity { - return new SuggestedEntity().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SuggestedEntity { - return new SuggestedEntity().fromJsonString(jsonString, options); - } - - static equals(a: SuggestedEntity | PlainMessage | undefined, b: SuggestedEntity | PlainMessage | undefined): boolean { - return proto3.util.equals(SuggestedEntity, a, b); - } -} - -/** - * @generated from message bsky.GetSuggestedEntitiesRequest - */ -export class GetSuggestedEntitiesRequest extends Message { - /** - * @generated from field: int32 limit = 1; - */ - limit = 0; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSuggestedEntitiesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSuggestedEntitiesRequest { - return new GetSuggestedEntitiesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSuggestedEntitiesRequest { - return new GetSuggestedEntitiesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSuggestedEntitiesRequest { - return new GetSuggestedEntitiesRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetSuggestedEntitiesRequest | PlainMessage | undefined, b: GetSuggestedEntitiesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSuggestedEntitiesRequest, a, b); - } -} - -/** - * @generated from message bsky.GetSuggestedEntitiesResponse - */ -export class GetSuggestedEntitiesResponse extends Message { - /** - * @generated from field: repeated bsky.SuggestedEntity entities = 1; - */ - entities: SuggestedEntity[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSuggestedEntitiesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "entities", kind: "message", T: SuggestedEntity, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSuggestedEntitiesResponse { - return new GetSuggestedEntitiesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSuggestedEntitiesResponse { - return new GetSuggestedEntitiesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSuggestedEntitiesResponse { - return new GetSuggestedEntitiesResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetSuggestedEntitiesResponse | PlainMessage | undefined, b: GetSuggestedEntitiesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSuggestedEntitiesResponse, a, b); - } -} - -/** - * - Get all labels on a subjects A, B, C (uri or did) issued by dids D, E, F… - * - label hydration on nearly every view - * - * @generated from message bsky.GetLabelsRequest - */ -export class GetLabelsRequest extends Message { - /** - * @generated from field: repeated string subjects = 1; - */ - subjects: string[] = []; - - /** - * @generated from field: repeated string issuers = 2; - */ - issuers: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLabelsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subjects", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "issuers", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLabelsRequest { - return new GetLabelsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLabelsRequest { - return new GetLabelsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLabelsRequest { - return new GetLabelsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLabelsRequest | PlainMessage | undefined, b: GetLabelsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLabelsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLabelsResponse - */ -export class GetLabelsResponse extends Message { - /** - * @generated from field: repeated bytes labels = 1; - */ - labels: Uint8Array[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLabelsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "labels", kind: "scalar", T: 12 /* ScalarType.BYTES */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLabelsResponse { - return new GetLabelsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLabelsResponse { - return new GetLabelsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLabelsResponse { - return new GetLabelsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLabelsResponse | PlainMessage | undefined, b: GetLabelsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLabelsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetActorStarterPacksRequest - */ -export class GetActorStarterPacksRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorStarterPacksRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorStarterPacksRequest { - return new GetActorStarterPacksRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorStarterPacksRequest { - return new GetActorStarterPacksRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorStarterPacksRequest { - return new GetActorStarterPacksRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorStarterPacksRequest | PlainMessage | undefined, b: GetActorStarterPacksRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorStarterPacksRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorStarterPacksResponse - */ -export class GetActorStarterPacksResponse extends Message { - /** - * @generated from field: repeated string uris = 1; - */ - uris: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorStarterPacksResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorStarterPacksResponse { - return new GetActorStarterPacksResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorStarterPacksResponse { - return new GetActorStarterPacksResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorStarterPacksResponse { - return new GetActorStarterPacksResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorStarterPacksResponse | PlainMessage | undefined, b: GetActorStarterPacksResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorStarterPacksResponse, a, b); - } -} - -/** - * - Latest repo rev of user w/ DID - * - Read-after-write header in`getProfile`, `getProfiles`, `getActorLikes`, `getAuthorFeed`, `getListFeed`, `getPostThread`, `getTimeline`. Could it be view dependent? - * - * @generated from message bsky.GetLatestRevRequest - */ -export class GetLatestRevRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLatestRevRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLatestRevRequest { - return new GetLatestRevRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLatestRevRequest { - return new GetLatestRevRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLatestRevRequest { - return new GetLatestRevRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetLatestRevRequest | PlainMessage | undefined, b: GetLatestRevRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLatestRevRequest, a, b); - } -} - -/** - * @generated from message bsky.GetLatestRevResponse - */ -export class GetLatestRevResponse extends Message { - /** - * @generated from field: string rev = 1; - */ - rev = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetLatestRevResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "rev", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetLatestRevResponse { - return new GetLatestRevResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetLatestRevResponse { - return new GetLatestRevResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetLatestRevResponse { - return new GetLatestRevResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetLatestRevResponse | PlainMessage | undefined, b: GetLatestRevResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetLatestRevResponse, a, b); - } -} - -/** - * @generated from message bsky.GetIdentityByDidRequest - */ -export class GetIdentityByDidRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetIdentityByDidRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetIdentityByDidRequest { - return new GetIdentityByDidRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetIdentityByDidRequest { - return new GetIdentityByDidRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetIdentityByDidRequest { - return new GetIdentityByDidRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetIdentityByDidRequest | PlainMessage | undefined, b: GetIdentityByDidRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetIdentityByDidRequest, a, b); - } -} - -/** - * @generated from message bsky.GetIdentityByDidResponse - */ -export class GetIdentityByDidResponse extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string handle = 2; - */ - handle = ""; - - /** - * @generated from field: bytes keys = 3; - */ - keys = new Uint8Array(0); - - /** - * @generated from field: bytes services = 4; - */ - services = new Uint8Array(0); - - /** - * @generated from field: google.protobuf.Timestamp updated = 5; - */ - updated?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetIdentityByDidResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "handle", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "keys", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 4, name: "services", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 5, name: "updated", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetIdentityByDidResponse { - return new GetIdentityByDidResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetIdentityByDidResponse { - return new GetIdentityByDidResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetIdentityByDidResponse { - return new GetIdentityByDidResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetIdentityByDidResponse | PlainMessage | undefined, b: GetIdentityByDidResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetIdentityByDidResponse, a, b); - } -} - -/** - * @generated from message bsky.GetIdentityByHandleRequest - */ -export class GetIdentityByHandleRequest extends Message { - /** - * @generated from field: string handle = 1; - */ - handle = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetIdentityByHandleRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "handle", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetIdentityByHandleRequest { - return new GetIdentityByHandleRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetIdentityByHandleRequest { - return new GetIdentityByHandleRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetIdentityByHandleRequest { - return new GetIdentityByHandleRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetIdentityByHandleRequest | PlainMessage | undefined, b: GetIdentityByHandleRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetIdentityByHandleRequest, a, b); - } -} - -/** - * @generated from message bsky.GetIdentityByHandleResponse - */ -export class GetIdentityByHandleResponse extends Message { - /** - * @generated from field: string handle = 1; - */ - handle = ""; - - /** - * @generated from field: string did = 2; - */ - did = ""; - - /** - * @generated from field: bytes keys = 3; - */ - keys = new Uint8Array(0); - - /** - * @generated from field: bytes services = 4; - */ - services = new Uint8Array(0); - - /** - * @generated from field: google.protobuf.Timestamp updated = 5; - */ - updated?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetIdentityByHandleResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "handle", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "keys", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 4, name: "services", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - { no: 5, name: "updated", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetIdentityByHandleResponse { - return new GetIdentityByHandleResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetIdentityByHandleResponse { - return new GetIdentityByHandleResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetIdentityByHandleResponse { - return new GetIdentityByHandleResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetIdentityByHandleResponse | PlainMessage | undefined, b: GetIdentityByHandleResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetIdentityByHandleResponse, a, b); - } -} - -/** - * @generated from message bsky.GetBlobTakedownRequest - */ -export class GetBlobTakedownRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlobTakedownRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlobTakedownRequest { - return new GetBlobTakedownRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlobTakedownRequest { - return new GetBlobTakedownRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlobTakedownRequest { - return new GetBlobTakedownRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBlobTakedownRequest | PlainMessage | undefined, b: GetBlobTakedownRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlobTakedownRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBlobTakedownResponse - */ -export class GetBlobTakedownResponse extends Message { - /** - * @generated from field: bool taken_down = 1; - */ - takenDown = false; - - /** - * @generated from field: string takedown_ref = 2; - */ - takedownRef = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBlobTakedownResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "taken_down", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 2, name: "takedown_ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBlobTakedownResponse { - return new GetBlobTakedownResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBlobTakedownResponse { - return new GetBlobTakedownResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBlobTakedownResponse { - return new GetBlobTakedownResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBlobTakedownResponse | PlainMessage | undefined, b: GetBlobTakedownResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBlobTakedownResponse, a, b); - } -} - -/** - * @generated from message bsky.GetActorTakedownRequest - */ -export class GetActorTakedownRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorTakedownRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorTakedownRequest { - return new GetActorTakedownRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorTakedownRequest { - return new GetActorTakedownRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorTakedownRequest { - return new GetActorTakedownRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorTakedownRequest | PlainMessage | undefined, b: GetActorTakedownRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorTakedownRequest, a, b); - } -} - -/** - * @generated from message bsky.GetActorTakedownResponse - */ -export class GetActorTakedownResponse extends Message { - /** - * @generated from field: bool taken_down = 1; - */ - takenDown = false; - - /** - * @generated from field: string takedown_ref = 2; - */ - takedownRef = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorTakedownResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "taken_down", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 2, name: "takedown_ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorTakedownResponse { - return new GetActorTakedownResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorTakedownResponse { - return new GetActorTakedownResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorTakedownResponse { - return new GetActorTakedownResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorTakedownResponse | PlainMessage | undefined, b: GetActorTakedownResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorTakedownResponse, a, b); - } -} - -/** - * @generated from message bsky.GetRecordTakedownRequest - */ -export class GetRecordTakedownRequest extends Message { - /** - * @generated from field: string record_uri = 1; - */ - recordUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRecordTakedownRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "record_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRecordTakedownRequest { - return new GetRecordTakedownRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRecordTakedownRequest { - return new GetRecordTakedownRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRecordTakedownRequest { - return new GetRecordTakedownRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetRecordTakedownRequest | PlainMessage | undefined, b: GetRecordTakedownRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRecordTakedownRequest, a, b); - } -} - -/** - * @generated from message bsky.GetRecordTakedownResponse - */ -export class GetRecordTakedownResponse extends Message { - /** - * @generated from field: bool taken_down = 1; - */ - takenDown = false; - - /** - * @generated from field: string takedown_ref = 2; - */ - takedownRef = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetRecordTakedownResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "taken_down", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 2, name: "takedown_ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetRecordTakedownResponse { - return new GetRecordTakedownResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetRecordTakedownResponse { - return new GetRecordTakedownResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetRecordTakedownResponse { - return new GetRecordTakedownResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetRecordTakedownResponse | PlainMessage | undefined, b: GetRecordTakedownResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetRecordTakedownResponse, a, b); - } -} - -/** - * - * Bookmarks - * - * - * @generated from message bsky.Bookmark - */ -export class Bookmark extends Message { - /** - * @generated from field: bsky.StashRef ref = 1; - */ - ref?: StashRef; - - /** - * @generated from field: string subject_uri = 2; - */ - subjectUri = ""; - - /** - * @generated from field: string subject_cid = 3; - */ - subjectCid = ""; - - /** - * @generated from field: google.protobuf.Timestamp indexed_at = 4; - */ - indexedAt?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.Bookmark"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "ref", kind: "message", T: StashRef }, - { no: 2, name: "subject_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject_cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "indexed_at", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Bookmark { - return new Bookmark().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Bookmark { - return new Bookmark().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Bookmark { - return new Bookmark().fromJsonString(jsonString, options); - } - - static equals(a: Bookmark | PlainMessage | undefined, b: Bookmark | PlainMessage | undefined): boolean { - return proto3.util.equals(Bookmark, a, b); - } -} - -/** - * @generated from message bsky.GetBookmarksByActorAndSubjectsRequest - */ -export class GetBookmarksByActorAndSubjectsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string uris = 2; - */ - uris: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBookmarksByActorAndSubjectsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "uris", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBookmarksByActorAndSubjectsRequest { - return new GetBookmarksByActorAndSubjectsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBookmarksByActorAndSubjectsRequest { - return new GetBookmarksByActorAndSubjectsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBookmarksByActorAndSubjectsRequest { - return new GetBookmarksByActorAndSubjectsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetBookmarksByActorAndSubjectsRequest | PlainMessage | undefined, b: GetBookmarksByActorAndSubjectsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBookmarksByActorAndSubjectsRequest, a, b); - } -} - -/** - * @generated from message bsky.GetBookmarksByActorAndSubjectsResponse - */ -export class GetBookmarksByActorAndSubjectsResponse extends Message { - /** - * @generated from field: repeated bsky.Bookmark bookmarks = 1; - */ - bookmarks: Bookmark[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetBookmarksByActorAndSubjectsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "bookmarks", kind: "message", T: Bookmark, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetBookmarksByActorAndSubjectsResponse { - return new GetBookmarksByActorAndSubjectsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetBookmarksByActorAndSubjectsResponse { - return new GetBookmarksByActorAndSubjectsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetBookmarksByActorAndSubjectsResponse { - return new GetBookmarksByActorAndSubjectsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetBookmarksByActorAndSubjectsResponse | PlainMessage | undefined, b: GetBookmarksByActorAndSubjectsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetBookmarksByActorAndSubjectsResponse, a, b); - } -} - -/** - * @generated from message bsky.GetActorBookmarksRequest - */ -export class GetActorBookmarksRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorBookmarksRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorBookmarksRequest { - return new GetActorBookmarksRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorBookmarksRequest { - return new GetActorBookmarksRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorBookmarksRequest { - return new GetActorBookmarksRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorBookmarksRequest | PlainMessage | undefined, b: GetActorBookmarksRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorBookmarksRequest, a, b); - } -} - -/** - * @generated from message bsky.BookmarkInfo - */ -export class BookmarkInfo extends Message { - /** - * stash key - * - * @generated from field: string key = 1; - */ - key = ""; - - /** - * @generated from field: string subject = 2; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.BookmarkInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): BookmarkInfo { - return new BookmarkInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): BookmarkInfo { - return new BookmarkInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): BookmarkInfo { - return new BookmarkInfo().fromJsonString(jsonString, options); - } - - static equals(a: BookmarkInfo | PlainMessage | undefined, b: BookmarkInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(BookmarkInfo, a, b); - } -} - -/** - * @generated from message bsky.GetActorBookmarksResponse - */ -export class GetActorBookmarksResponse extends Message { - /** - * @generated from field: repeated bsky.BookmarkInfo bookmarks = 1; - */ - bookmarks: BookmarkInfo[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorBookmarksResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "bookmarks", kind: "message", T: BookmarkInfo, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorBookmarksResponse { - return new GetActorBookmarksResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorBookmarksResponse { - return new GetActorBookmarksResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorBookmarksResponse { - return new GetActorBookmarksResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorBookmarksResponse | PlainMessage | undefined, b: GetActorBookmarksResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorBookmarksResponse, a, b); - } -} - -/** - * @generated from message bsky.GetActorDraftsRequest - */ -export class GetActorDraftsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorDraftsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorDraftsRequest { - return new GetActorDraftsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorDraftsRequest { - return new GetActorDraftsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorDraftsRequest { - return new GetActorDraftsRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetActorDraftsRequest | PlainMessage | undefined, b: GetActorDraftsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorDraftsRequest, a, b); - } -} - -/** - * @generated from message bsky.DraftInfo - */ -export class DraftInfo extends Message { - /** - * stash key - * - * @generated from field: string key = 1; - */ - key = ""; - - /** - * @generated from field: google.protobuf.Timestamp created_at = 2; - */ - createdAt?: Timestamp; - - /** - * @generated from field: google.protobuf.Timestamp updated_at = 3; - */ - updatedAt?: Timestamp; - - /** - * @generated from field: bytes payload = 4; - */ - payload = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DraftInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "created_at", kind: "message", T: Timestamp }, - { no: 3, name: "updated_at", kind: "message", T: Timestamp }, - { no: 4, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DraftInfo { - return new DraftInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DraftInfo { - return new DraftInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DraftInfo { - return new DraftInfo().fromJsonString(jsonString, options); - } - - static equals(a: DraftInfo | PlainMessage | undefined, b: DraftInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(DraftInfo, a, b); - } -} - -/** - * @generated from message bsky.GetActorDraftsResponse - */ -export class GetActorDraftsResponse extends Message { - /** - * @generated from field: repeated bsky.DraftInfo drafts = 1; - */ - drafts: DraftInfo[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetActorDraftsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "drafts", kind: "message", T: DraftInfo, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetActorDraftsResponse { - return new GetActorDraftsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetActorDraftsResponse { - return new GetActorDraftsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetActorDraftsResponse { - return new GetActorDraftsResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetActorDraftsResponse | PlainMessage | undefined, b: GetActorDraftsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetActorDraftsResponse, a, b); - } -} - -/** - * GetFollowsFollowing gets the list of DIDs that the actor follows that also follow the targets - * - * @generated from message bsky.GetFollowsFollowingRequest - */ -export class GetFollowsFollowingRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: repeated string target_dids = 2; - */ - targetDids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowsFollowingRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "target_dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowsFollowingRequest { - return new GetFollowsFollowingRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowsFollowingRequest { - return new GetFollowsFollowingRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowsFollowingRequest { - return new GetFollowsFollowingRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowsFollowingRequest | PlainMessage | undefined, b: GetFollowsFollowingRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowsFollowingRequest, a, b); - } -} - -/** - * @generated from message bsky.FollowsFollowing - */ -export class FollowsFollowing extends Message { - /** - * @generated from field: string target_did = 1; - */ - targetDid = ""; - - /** - * @generated from field: repeated string dids = 2; - */ - dids: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.FollowsFollowing"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "target_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "dids", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): FollowsFollowing { - return new FollowsFollowing().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): FollowsFollowing { - return new FollowsFollowing().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): FollowsFollowing { - return new FollowsFollowing().fromJsonString(jsonString, options); - } - - static equals(a: FollowsFollowing | PlainMessage | undefined, b: FollowsFollowing | PlainMessage | undefined): boolean { - return proto3.util.equals(FollowsFollowing, a, b); - } -} - -/** - * @generated from message bsky.GetFollowsFollowingResponse - */ -export class GetFollowsFollowingResponse extends Message { - /** - * @generated from field: repeated bsky.FollowsFollowing results = 1; - */ - results: FollowsFollowing[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetFollowsFollowingResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "results", kind: "message", T: FollowsFollowing, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetFollowsFollowingResponse { - return new GetFollowsFollowingResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetFollowsFollowingResponse { - return new GetFollowsFollowingResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetFollowsFollowingResponse { - return new GetFollowsFollowingResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetFollowsFollowingResponse | PlainMessage | undefined, b: GetFollowsFollowingResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetFollowsFollowingResponse, a, b); - } -} - -/** - * @generated from message bsky.GetSitemapIndexRequest - */ -export class GetSitemapIndexRequest extends Message { - /** - * @generated from field: bsky.SitemapPageType type = 1; - */ - type = SitemapPageType.UNSPECIFIED; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSitemapIndexRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(SitemapPageType) }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSitemapIndexRequest { - return new GetSitemapIndexRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSitemapIndexRequest { - return new GetSitemapIndexRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSitemapIndexRequest { - return new GetSitemapIndexRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetSitemapIndexRequest | PlainMessage | undefined, b: GetSitemapIndexRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSitemapIndexRequest, a, b); - } -} - -/** - * @generated from message bsky.GetSitemapIndexResponse - */ -export class GetSitemapIndexResponse extends Message { - /** - * GZIP compressed XML sitemap - * - * @generated from field: bytes sitemap = 1; - */ - sitemap = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSitemapIndexResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "sitemap", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSitemapIndexResponse { - return new GetSitemapIndexResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSitemapIndexResponse { - return new GetSitemapIndexResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSitemapIndexResponse { - return new GetSitemapIndexResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetSitemapIndexResponse | PlainMessage | undefined, b: GetSitemapIndexResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSitemapIndexResponse, a, b); - } -} - -/** - * Sitemap HTTP paths are typically of the form `/type/yyyy-mm-dd/N.xml.gz`, i.e. `/users/2025-01-01/1.xml.gz` - * - * @generated from message bsky.GetSitemapPageRequest - */ -export class GetSitemapPageRequest extends Message { - /** - * @generated from field: bsky.SitemapPageType type = 1; - */ - type = SitemapPageType.UNSPECIFIED; - - /** - * @generated from field: google.protobuf.Timestamp date = 2; - */ - date?: Timestamp; - - /** - * One-indexed - * - * @generated from field: int32 bucket = 3; - */ - bucket = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSitemapPageRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(SitemapPageType) }, - { no: 2, name: "date", kind: "message", T: Timestamp }, - { no: 3, name: "bucket", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSitemapPageRequest { - return new GetSitemapPageRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSitemapPageRequest { - return new GetSitemapPageRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSitemapPageRequest { - return new GetSitemapPageRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetSitemapPageRequest | PlainMessage | undefined, b: GetSitemapPageRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSitemapPageRequest, a, b); - } -} - -/** - * @generated from message bsky.GetSitemapPageResponse - */ -export class GetSitemapPageResponse extends Message { - /** - * GZIP compressed XML sitemap - * - * @generated from field: bytes sitemap = 1; - */ - sitemap = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.GetSitemapPageResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "sitemap", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSitemapPageResponse { - return new GetSitemapPageResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSitemapPageResponse { - return new GetSitemapPageResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSitemapPageResponse { - return new GetSitemapPageResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetSitemapPageResponse | PlainMessage | undefined, b: GetSitemapPageResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSitemapPageResponse, a, b); - } -} - -/** - * Ping - * - * @generated from message bsky.PingRequest - */ -export class PingRequest extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.PingRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingRequest { - return new PingRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingRequest { - return new PingRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingRequest { - return new PingRequest().fromJsonString(jsonString, options); - } - - static equals(a: PingRequest | PlainMessage | undefined, b: PingRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PingRequest, a, b); - } -} - -/** - * @generated from message bsky.PingResponse - */ -export class PingResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.PingResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingResponse { - return new PingResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingResponse { - return new PingResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingResponse { - return new PingResponse().fromJsonString(jsonString, options); - } - - static equals(a: PingResponse | PlainMessage | undefined, b: PingResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PingResponse, a, b); - } -} - -/** - * @generated from message bsky.StashRef - */ -export class StashRef extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 2; - */ - namespace = ""; - - /** - * @generated from field: string key = 3; - */ - key = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.StashRef"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): StashRef { - return new StashRef().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): StashRef { - return new StashRef().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): StashRef { - return new StashRef().fromJsonString(jsonString, options); - } - - static equals(a: StashRef | PlainMessage | undefined, b: StashRef | PlainMessage | undefined): boolean { - return proto3.util.equals(StashRef, a, b); - } -} - -/** - * @generated from message bsky.UpdateActorUpstreamStatusRequest - */ -export class UpdateActorUpstreamStatusRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: bool active = 2; - */ - active = false; - - /** - * @generated from field: string upstream_status = 3; - */ - upstreamStatus = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UpdateActorUpstreamStatusRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "active", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 3, name: "upstream_status", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UpdateActorUpstreamStatusRequest { - return new UpdateActorUpstreamStatusRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UpdateActorUpstreamStatusRequest { - return new UpdateActorUpstreamStatusRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UpdateActorUpstreamStatusRequest { - return new UpdateActorUpstreamStatusRequest().fromJsonString(jsonString, options); - } - - static equals(a: UpdateActorUpstreamStatusRequest | PlainMessage | undefined, b: UpdateActorUpstreamStatusRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(UpdateActorUpstreamStatusRequest, a, b); - } -} - -/** - * @generated from message bsky.UpdateActorUpstreamStatusResponse - */ -export class UpdateActorUpstreamStatusResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UpdateActorUpstreamStatusResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UpdateActorUpstreamStatusResponse { - return new UpdateActorUpstreamStatusResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UpdateActorUpstreamStatusResponse { - return new UpdateActorUpstreamStatusResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UpdateActorUpstreamStatusResponse { - return new UpdateActorUpstreamStatusResponse().fromJsonString(jsonString, options); - } - - static equals(a: UpdateActorUpstreamStatusResponse | PlainMessage | undefined, b: UpdateActorUpstreamStatusResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(UpdateActorUpstreamStatusResponse, a, b); - } -} - -/** - * @generated from message bsky.TakedownActorRequest - */ -export class TakedownActorRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string ref = 2; - */ - ref = ""; - - /** - * @generated from field: google.protobuf.Timestamp seen = 3; - */ - seen?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TakedownActorRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "seen", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TakedownActorRequest { - return new TakedownActorRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TakedownActorRequest { - return new TakedownActorRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TakedownActorRequest { - return new TakedownActorRequest().fromJsonString(jsonString, options); - } - - static equals(a: TakedownActorRequest | PlainMessage | undefined, b: TakedownActorRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(TakedownActorRequest, a, b); - } -} - -/** - * @generated from message bsky.TakedownActorResponse - */ -export class TakedownActorResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TakedownActorResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TakedownActorResponse { - return new TakedownActorResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TakedownActorResponse { - return new TakedownActorResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TakedownActorResponse { - return new TakedownActorResponse().fromJsonString(jsonString, options); - } - - static equals(a: TakedownActorResponse | PlainMessage | undefined, b: TakedownActorResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(TakedownActorResponse, a, b); - } -} - -/** - * @generated from message bsky.UntakedownActorRequest - */ -export class UntakedownActorRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: google.protobuf.Timestamp seen = 2; - */ - seen?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UntakedownActorRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "seen", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UntakedownActorRequest { - return new UntakedownActorRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UntakedownActorRequest { - return new UntakedownActorRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UntakedownActorRequest { - return new UntakedownActorRequest().fromJsonString(jsonString, options); - } - - static equals(a: UntakedownActorRequest | PlainMessage | undefined, b: UntakedownActorRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(UntakedownActorRequest, a, b); - } -} - -/** - * @generated from message bsky.UntakedownActorResponse - */ -export class UntakedownActorResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UntakedownActorResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UntakedownActorResponse { - return new UntakedownActorResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UntakedownActorResponse { - return new UntakedownActorResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UntakedownActorResponse { - return new UntakedownActorResponse().fromJsonString(jsonString, options); - } - - static equals(a: UntakedownActorResponse | PlainMessage | undefined, b: UntakedownActorResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(UntakedownActorResponse, a, b); - } -} - -/** - * @generated from message bsky.TakedownBlobRequest - */ -export class TakedownBlobRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - /** - * @generated from field: string ref = 3; - */ - ref = ""; - - /** - * @generated from field: google.protobuf.Timestamp seen = 4; - */ - seen?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TakedownBlobRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "seen", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TakedownBlobRequest { - return new TakedownBlobRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TakedownBlobRequest { - return new TakedownBlobRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TakedownBlobRequest { - return new TakedownBlobRequest().fromJsonString(jsonString, options); - } - - static equals(a: TakedownBlobRequest | PlainMessage | undefined, b: TakedownBlobRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(TakedownBlobRequest, a, b); - } -} - -/** - * @generated from message bsky.TakedownBlobResponse - */ -export class TakedownBlobResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TakedownBlobResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TakedownBlobResponse { - return new TakedownBlobResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TakedownBlobResponse { - return new TakedownBlobResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TakedownBlobResponse { - return new TakedownBlobResponse().fromJsonString(jsonString, options); - } - - static equals(a: TakedownBlobResponse | PlainMessage | undefined, b: TakedownBlobResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(TakedownBlobResponse, a, b); - } -} - -/** - * @generated from message bsky.UntakedownBlobRequest - */ -export class UntakedownBlobRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string cid = 2; - */ - cid = ""; - - /** - * @generated from field: google.protobuf.Timestamp seen = 3; - */ - seen?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UntakedownBlobRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "cid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "seen", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UntakedownBlobRequest { - return new UntakedownBlobRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UntakedownBlobRequest { - return new UntakedownBlobRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UntakedownBlobRequest { - return new UntakedownBlobRequest().fromJsonString(jsonString, options); - } - - static equals(a: UntakedownBlobRequest | PlainMessage | undefined, b: UntakedownBlobRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(UntakedownBlobRequest, a, b); - } -} - -/** - * @generated from message bsky.UntakedownBlobResponse - */ -export class UntakedownBlobResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UntakedownBlobResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UntakedownBlobResponse { - return new UntakedownBlobResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UntakedownBlobResponse { - return new UntakedownBlobResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UntakedownBlobResponse { - return new UntakedownBlobResponse().fromJsonString(jsonString, options); - } - - static equals(a: UntakedownBlobResponse | PlainMessage | undefined, b: UntakedownBlobResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(UntakedownBlobResponse, a, b); - } -} - -/** - * @generated from message bsky.TakedownRecordRequest - */ -export class TakedownRecordRequest extends Message { - /** - * @generated from field: string record_uri = 1; - */ - recordUri = ""; - - /** - * @generated from field: string ref = 2; - */ - ref = ""; - - /** - * @generated from field: google.protobuf.Timestamp seen = 3; - */ - seen?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TakedownRecordRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "record_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "ref", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "seen", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TakedownRecordRequest { - return new TakedownRecordRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TakedownRecordRequest { - return new TakedownRecordRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TakedownRecordRequest { - return new TakedownRecordRequest().fromJsonString(jsonString, options); - } - - static equals(a: TakedownRecordRequest | PlainMessage | undefined, b: TakedownRecordRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(TakedownRecordRequest, a, b); - } -} - -/** - * @generated from message bsky.TakedownRecordResponse - */ -export class TakedownRecordResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.TakedownRecordResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): TakedownRecordResponse { - return new TakedownRecordResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): TakedownRecordResponse { - return new TakedownRecordResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): TakedownRecordResponse { - return new TakedownRecordResponse().fromJsonString(jsonString, options); - } - - static equals(a: TakedownRecordResponse | PlainMessage | undefined, b: TakedownRecordResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(TakedownRecordResponse, a, b); - } -} - -/** - * @generated from message bsky.UntakedownRecordRequest - */ -export class UntakedownRecordRequest extends Message { - /** - * @generated from field: string record_uri = 1; - */ - recordUri = ""; - - /** - * @generated from field: google.protobuf.Timestamp seen = 2; - */ - seen?: Timestamp; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UntakedownRecordRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "record_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "seen", kind: "message", T: Timestamp }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UntakedownRecordRequest { - return new UntakedownRecordRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UntakedownRecordRequest { - return new UntakedownRecordRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UntakedownRecordRequest { - return new UntakedownRecordRequest().fromJsonString(jsonString, options); - } - - static equals(a: UntakedownRecordRequest | PlainMessage | undefined, b: UntakedownRecordRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(UntakedownRecordRequest, a, b); - } -} - -/** - * @generated from message bsky.UntakedownRecordResponse - */ -export class UntakedownRecordResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.UntakedownRecordResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UntakedownRecordResponse { - return new UntakedownRecordResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UntakedownRecordResponse { - return new UntakedownRecordResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UntakedownRecordResponse { - return new UntakedownRecordResponse().fromJsonString(jsonString, options); - } - - static equals(a: UntakedownRecordResponse | PlainMessage | undefined, b: UntakedownRecordResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(UntakedownRecordResponse, a, b); - } -} - -/** - * @generated from message bsky.CreateActorMuteRequest - */ -export class CreateActorMuteRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string subject_did = 2; - */ - subjectDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.CreateActorMuteRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): CreateActorMuteRequest { - return new CreateActorMuteRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): CreateActorMuteRequest { - return new CreateActorMuteRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): CreateActorMuteRequest { - return new CreateActorMuteRequest().fromJsonString(jsonString, options); - } - - static equals(a: CreateActorMuteRequest | PlainMessage | undefined, b: CreateActorMuteRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(CreateActorMuteRequest, a, b); - } -} - -/** - * @generated from message bsky.CreateActorMuteResponse - */ -export class CreateActorMuteResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.CreateActorMuteResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): CreateActorMuteResponse { - return new CreateActorMuteResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): CreateActorMuteResponse { - return new CreateActorMuteResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): CreateActorMuteResponse { - return new CreateActorMuteResponse().fromJsonString(jsonString, options); - } - - static equals(a: CreateActorMuteResponse | PlainMessage | undefined, b: CreateActorMuteResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(CreateActorMuteResponse, a, b); - } -} - -/** - * @generated from message bsky.DeleteActorMuteRequest - */ -export class DeleteActorMuteRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string subject_did = 2; - */ - subjectDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DeleteActorMuteRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteActorMuteRequest { - return new DeleteActorMuteRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteActorMuteRequest { - return new DeleteActorMuteRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteActorMuteRequest { - return new DeleteActorMuteRequest().fromJsonString(jsonString, options); - } - - static equals(a: DeleteActorMuteRequest | PlainMessage | undefined, b: DeleteActorMuteRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteActorMuteRequest, a, b); - } -} - -/** - * @generated from message bsky.DeleteActorMuteResponse - */ -export class DeleteActorMuteResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DeleteActorMuteResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteActorMuteResponse { - return new DeleteActorMuteResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteActorMuteResponse { - return new DeleteActorMuteResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteActorMuteResponse { - return new DeleteActorMuteResponse().fromJsonString(jsonString, options); - } - - static equals(a: DeleteActorMuteResponse | PlainMessage | undefined, b: DeleteActorMuteResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteActorMuteResponse, a, b); - } -} - -/** - * @generated from message bsky.ClearActorMutesRequest - */ -export class ClearActorMutesRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ClearActorMutesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ClearActorMutesRequest { - return new ClearActorMutesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ClearActorMutesRequest { - return new ClearActorMutesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ClearActorMutesRequest { - return new ClearActorMutesRequest().fromJsonString(jsonString, options); - } - - static equals(a: ClearActorMutesRequest | PlainMessage | undefined, b: ClearActorMutesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ClearActorMutesRequest, a, b); - } -} - -/** - * @generated from message bsky.ClearActorMutesResponse - */ -export class ClearActorMutesResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ClearActorMutesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ClearActorMutesResponse { - return new ClearActorMutesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ClearActorMutesResponse { - return new ClearActorMutesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ClearActorMutesResponse { - return new ClearActorMutesResponse().fromJsonString(jsonString, options); - } - - static equals(a: ClearActorMutesResponse | PlainMessage | undefined, b: ClearActorMutesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ClearActorMutesResponse, a, b); - } -} - -/** - * @generated from message bsky.CreateActorMutelistSubscriptionRequest - */ -export class CreateActorMutelistSubscriptionRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string subject_uri = 2; - */ - subjectUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.CreateActorMutelistSubscriptionRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): CreateActorMutelistSubscriptionRequest { - return new CreateActorMutelistSubscriptionRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): CreateActorMutelistSubscriptionRequest { - return new CreateActorMutelistSubscriptionRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): CreateActorMutelistSubscriptionRequest { - return new CreateActorMutelistSubscriptionRequest().fromJsonString(jsonString, options); - } - - static equals(a: CreateActorMutelistSubscriptionRequest | PlainMessage | undefined, b: CreateActorMutelistSubscriptionRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(CreateActorMutelistSubscriptionRequest, a, b); - } -} - -/** - * @generated from message bsky.CreateActorMutelistSubscriptionResponse - */ -export class CreateActorMutelistSubscriptionResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.CreateActorMutelistSubscriptionResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): CreateActorMutelistSubscriptionResponse { - return new CreateActorMutelistSubscriptionResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): CreateActorMutelistSubscriptionResponse { - return new CreateActorMutelistSubscriptionResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): CreateActorMutelistSubscriptionResponse { - return new CreateActorMutelistSubscriptionResponse().fromJsonString(jsonString, options); - } - - static equals(a: CreateActorMutelistSubscriptionResponse | PlainMessage | undefined, b: CreateActorMutelistSubscriptionResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(CreateActorMutelistSubscriptionResponse, a, b); - } -} - -/** - * @generated from message bsky.DeleteActorMutelistSubscriptionRequest - */ -export class DeleteActorMutelistSubscriptionRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string subject_uri = 2; - */ - subjectUri = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DeleteActorMutelistSubscriptionRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject_uri", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteActorMutelistSubscriptionRequest { - return new DeleteActorMutelistSubscriptionRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteActorMutelistSubscriptionRequest { - return new DeleteActorMutelistSubscriptionRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteActorMutelistSubscriptionRequest { - return new DeleteActorMutelistSubscriptionRequest().fromJsonString(jsonString, options); - } - - static equals(a: DeleteActorMutelistSubscriptionRequest | PlainMessage | undefined, b: DeleteActorMutelistSubscriptionRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteActorMutelistSubscriptionRequest, a, b); - } -} - -/** - * @generated from message bsky.DeleteActorMutelistSubscriptionResponse - */ -export class DeleteActorMutelistSubscriptionResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DeleteActorMutelistSubscriptionResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteActorMutelistSubscriptionResponse { - return new DeleteActorMutelistSubscriptionResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteActorMutelistSubscriptionResponse { - return new DeleteActorMutelistSubscriptionResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteActorMutelistSubscriptionResponse { - return new DeleteActorMutelistSubscriptionResponse().fromJsonString(jsonString, options); - } - - static equals(a: DeleteActorMutelistSubscriptionResponse | PlainMessage | undefined, b: DeleteActorMutelistSubscriptionResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteActorMutelistSubscriptionResponse, a, b); - } -} - -/** - * @generated from message bsky.ClearActorMutelistSubscriptionsRequest - */ -export class ClearActorMutelistSubscriptionsRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ClearActorMutelistSubscriptionsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ClearActorMutelistSubscriptionsRequest { - return new ClearActorMutelistSubscriptionsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ClearActorMutelistSubscriptionsRequest { - return new ClearActorMutelistSubscriptionsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ClearActorMutelistSubscriptionsRequest { - return new ClearActorMutelistSubscriptionsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ClearActorMutelistSubscriptionsRequest | PlainMessage | undefined, b: ClearActorMutelistSubscriptionsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ClearActorMutelistSubscriptionsRequest, a, b); - } -} - -/** - * @generated from message bsky.ClearActorMutelistSubscriptionsResponse - */ -export class ClearActorMutelistSubscriptionsResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ClearActorMutelistSubscriptionsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ClearActorMutelistSubscriptionsResponse { - return new ClearActorMutelistSubscriptionsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ClearActorMutelistSubscriptionsResponse { - return new ClearActorMutelistSubscriptionsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ClearActorMutelistSubscriptionsResponse { - return new ClearActorMutelistSubscriptionsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ClearActorMutelistSubscriptionsResponse | PlainMessage | undefined, b: ClearActorMutelistSubscriptionsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ClearActorMutelistSubscriptionsResponse, a, b); - } -} - -/** - * @generated from message bsky.CreateThreadMuteRequest - */ -export class CreateThreadMuteRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string thread_root = 2; - */ - threadRoot = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.CreateThreadMuteRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "thread_root", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): CreateThreadMuteRequest { - return new CreateThreadMuteRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): CreateThreadMuteRequest { - return new CreateThreadMuteRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): CreateThreadMuteRequest { - return new CreateThreadMuteRequest().fromJsonString(jsonString, options); - } - - static equals(a: CreateThreadMuteRequest | PlainMessage | undefined, b: CreateThreadMuteRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(CreateThreadMuteRequest, a, b); - } -} - -/** - * @generated from message bsky.CreateThreadMuteResponse - */ -export class CreateThreadMuteResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.CreateThreadMuteResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): CreateThreadMuteResponse { - return new CreateThreadMuteResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): CreateThreadMuteResponse { - return new CreateThreadMuteResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): CreateThreadMuteResponse { - return new CreateThreadMuteResponse().fromJsonString(jsonString, options); - } - - static equals(a: CreateThreadMuteResponse | PlainMessage | undefined, b: CreateThreadMuteResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(CreateThreadMuteResponse, a, b); - } -} - -/** - * @generated from message bsky.DeleteThreadMuteRequest - */ -export class DeleteThreadMuteRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string thread_root = 2; - */ - threadRoot = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DeleteThreadMuteRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "thread_root", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteThreadMuteRequest { - return new DeleteThreadMuteRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteThreadMuteRequest { - return new DeleteThreadMuteRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteThreadMuteRequest { - return new DeleteThreadMuteRequest().fromJsonString(jsonString, options); - } - - static equals(a: DeleteThreadMuteRequest | PlainMessage | undefined, b: DeleteThreadMuteRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteThreadMuteRequest, a, b); - } -} - -/** - * @generated from message bsky.DeleteThreadMuteResponse - */ -export class DeleteThreadMuteResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.DeleteThreadMuteResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteThreadMuteResponse { - return new DeleteThreadMuteResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteThreadMuteResponse { - return new DeleteThreadMuteResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteThreadMuteResponse { - return new DeleteThreadMuteResponse().fromJsonString(jsonString, options); - } - - static equals(a: DeleteThreadMuteResponse | PlainMessage | undefined, b: DeleteThreadMuteResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteThreadMuteResponse, a, b); - } -} - -/** - * @generated from message bsky.ClearThreadMutesRequest - */ -export class ClearThreadMutesRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ClearThreadMutesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ClearThreadMutesRequest { - return new ClearThreadMutesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ClearThreadMutesRequest { - return new ClearThreadMutesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ClearThreadMutesRequest { - return new ClearThreadMutesRequest().fromJsonString(jsonString, options); - } - - static equals(a: ClearThreadMutesRequest | PlainMessage | undefined, b: ClearThreadMutesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ClearThreadMutesRequest, a, b); - } -} - -/** - * @generated from message bsky.ClearThreadMutesResponse - */ -export class ClearThreadMutesResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsky.ClearThreadMutesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ClearThreadMutesResponse { - return new ClearThreadMutesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ClearThreadMutesResponse { - return new ClearThreadMutesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ClearThreadMutesResponse { - return new ClearThreadMutesResponse().fromJsonString(jsonString, options); - } - - static equals(a: ClearThreadMutesResponse | PlainMessage | undefined, b: ClearThreadMutesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ClearThreadMutesResponse, a, b); - } -} - diff --git a/packages/bsky/src/proto/bsync_connect.ts b/packages/bsky/src/proto/bsync_connect.ts deleted file mode 100644 index 86109857190..00000000000 --- a/packages/bsky/src/proto/bsync_connect.ts +++ /dev/null @@ -1,93 +0,0 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" -// @generated from file bsync.proto (package bsync, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import { AddMuteOperationRequest, AddMuteOperationResponse, AddNotifOperationRequest, AddNotifOperationResponse, DeleteOperationsByActorAndNamespaceRequest, DeleteOperationsByActorAndNamespaceResponse, PingRequest, PingResponse, PutOperationRequest, PutOperationResponse, ScanMuteOperationsRequest, ScanMuteOperationsResponse, ScanNotifOperationsRequest, ScanNotifOperationsResponse, ScanOperationsRequest, ScanOperationsResponse } from "./bsync_pb.js"; -import { MethodKind } from "@bufbuild/protobuf"; - -/** - * @generated from service bsync.Service - */ -export const Service = { - typeName: "bsync.Service", - methods: { - /** - * Sync - * - * @generated from rpc bsync.Service.AddMuteOperation - */ - addMuteOperation: { - name: "AddMuteOperation", - I: AddMuteOperationRequest, - O: AddMuteOperationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.ScanMuteOperations - */ - scanMuteOperations: { - name: "ScanMuteOperations", - I: ScanMuteOperationsRequest, - O: ScanMuteOperationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.AddNotifOperation - */ - addNotifOperation: { - name: "AddNotifOperation", - I: AddNotifOperationRequest, - O: AddNotifOperationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.ScanNotifOperations - */ - scanNotifOperations: { - name: "ScanNotifOperations", - I: ScanNotifOperationsRequest, - O: ScanNotifOperationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.PutOperation - */ - putOperation: { - name: "PutOperation", - I: PutOperationRequest, - O: PutOperationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.ScanOperations - */ - scanOperations: { - name: "ScanOperations", - I: ScanOperationsRequest, - O: ScanOperationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.DeleteOperationsByActorAndNamespace - */ - deleteOperationsByActorAndNamespace: { - name: "DeleteOperationsByActorAndNamespace", - I: DeleteOperationsByActorAndNamespaceRequest, - O: DeleteOperationsByActorAndNamespaceResponse, - kind: MethodKind.Unary, - }, - /** - * Ping - * - * @generated from rpc bsync.Service.Ping - */ - ping: { - name: "Ping", - I: PingRequest, - O: PingResponse, - kind: MethodKind.Unary, - }, - } -} as const; - diff --git a/packages/bsky/src/proto/bsync_pb.ts b/packages/bsky/src/proto/bsync_pb.ts deleted file mode 100644 index 550dfb51c8e..00000000000 --- a/packages/bsky/src/proto/bsync_pb.ts +++ /dev/null @@ -1,909 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file bsync.proto (package bsync, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3 } from "@bufbuild/protobuf"; - -/** - * @generated from enum bsync.Method - */ -export enum Method { - /** - * @generated from enum value: METHOD_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: METHOD_CREATE = 1; - */ - CREATE = 1, - - /** - * @generated from enum value: METHOD_UPDATE = 2; - */ - UPDATE = 2, - - /** - * @generated from enum value: METHOD_DELETE = 3; - */ - DELETE = 3, -} -// Retrieve enum metadata with: proto3.getEnumType(Method) -proto3.util.setEnumType(Method, "bsync.Method", [ - { no: 0, name: "METHOD_UNSPECIFIED" }, - { no: 1, name: "METHOD_CREATE" }, - { no: 2, name: "METHOD_UPDATE" }, - { no: 3, name: "METHOD_DELETE" }, -]); - -/** - * @generated from message bsync.MuteOperation - */ -export class MuteOperation extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: bsync.MuteOperation.Type type = 2; - */ - type = MuteOperation_Type.UNSPECIFIED; - - /** - * @generated from field: string actor_did = 3; - */ - actorDid = ""; - - /** - * @generated from field: string subject = 4; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.MuteOperation"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "type", kind: "enum", T: proto3.getEnumType(MuteOperation_Type) }, - { no: 3, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): MuteOperation { - return new MuteOperation().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): MuteOperation { - return new MuteOperation().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): MuteOperation { - return new MuteOperation().fromJsonString(jsonString, options); - } - - static equals(a: MuteOperation | PlainMessage | undefined, b: MuteOperation | PlainMessage | undefined): boolean { - return proto3.util.equals(MuteOperation, a, b); - } -} - -/** - * @generated from enum bsync.MuteOperation.Type - */ -export enum MuteOperation_Type { - /** - * @generated from enum value: TYPE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: TYPE_ADD = 1; - */ - ADD = 1, - - /** - * @generated from enum value: TYPE_REMOVE = 2; - */ - REMOVE = 2, - - /** - * @generated from enum value: TYPE_CLEAR = 3; - */ - CLEAR = 3, -} -// Retrieve enum metadata with: proto3.getEnumType(MuteOperation_Type) -proto3.util.setEnumType(MuteOperation_Type, "bsync.MuteOperation.Type", [ - { no: 0, name: "TYPE_UNSPECIFIED" }, - { no: 1, name: "TYPE_ADD" }, - { no: 2, name: "TYPE_REMOVE" }, - { no: 3, name: "TYPE_CLEAR" }, -]); - -/** - * @generated from message bsync.AddMuteOperationRequest - */ -export class AddMuteOperationRequest extends Message { - /** - * @generated from field: bsync.MuteOperation.Type type = 1; - */ - type = MuteOperation_Type.UNSPECIFIED; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: string subject = 3; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddMuteOperationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(MuteOperation_Type) }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddMuteOperationRequest { - return new AddMuteOperationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddMuteOperationRequest { - return new AddMuteOperationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddMuteOperationRequest { - return new AddMuteOperationRequest().fromJsonString(jsonString, options); - } - - static equals(a: AddMuteOperationRequest | PlainMessage | undefined, b: AddMuteOperationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(AddMuteOperationRequest, a, b); - } -} - -/** - * @generated from message bsync.AddMuteOperationResponse - */ -export class AddMuteOperationResponse extends Message { - /** - * @generated from field: bsync.MuteOperation operation = 1; - */ - operation?: MuteOperation; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddMuteOperationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operation", kind: "message", T: MuteOperation }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddMuteOperationResponse { - return new AddMuteOperationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddMuteOperationResponse { - return new AddMuteOperationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddMuteOperationResponse { - return new AddMuteOperationResponse().fromJsonString(jsonString, options); - } - - static equals(a: AddMuteOperationResponse | PlainMessage | undefined, b: AddMuteOperationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(AddMuteOperationResponse, a, b); - } -} - -/** - * @generated from message bsync.ScanMuteOperationsRequest - */ -export class ScanMuteOperationsRequest extends Message { - /** - * @generated from field: string cursor = 1; - */ - cursor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanMuteOperationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanMuteOperationsRequest { - return new ScanMuteOperationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanMuteOperationsRequest { - return new ScanMuteOperationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanMuteOperationsRequest { - return new ScanMuteOperationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ScanMuteOperationsRequest | PlainMessage | undefined, b: ScanMuteOperationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanMuteOperationsRequest, a, b); - } -} - -/** - * @generated from message bsync.ScanMuteOperationsResponse - */ -export class ScanMuteOperationsResponse extends Message { - /** - * @generated from field: repeated bsync.MuteOperation operations = 1; - */ - operations: MuteOperation[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanMuteOperationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operations", kind: "message", T: MuteOperation, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanMuteOperationsResponse { - return new ScanMuteOperationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanMuteOperationsResponse { - return new ScanMuteOperationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanMuteOperationsResponse { - return new ScanMuteOperationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ScanMuteOperationsResponse | PlainMessage | undefined, b: ScanMuteOperationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanMuteOperationsResponse, a, b); - } -} - -/** - * @generated from message bsync.NotifOperation - */ -export class NotifOperation extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: optional bool priority = 3; - */ - priority?: boolean; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.NotifOperation"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): NotifOperation { - return new NotifOperation().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): NotifOperation { - return new NotifOperation().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): NotifOperation { - return new NotifOperation().fromJsonString(jsonString, options); - } - - static equals(a: NotifOperation | PlainMessage | undefined, b: NotifOperation | PlainMessage | undefined): boolean { - return proto3.util.equals(NotifOperation, a, b); - } -} - -/** - * @generated from message bsync.AddNotifOperationRequest - */ -export class AddNotifOperationRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: optional bool priority = 2; - */ - priority?: boolean; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddNotifOperationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddNotifOperationRequest { - return new AddNotifOperationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddNotifOperationRequest { - return new AddNotifOperationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddNotifOperationRequest { - return new AddNotifOperationRequest().fromJsonString(jsonString, options); - } - - static equals(a: AddNotifOperationRequest | PlainMessage | undefined, b: AddNotifOperationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(AddNotifOperationRequest, a, b); - } -} - -/** - * @generated from message bsync.AddNotifOperationResponse - */ -export class AddNotifOperationResponse extends Message { - /** - * @generated from field: bsync.NotifOperation operation = 1; - */ - operation?: NotifOperation; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddNotifOperationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operation", kind: "message", T: NotifOperation }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddNotifOperationResponse { - return new AddNotifOperationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddNotifOperationResponse { - return new AddNotifOperationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddNotifOperationResponse { - return new AddNotifOperationResponse().fromJsonString(jsonString, options); - } - - static equals(a: AddNotifOperationResponse | PlainMessage | undefined, b: AddNotifOperationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(AddNotifOperationResponse, a, b); - } -} - -/** - * @generated from message bsync.ScanNotifOperationsRequest - */ -export class ScanNotifOperationsRequest extends Message { - /** - * @generated from field: string cursor = 1; - */ - cursor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanNotifOperationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanNotifOperationsRequest { - return new ScanNotifOperationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanNotifOperationsRequest { - return new ScanNotifOperationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanNotifOperationsRequest { - return new ScanNotifOperationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ScanNotifOperationsRequest | PlainMessage | undefined, b: ScanNotifOperationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanNotifOperationsRequest, a, b); - } -} - -/** - * @generated from message bsync.ScanNotifOperationsResponse - */ -export class ScanNotifOperationsResponse extends Message { - /** - * @generated from field: repeated bsync.NotifOperation operations = 1; - */ - operations: NotifOperation[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanNotifOperationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operations", kind: "message", T: NotifOperation, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanNotifOperationsResponse { - return new ScanNotifOperationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanNotifOperationsResponse { - return new ScanNotifOperationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanNotifOperationsResponse { - return new ScanNotifOperationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ScanNotifOperationsResponse | PlainMessage | undefined, b: ScanNotifOperationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanNotifOperationsResponse, a, b); - } -} - -/** - * @generated from message bsync.Operation - */ -export class Operation extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 3; - */ - namespace = ""; - - /** - * @generated from field: string key = 4; - */ - key = ""; - - /** - * @generated from field: bsync.Method method = 5; - */ - method = Method.UNSPECIFIED; - - /** - * @generated from field: bytes payload = 6; - */ - payload = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.Operation"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "method", kind: "enum", T: proto3.getEnumType(Method) }, - { no: 6, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Operation { - return new Operation().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Operation { - return new Operation().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Operation { - return new Operation().fromJsonString(jsonString, options); - } - - static equals(a: Operation | PlainMessage | undefined, b: Operation | PlainMessage | undefined): boolean { - return proto3.util.equals(Operation, a, b); - } -} - -/** - * @generated from message bsync.PutOperationRequest - */ -export class PutOperationRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 2; - */ - namespace = ""; - - /** - * @generated from field: string key = 3; - */ - key = ""; - - /** - * @generated from field: bsync.Method method = 4; - */ - method = Method.UNSPECIFIED; - - /** - * @generated from field: bytes payload = 5; - */ - payload = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PutOperationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "method", kind: "enum", T: proto3.getEnumType(Method) }, - { no: 5, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PutOperationRequest { - return new PutOperationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PutOperationRequest { - return new PutOperationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PutOperationRequest { - return new PutOperationRequest().fromJsonString(jsonString, options); - } - - static equals(a: PutOperationRequest | PlainMessage | undefined, b: PutOperationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PutOperationRequest, a, b); - } -} - -/** - * @generated from message bsync.PutOperationResponse - */ -export class PutOperationResponse extends Message { - /** - * @generated from field: bsync.Operation operation = 1; - */ - operation?: Operation; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PutOperationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operation", kind: "message", T: Operation }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PutOperationResponse { - return new PutOperationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PutOperationResponse { - return new PutOperationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PutOperationResponse { - return new PutOperationResponse().fromJsonString(jsonString, options); - } - - static equals(a: PutOperationResponse | PlainMessage | undefined, b: PutOperationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PutOperationResponse, a, b); - } -} - -/** - * @generated from message bsync.ScanOperationsRequest - */ -export class ScanOperationsRequest extends Message { - /** - * @generated from field: string cursor = 1; - */ - cursor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanOperationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanOperationsRequest { - return new ScanOperationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanOperationsRequest { - return new ScanOperationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanOperationsRequest { - return new ScanOperationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ScanOperationsRequest | PlainMessage | undefined, b: ScanOperationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanOperationsRequest, a, b); - } -} - -/** - * @generated from message bsync.ScanOperationsResponse - */ -export class ScanOperationsResponse extends Message { - /** - * @generated from field: repeated bsync.Operation operations = 1; - */ - operations: Operation[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanOperationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operations", kind: "message", T: Operation, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanOperationsResponse { - return new ScanOperationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanOperationsResponse { - return new ScanOperationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanOperationsResponse { - return new ScanOperationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ScanOperationsResponse | PlainMessage | undefined, b: ScanOperationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanOperationsResponse, a, b); - } -} - -/** - * @generated from message bsync.DeleteOperationsByActorAndNamespaceRequest - */ -export class DeleteOperationsByActorAndNamespaceRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 2; - */ - namespace = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.DeleteOperationsByActorAndNamespaceRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteOperationsByActorAndNamespaceRequest { - return new DeleteOperationsByActorAndNamespaceRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteOperationsByActorAndNamespaceRequest { - return new DeleteOperationsByActorAndNamespaceRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteOperationsByActorAndNamespaceRequest { - return new DeleteOperationsByActorAndNamespaceRequest().fromJsonString(jsonString, options); - } - - static equals(a: DeleteOperationsByActorAndNamespaceRequest | PlainMessage | undefined, b: DeleteOperationsByActorAndNamespaceRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteOperationsByActorAndNamespaceRequest, a, b); - } -} - -/** - * @generated from message bsync.DeleteOperationsByActorAndNamespaceResponse - */ -export class DeleteOperationsByActorAndNamespaceResponse extends Message { - /** - * @generated from field: int32 deleted_count = 1; - */ - deletedCount = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.DeleteOperationsByActorAndNamespaceResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "deleted_count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteOperationsByActorAndNamespaceResponse { - return new DeleteOperationsByActorAndNamespaceResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteOperationsByActorAndNamespaceResponse { - return new DeleteOperationsByActorAndNamespaceResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteOperationsByActorAndNamespaceResponse { - return new DeleteOperationsByActorAndNamespaceResponse().fromJsonString(jsonString, options); - } - - static equals(a: DeleteOperationsByActorAndNamespaceResponse | PlainMessage | undefined, b: DeleteOperationsByActorAndNamespaceResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteOperationsByActorAndNamespaceResponse, a, b); - } -} - -/** - * Ping - * - * @generated from message bsync.PingRequest - */ -export class PingRequest extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PingRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingRequest { - return new PingRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingRequest { - return new PingRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingRequest { - return new PingRequest().fromJsonString(jsonString, options); - } - - static equals(a: PingRequest | PlainMessage | undefined, b: PingRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PingRequest, a, b); - } -} - -/** - * @generated from message bsync.PingResponse - */ -export class PingResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PingResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingResponse { - return new PingResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingResponse { - return new PingResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingResponse { - return new PingResponse().fromJsonString(jsonString, options); - } - - static equals(a: PingResponse | PlainMessage | undefined, b: PingResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PingResponse, a, b); - } -} - diff --git a/packages/bsky/src/proto/courier_connect.ts b/packages/bsky/src/proto/courier_connect.ts deleted file mode 100644 index 144300be462..00000000000 --- a/packages/bsky/src/proto/courier_connect.ts +++ /dev/null @@ -1,62 +0,0 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" -// @generated from file courier.proto (package courier, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import { PingRequest, PingResponse, PushNotificationsRequest, PushNotificationsResponse, RegisterDeviceTokenRequest, RegisterDeviceTokenResponse, SetAgeRestrictedRequest, SetAgeRestrictedResponse, UnregisterDeviceTokenRequest, UnregisterDeviceTokenResponse } from "./courier_pb.js"; -import { MethodKind } from "@bufbuild/protobuf"; - -/** - * @generated from service courier.Service - */ -export const Service = { - typeName: "courier.Service", - methods: { - /** - * @generated from rpc courier.Service.Ping - */ - ping: { - name: "Ping", - I: PingRequest, - O: PingResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc courier.Service.PushNotifications - */ - pushNotifications: { - name: "PushNotifications", - I: PushNotificationsRequest, - O: PushNotificationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc courier.Service.RegisterDeviceToken - */ - registerDeviceToken: { - name: "RegisterDeviceToken", - I: RegisterDeviceTokenRequest, - O: RegisterDeviceTokenResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc courier.Service.UnregisterDeviceToken - */ - unregisterDeviceToken: { - name: "UnregisterDeviceToken", - I: UnregisterDeviceTokenRequest, - O: UnregisterDeviceTokenResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc courier.Service.SetAgeRestricted - */ - setAgeRestricted: { - name: "SetAgeRestricted", - I: SetAgeRestrictedRequest, - O: SetAgeRestrictedResponse, - kind: MethodKind.Unary, - }, - } -} as const; - diff --git a/packages/bsky/src/proto/courier_pb.ts b/packages/bsky/src/proto/courier_pb.ts deleted file mode 100644 index 200c4a782ea..00000000000 --- a/packages/bsky/src/proto/courier_pb.ts +++ /dev/null @@ -1,517 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file courier.proto (package courier, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3, Struct, Timestamp } from "@bufbuild/protobuf"; - -/** - * @generated from enum courier.AppPlatform - */ -export enum AppPlatform { - /** - * @generated from enum value: APP_PLATFORM_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: APP_PLATFORM_IOS = 1; - */ - IOS = 1, - - /** - * @generated from enum value: APP_PLATFORM_ANDROID = 2; - */ - ANDROID = 2, - - /** - * @generated from enum value: APP_PLATFORM_WEB = 3; - */ - WEB = 3, -} -// Retrieve enum metadata with: proto3.getEnumType(AppPlatform) -proto3.util.setEnumType(AppPlatform, "courier.AppPlatform", [ - { no: 0, name: "APP_PLATFORM_UNSPECIFIED" }, - { no: 1, name: "APP_PLATFORM_IOS" }, - { no: 2, name: "APP_PLATFORM_ANDROID" }, - { no: 3, name: "APP_PLATFORM_WEB" }, -]); - -/** - * Ping - * - * @generated from message courier.PingRequest - */ -export class PingRequest extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.PingRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingRequest { - return new PingRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingRequest { - return new PingRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingRequest { - return new PingRequest().fromJsonString(jsonString, options); - } - - static equals(a: PingRequest | PlainMessage | undefined, b: PingRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PingRequest, a, b); - } -} - -/** - * @generated from message courier.PingResponse - */ -export class PingResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.PingResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingResponse { - return new PingResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingResponse { - return new PingResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingResponse { - return new PingResponse().fromJsonString(jsonString, options); - } - - static equals(a: PingResponse | PlainMessage | undefined, b: PingResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PingResponse, a, b); - } -} - -/** - * @generated from message courier.Notification - */ -export class Notification extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: string recipient_did = 2; - */ - recipientDid = ""; - - /** - * @generated from field: string title = 3; - */ - title = ""; - - /** - * @generated from field: string message = 4; - */ - message = ""; - - /** - * @generated from field: string collapse_key = 5; - */ - collapseKey = ""; - - /** - * @generated from field: bool always_deliver = 6; - */ - alwaysDeliver = false; - - /** - * @generated from field: google.protobuf.Timestamp timestamp = 7; - */ - timestamp?: Timestamp; - - /** - * @generated from field: google.protobuf.Struct additional = 8; - */ - additional?: Struct; - - /** - * @generated from field: bool client_controlled = 9; - */ - clientControlled = false; - - /** - * Maps to iOS's `thread-id`: https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification. - * - * @generated from field: string thread_id = 10; - */ - threadId = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.Notification"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "recipient_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "title", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "message", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "collapse_key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 6, name: "always_deliver", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 7, name: "timestamp", kind: "message", T: Timestamp }, - { no: 8, name: "additional", kind: "message", T: Struct }, - { no: 9, name: "client_controlled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 10, name: "thread_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Notification { - return new Notification().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Notification { - return new Notification().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Notification { - return new Notification().fromJsonString(jsonString, options); - } - - static equals(a: Notification | PlainMessage | undefined, b: Notification | PlainMessage | undefined): boolean { - return proto3.util.equals(Notification, a, b); - } -} - -/** - * @generated from message courier.PushNotificationsRequest - */ -export class PushNotificationsRequest extends Message { - /** - * @generated from field: repeated courier.Notification notifications = 1; - */ - notifications: Notification[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.PushNotificationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "notifications", kind: "message", T: Notification, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PushNotificationsRequest { - return new PushNotificationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PushNotificationsRequest { - return new PushNotificationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PushNotificationsRequest { - return new PushNotificationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: PushNotificationsRequest | PlainMessage | undefined, b: PushNotificationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PushNotificationsRequest, a, b); - } -} - -/** - * @generated from message courier.PushNotificationsResponse - */ -export class PushNotificationsResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.PushNotificationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PushNotificationsResponse { - return new PushNotificationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PushNotificationsResponse { - return new PushNotificationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PushNotificationsResponse { - return new PushNotificationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: PushNotificationsResponse | PlainMessage | undefined, b: PushNotificationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PushNotificationsResponse, a, b); - } -} - -/** - * @generated from message courier.RegisterDeviceTokenRequest - */ -export class RegisterDeviceTokenRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string token = 2; - */ - token = ""; - - /** - * @generated from field: string app_id = 3; - */ - appId = ""; - - /** - * @generated from field: courier.AppPlatform platform = 4; - */ - platform = AppPlatform.UNSPECIFIED; - - /** - * @generated from field: bool age_restricted = 5; - */ - ageRestricted = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.RegisterDeviceTokenRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "app_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "platform", kind: "enum", T: proto3.getEnumType(AppPlatform) }, - { no: 5, name: "age_restricted", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RegisterDeviceTokenRequest { - return new RegisterDeviceTokenRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RegisterDeviceTokenRequest { - return new RegisterDeviceTokenRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RegisterDeviceTokenRequest { - return new RegisterDeviceTokenRequest().fromJsonString(jsonString, options); - } - - static equals(a: RegisterDeviceTokenRequest | PlainMessage | undefined, b: RegisterDeviceTokenRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(RegisterDeviceTokenRequest, a, b); - } -} - -/** - * @generated from message courier.RegisterDeviceTokenResponse - */ -export class RegisterDeviceTokenResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.RegisterDeviceTokenResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RegisterDeviceTokenResponse { - return new RegisterDeviceTokenResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RegisterDeviceTokenResponse { - return new RegisterDeviceTokenResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RegisterDeviceTokenResponse { - return new RegisterDeviceTokenResponse().fromJsonString(jsonString, options); - } - - static equals(a: RegisterDeviceTokenResponse | PlainMessage | undefined, b: RegisterDeviceTokenResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(RegisterDeviceTokenResponse, a, b); - } -} - -/** - * @generated from message courier.UnregisterDeviceTokenRequest - */ -export class UnregisterDeviceTokenRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: string token = 2; - */ - token = ""; - - /** - * @generated from field: string app_id = 3; - */ - appId = ""; - - /** - * @generated from field: courier.AppPlatform platform = 4; - */ - platform = AppPlatform.UNSPECIFIED; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.UnregisterDeviceTokenRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "app_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "platform", kind: "enum", T: proto3.getEnumType(AppPlatform) }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UnregisterDeviceTokenRequest { - return new UnregisterDeviceTokenRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UnregisterDeviceTokenRequest { - return new UnregisterDeviceTokenRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UnregisterDeviceTokenRequest { - return new UnregisterDeviceTokenRequest().fromJsonString(jsonString, options); - } - - static equals(a: UnregisterDeviceTokenRequest | PlainMessage | undefined, b: UnregisterDeviceTokenRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(UnregisterDeviceTokenRequest, a, b); - } -} - -/** - * @generated from message courier.UnregisterDeviceTokenResponse - */ -export class UnregisterDeviceTokenResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.UnregisterDeviceTokenResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): UnregisterDeviceTokenResponse { - return new UnregisterDeviceTokenResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): UnregisterDeviceTokenResponse { - return new UnregisterDeviceTokenResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): UnregisterDeviceTokenResponse { - return new UnregisterDeviceTokenResponse().fromJsonString(jsonString, options); - } - - static equals(a: UnregisterDeviceTokenResponse | PlainMessage | undefined, b: UnregisterDeviceTokenResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(UnregisterDeviceTokenResponse, a, b); - } -} - -/** - * @generated from message courier.SetAgeRestrictedRequest - */ -export class SetAgeRestrictedRequest extends Message { - /** - * @generated from field: string did = 1; - */ - did = ""; - - /** - * @generated from field: bool age_restricted = 2; - */ - ageRestricted = false; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.SetAgeRestrictedRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "age_restricted", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SetAgeRestrictedRequest { - return new SetAgeRestrictedRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SetAgeRestrictedRequest { - return new SetAgeRestrictedRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SetAgeRestrictedRequest { - return new SetAgeRestrictedRequest().fromJsonString(jsonString, options); - } - - static equals(a: SetAgeRestrictedRequest | PlainMessage | undefined, b: SetAgeRestrictedRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(SetAgeRestrictedRequest, a, b); - } -} - -/** - * @generated from message courier.SetAgeRestrictedResponse - */ -export class SetAgeRestrictedResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "courier.SetAgeRestrictedResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SetAgeRestrictedResponse { - return new SetAgeRestrictedResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SetAgeRestrictedResponse { - return new SetAgeRestrictedResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SetAgeRestrictedResponse { - return new SetAgeRestrictedResponse().fromJsonString(jsonString, options); - } - - static equals(a: SetAgeRestrictedResponse | PlainMessage | undefined, b: SetAgeRestrictedResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(SetAgeRestrictedResponse, a, b); - } -} - diff --git a/packages/bsky/src/proto/rolodex_connect.ts b/packages/bsky/src/proto/rolodex_connect.ts deleted file mode 100644 index 6e967afd4c1..00000000000 --- a/packages/bsky/src/proto/rolodex_connect.ts +++ /dev/null @@ -1,89 +0,0 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" -// @generated from file rolodex.proto (package rolodex, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import { DismissMatchRequest, DismissMatchResponse, GetMatchesRequest, GetMatchesResponse, GetSyncStatusRequest, GetSyncStatusResponse, ImportContactsRequest, ImportContactsResponse, PingRequest, PingResponse, RemoveDataRequest, RemoveDataResponse, StartPhoneVerificationRequest, StartPhoneVerificationResponse, VerifyPhoneRequest, VerifyPhoneResponse } from "./rolodex_pb.js"; -import { MethodKind } from "@bufbuild/protobuf"; - -/** - * @generated from service rolodex.RolodexService - */ -export const RolodexService = { - typeName: "rolodex.RolodexService", - methods: { - /** - * @generated from rpc rolodex.RolodexService.Ping - */ - ping: { - name: "Ping", - I: PingRequest, - O: PingResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.GetSyncStatus - */ - getSyncStatus: { - name: "GetSyncStatus", - I: GetSyncStatusRequest, - O: GetSyncStatusResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.StartPhoneVerification - */ - startPhoneVerification: { - name: "StartPhoneVerification", - I: StartPhoneVerificationRequest, - O: StartPhoneVerificationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.VerifyPhone - */ - verifyPhone: { - name: "VerifyPhone", - I: VerifyPhoneRequest, - O: VerifyPhoneResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.ImportContacts - */ - importContacts: { - name: "ImportContacts", - I: ImportContactsRequest, - O: ImportContactsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.GetMatches - */ - getMatches: { - name: "GetMatches", - I: GetMatchesRequest, - O: GetMatchesResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.DismissMatch - */ - dismissMatch: { - name: "DismissMatch", - I: DismissMatchRequest, - O: DismissMatchResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc rolodex.RolodexService.RemoveData - */ - removeData: { - name: "RemoveData", - I: RemoveDataRequest, - O: RemoveDataResponse, - kind: MethodKind.Unary, - }, - } -} as const; - diff --git a/packages/bsky/src/proto/rolodex_pb.ts b/packages/bsky/src/proto/rolodex_pb.ts deleted file mode 100644 index 8c1cf9198e4..00000000000 --- a/packages/bsky/src/proto/rolodex_pb.ts +++ /dev/null @@ -1,746 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file rolodex.proto (package rolodex, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3, Timestamp } from "@bufbuild/protobuf"; - -/** - * Ping - * - * @generated from message rolodex.PingRequest - */ -export class PingRequest extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.PingRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingRequest { - return new PingRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingRequest { - return new PingRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingRequest { - return new PingRequest().fromJsonString(jsonString, options); - } - - static equals(a: PingRequest | PlainMessage | undefined, b: PingRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PingRequest, a, b); - } -} - -/** - * @generated from message rolodex.PingResponse - */ -export class PingResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.PingResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingResponse { - return new PingResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingResponse { - return new PingResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingResponse { - return new PingResponse().fromJsonString(jsonString, options); - } - - static equals(a: PingResponse | PlainMessage | undefined, b: PingResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PingResponse, a, b); - } -} - -/** - * GetSyncStatus - * - * @generated from message rolodex.GetSyncStatusRequest - */ -export class GetSyncStatusRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.GetSyncStatusRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSyncStatusRequest { - return new GetSyncStatusRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSyncStatusRequest { - return new GetSyncStatusRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSyncStatusRequest { - return new GetSyncStatusRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetSyncStatusRequest | PlainMessage | undefined, b: GetSyncStatusRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSyncStatusRequest, a, b); - } -} - -/** - * @generated from message rolodex.SyncStatus - */ -export class SyncStatus extends Message { - /** - * @generated from field: google.protobuf.Timestamp synced_at = 1; - */ - syncedAt?: Timestamp; - - /** - * @generated from field: int32 matches_count = 2; - */ - matchesCount = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.SyncStatus"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "synced_at", kind: "message", T: Timestamp }, - { no: 2, name: "matches_count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): SyncStatus { - return new SyncStatus().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): SyncStatus { - return new SyncStatus().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): SyncStatus { - return new SyncStatus().fromJsonString(jsonString, options); - } - - static equals(a: SyncStatus | PlainMessage | undefined, b: SyncStatus | PlainMessage | undefined): boolean { - return proto3.util.equals(SyncStatus, a, b); - } -} - -/** - * @generated from message rolodex.GetSyncStatusResponse - */ -export class GetSyncStatusResponse extends Message { - /** - * @generated from field: rolodex.SyncStatus status = 1; - */ - status?: SyncStatus; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.GetSyncStatusResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "status", kind: "message", T: SyncStatus }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetSyncStatusResponse { - return new GetSyncStatusResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetSyncStatusResponse { - return new GetSyncStatusResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetSyncStatusResponse { - return new GetSyncStatusResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetSyncStatusResponse | PlainMessage | undefined, b: GetSyncStatusResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetSyncStatusResponse, a, b); - } -} - -/** - * StartPhoneVerification - * - * @generated from message rolodex.StartPhoneVerificationRequest - */ -export class StartPhoneVerificationRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - /** - * @generated from field: string phone = 2; - */ - phone = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.StartPhoneVerificationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "phone", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): StartPhoneVerificationRequest { - return new StartPhoneVerificationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): StartPhoneVerificationRequest { - return new StartPhoneVerificationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): StartPhoneVerificationRequest { - return new StartPhoneVerificationRequest().fromJsonString(jsonString, options); - } - - static equals(a: StartPhoneVerificationRequest | PlainMessage | undefined, b: StartPhoneVerificationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(StartPhoneVerificationRequest, a, b); - } -} - -/** - * @generated from message rolodex.StartPhoneVerificationResponse - */ -export class StartPhoneVerificationResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.StartPhoneVerificationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): StartPhoneVerificationResponse { - return new StartPhoneVerificationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): StartPhoneVerificationResponse { - return new StartPhoneVerificationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): StartPhoneVerificationResponse { - return new StartPhoneVerificationResponse().fromJsonString(jsonString, options); - } - - static equals(a: StartPhoneVerificationResponse | PlainMessage | undefined, b: StartPhoneVerificationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(StartPhoneVerificationResponse, a, b); - } -} - -/** - * VerifyPhone - * - * @generated from message rolodex.VerifyPhoneRequest - */ -export class VerifyPhoneRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - /** - * @generated from field: string phone = 2; - */ - phone = ""; - - /** - * @generated from field: string verification_code = 3; - */ - verificationCode = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.VerifyPhoneRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "phone", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "verification_code", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): VerifyPhoneRequest { - return new VerifyPhoneRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): VerifyPhoneRequest { - return new VerifyPhoneRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): VerifyPhoneRequest { - return new VerifyPhoneRequest().fromJsonString(jsonString, options); - } - - static equals(a: VerifyPhoneRequest | PlainMessage | undefined, b: VerifyPhoneRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(VerifyPhoneRequest, a, b); - } -} - -/** - * @generated from message rolodex.VerifyPhoneResponse - */ -export class VerifyPhoneResponse extends Message { - /** - * @generated from field: string token = 1; - */ - token = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.VerifyPhoneResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): VerifyPhoneResponse { - return new VerifyPhoneResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): VerifyPhoneResponse { - return new VerifyPhoneResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): VerifyPhoneResponse { - return new VerifyPhoneResponse().fromJsonString(jsonString, options); - } - - static equals(a: VerifyPhoneResponse | PlainMessage | undefined, b: VerifyPhoneResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(VerifyPhoneResponse, a, b); - } -} - -/** - * ImportContacts - * - * @generated from message rolodex.ImportContactsRequest - */ -export class ImportContactsRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - /** - * @generated from field: string token = 2; - */ - token = ""; - - /** - * @generated from field: repeated string contacts = 3; - */ - contacts: string[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.ImportContactsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "contacts", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ImportContactsRequest { - return new ImportContactsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ImportContactsRequest { - return new ImportContactsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ImportContactsRequest { - return new ImportContactsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ImportContactsRequest | PlainMessage | undefined, b: ImportContactsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ImportContactsRequest, a, b); - } -} - -/** - * @generated from message rolodex.ImportContactsMatch - */ -export class ImportContactsMatch extends Message { - /** - * To which index of the input contacts this contact corresponds. - * - * @generated from field: int32 input_index = 1; - */ - inputIndex = 0; - - /** - * @generated from field: string subject = 2; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.ImportContactsMatch"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "input_index", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 2, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ImportContactsMatch { - return new ImportContactsMatch().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ImportContactsMatch { - return new ImportContactsMatch().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ImportContactsMatch { - return new ImportContactsMatch().fromJsonString(jsonString, options); - } - - static equals(a: ImportContactsMatch | PlainMessage | undefined, b: ImportContactsMatch | PlainMessage | undefined): boolean { - return proto3.util.equals(ImportContactsMatch, a, b); - } -} - -/** - * @generated from message rolodex.ImportContactsResponse - */ -export class ImportContactsResponse extends Message { - /** - * @generated from field: repeated rolodex.ImportContactsMatch matches = 1; - */ - matches: ImportContactsMatch[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.ImportContactsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "matches", kind: "message", T: ImportContactsMatch, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ImportContactsResponse { - return new ImportContactsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ImportContactsResponse { - return new ImportContactsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ImportContactsResponse { - return new ImportContactsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ImportContactsResponse | PlainMessage | undefined, b: ImportContactsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ImportContactsResponse, a, b); - } -} - -/** - * GetMatches - * - * @generated from message rolodex.GetMatchesRequest - */ -export class GetMatchesRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - /** - * @generated from field: string cursor = 3; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.GetMatchesRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMatchesRequest { - return new GetMatchesRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMatchesRequest { - return new GetMatchesRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMatchesRequest { - return new GetMatchesRequest().fromJsonString(jsonString, options); - } - - static equals(a: GetMatchesRequest | PlainMessage | undefined, b: GetMatchesRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMatchesRequest, a, b); - } -} - -/** - * @generated from message rolodex.GetMatchesResponse - */ -export class GetMatchesResponse extends Message { - /** - * @generated from field: repeated string subjects = 1; - */ - subjects: string[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.GetMatchesResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "subjects", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): GetMatchesResponse { - return new GetMatchesResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): GetMatchesResponse { - return new GetMatchesResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): GetMatchesResponse { - return new GetMatchesResponse().fromJsonString(jsonString, options); - } - - static equals(a: GetMatchesResponse | PlainMessage | undefined, b: GetMatchesResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(GetMatchesResponse, a, b); - } -} - -/** - * DismissMatch - * - * @generated from message rolodex.DismissMatchRequest - */ -export class DismissMatchRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - /** - * @generated from field: string subject = 2; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.DismissMatchRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DismissMatchRequest { - return new DismissMatchRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DismissMatchRequest { - return new DismissMatchRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DismissMatchRequest { - return new DismissMatchRequest().fromJsonString(jsonString, options); - } - - static equals(a: DismissMatchRequest | PlainMessage | undefined, b: DismissMatchRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DismissMatchRequest, a, b); - } -} - -/** - * @generated from message rolodex.DismissMatchResponse - */ -export class DismissMatchResponse extends Message { - /** - * @generated from field: int32 matches_count = 1; - */ - matchesCount = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.DismissMatchResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "matches_count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DismissMatchResponse { - return new DismissMatchResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DismissMatchResponse { - return new DismissMatchResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DismissMatchResponse { - return new DismissMatchResponse().fromJsonString(jsonString, options); - } - - static equals(a: DismissMatchResponse | PlainMessage | undefined, b: DismissMatchResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DismissMatchResponse, a, b); - } -} - -/** - * RemoveData - * - * @generated from message rolodex.RemoveDataRequest - */ -export class RemoveDataRequest extends Message { - /** - * @generated from field: string actor = 1; - */ - actor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.RemoveDataRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RemoveDataRequest { - return new RemoveDataRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RemoveDataRequest { - return new RemoveDataRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RemoveDataRequest { - return new RemoveDataRequest().fromJsonString(jsonString, options); - } - - static equals(a: RemoveDataRequest | PlainMessage | undefined, b: RemoveDataRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(RemoveDataRequest, a, b); - } -} - -/** - * @generated from message rolodex.RemoveDataResponse - */ -export class RemoveDataResponse extends Message { - /** - * @generated from field: int32 contacts_count = 1; - */ - contactsCount = 0; - - /** - * @generated from field: int32 matches_count = 2; - */ - matchesCount = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "rolodex.RemoveDataResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "contacts_count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 2, name: "matches_count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RemoveDataResponse { - return new RemoveDataResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RemoveDataResponse { - return new RemoveDataResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RemoveDataResponse { - return new RemoveDataResponse().fromJsonString(jsonString, options); - } - - static equals(a: RemoveDataResponse | PlainMessage | undefined, b: RemoveDataResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(RemoveDataResponse, a, b); - } -} - diff --git a/packages/bsync/.gitignore b/packages/bsync/.gitignore new file mode 100644 index 00000000000..8f659429de6 --- /dev/null +++ b/packages/bsync/.gitignore @@ -0,0 +1,2 @@ +# @bufbuild/buf +src/proto diff --git a/packages/bsync/src/proto/bsync_connect.ts b/packages/bsync/src/proto/bsync_connect.ts deleted file mode 100644 index 86109857190..00000000000 --- a/packages/bsync/src/proto/bsync_connect.ts +++ /dev/null @@ -1,93 +0,0 @@ -// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts,import_extension=.js" -// @generated from file bsync.proto (package bsync, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import { AddMuteOperationRequest, AddMuteOperationResponse, AddNotifOperationRequest, AddNotifOperationResponse, DeleteOperationsByActorAndNamespaceRequest, DeleteOperationsByActorAndNamespaceResponse, PingRequest, PingResponse, PutOperationRequest, PutOperationResponse, ScanMuteOperationsRequest, ScanMuteOperationsResponse, ScanNotifOperationsRequest, ScanNotifOperationsResponse, ScanOperationsRequest, ScanOperationsResponse } from "./bsync_pb.js"; -import { MethodKind } from "@bufbuild/protobuf"; - -/** - * @generated from service bsync.Service - */ -export const Service = { - typeName: "bsync.Service", - methods: { - /** - * Sync - * - * @generated from rpc bsync.Service.AddMuteOperation - */ - addMuteOperation: { - name: "AddMuteOperation", - I: AddMuteOperationRequest, - O: AddMuteOperationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.ScanMuteOperations - */ - scanMuteOperations: { - name: "ScanMuteOperations", - I: ScanMuteOperationsRequest, - O: ScanMuteOperationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.AddNotifOperation - */ - addNotifOperation: { - name: "AddNotifOperation", - I: AddNotifOperationRequest, - O: AddNotifOperationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.ScanNotifOperations - */ - scanNotifOperations: { - name: "ScanNotifOperations", - I: ScanNotifOperationsRequest, - O: ScanNotifOperationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.PutOperation - */ - putOperation: { - name: "PutOperation", - I: PutOperationRequest, - O: PutOperationResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.ScanOperations - */ - scanOperations: { - name: "ScanOperations", - I: ScanOperationsRequest, - O: ScanOperationsResponse, - kind: MethodKind.Unary, - }, - /** - * @generated from rpc bsync.Service.DeleteOperationsByActorAndNamespace - */ - deleteOperationsByActorAndNamespace: { - name: "DeleteOperationsByActorAndNamespace", - I: DeleteOperationsByActorAndNamespaceRequest, - O: DeleteOperationsByActorAndNamespaceResponse, - kind: MethodKind.Unary, - }, - /** - * Ping - * - * @generated from rpc bsync.Service.Ping - */ - ping: { - name: "Ping", - I: PingRequest, - O: PingResponse, - kind: MethodKind.Unary, - }, - } -} as const; - diff --git a/packages/bsync/src/proto/bsync_pb.ts b/packages/bsync/src/proto/bsync_pb.ts deleted file mode 100644 index 550dfb51c8e..00000000000 --- a/packages/bsync/src/proto/bsync_pb.ts +++ /dev/null @@ -1,909 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file bsync.proto (package bsync, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3 } from "@bufbuild/protobuf"; - -/** - * @generated from enum bsync.Method - */ -export enum Method { - /** - * @generated from enum value: METHOD_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: METHOD_CREATE = 1; - */ - CREATE = 1, - - /** - * @generated from enum value: METHOD_UPDATE = 2; - */ - UPDATE = 2, - - /** - * @generated from enum value: METHOD_DELETE = 3; - */ - DELETE = 3, -} -// Retrieve enum metadata with: proto3.getEnumType(Method) -proto3.util.setEnumType(Method, "bsync.Method", [ - { no: 0, name: "METHOD_UNSPECIFIED" }, - { no: 1, name: "METHOD_CREATE" }, - { no: 2, name: "METHOD_UPDATE" }, - { no: 3, name: "METHOD_DELETE" }, -]); - -/** - * @generated from message bsync.MuteOperation - */ -export class MuteOperation extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: bsync.MuteOperation.Type type = 2; - */ - type = MuteOperation_Type.UNSPECIFIED; - - /** - * @generated from field: string actor_did = 3; - */ - actorDid = ""; - - /** - * @generated from field: string subject = 4; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.MuteOperation"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "type", kind: "enum", T: proto3.getEnumType(MuteOperation_Type) }, - { no: 3, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): MuteOperation { - return new MuteOperation().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): MuteOperation { - return new MuteOperation().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): MuteOperation { - return new MuteOperation().fromJsonString(jsonString, options); - } - - static equals(a: MuteOperation | PlainMessage | undefined, b: MuteOperation | PlainMessage | undefined): boolean { - return proto3.util.equals(MuteOperation, a, b); - } -} - -/** - * @generated from enum bsync.MuteOperation.Type - */ -export enum MuteOperation_Type { - /** - * @generated from enum value: TYPE_UNSPECIFIED = 0; - */ - UNSPECIFIED = 0, - - /** - * @generated from enum value: TYPE_ADD = 1; - */ - ADD = 1, - - /** - * @generated from enum value: TYPE_REMOVE = 2; - */ - REMOVE = 2, - - /** - * @generated from enum value: TYPE_CLEAR = 3; - */ - CLEAR = 3, -} -// Retrieve enum metadata with: proto3.getEnumType(MuteOperation_Type) -proto3.util.setEnumType(MuteOperation_Type, "bsync.MuteOperation.Type", [ - { no: 0, name: "TYPE_UNSPECIFIED" }, - { no: 1, name: "TYPE_ADD" }, - { no: 2, name: "TYPE_REMOVE" }, - { no: 3, name: "TYPE_CLEAR" }, -]); - -/** - * @generated from message bsync.AddMuteOperationRequest - */ -export class AddMuteOperationRequest extends Message { - /** - * @generated from field: bsync.MuteOperation.Type type = 1; - */ - type = MuteOperation_Type.UNSPECIFIED; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: string subject = 3; - */ - subject = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddMuteOperationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "type", kind: "enum", T: proto3.getEnumType(MuteOperation_Type) }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "subject", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddMuteOperationRequest { - return new AddMuteOperationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddMuteOperationRequest { - return new AddMuteOperationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddMuteOperationRequest { - return new AddMuteOperationRequest().fromJsonString(jsonString, options); - } - - static equals(a: AddMuteOperationRequest | PlainMessage | undefined, b: AddMuteOperationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(AddMuteOperationRequest, a, b); - } -} - -/** - * @generated from message bsync.AddMuteOperationResponse - */ -export class AddMuteOperationResponse extends Message { - /** - * @generated from field: bsync.MuteOperation operation = 1; - */ - operation?: MuteOperation; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddMuteOperationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operation", kind: "message", T: MuteOperation }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddMuteOperationResponse { - return new AddMuteOperationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddMuteOperationResponse { - return new AddMuteOperationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddMuteOperationResponse { - return new AddMuteOperationResponse().fromJsonString(jsonString, options); - } - - static equals(a: AddMuteOperationResponse | PlainMessage | undefined, b: AddMuteOperationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(AddMuteOperationResponse, a, b); - } -} - -/** - * @generated from message bsync.ScanMuteOperationsRequest - */ -export class ScanMuteOperationsRequest extends Message { - /** - * @generated from field: string cursor = 1; - */ - cursor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanMuteOperationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanMuteOperationsRequest { - return new ScanMuteOperationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanMuteOperationsRequest { - return new ScanMuteOperationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanMuteOperationsRequest { - return new ScanMuteOperationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ScanMuteOperationsRequest | PlainMessage | undefined, b: ScanMuteOperationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanMuteOperationsRequest, a, b); - } -} - -/** - * @generated from message bsync.ScanMuteOperationsResponse - */ -export class ScanMuteOperationsResponse extends Message { - /** - * @generated from field: repeated bsync.MuteOperation operations = 1; - */ - operations: MuteOperation[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanMuteOperationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operations", kind: "message", T: MuteOperation, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanMuteOperationsResponse { - return new ScanMuteOperationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanMuteOperationsResponse { - return new ScanMuteOperationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanMuteOperationsResponse { - return new ScanMuteOperationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ScanMuteOperationsResponse | PlainMessage | undefined, b: ScanMuteOperationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanMuteOperationsResponse, a, b); - } -} - -/** - * @generated from message bsync.NotifOperation - */ -export class NotifOperation extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: optional bool priority = 3; - */ - priority?: boolean; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.NotifOperation"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): NotifOperation { - return new NotifOperation().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): NotifOperation { - return new NotifOperation().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): NotifOperation { - return new NotifOperation().fromJsonString(jsonString, options); - } - - static equals(a: NotifOperation | PlainMessage | undefined, b: NotifOperation | PlainMessage | undefined): boolean { - return proto3.util.equals(NotifOperation, a, b); - } -} - -/** - * @generated from message bsync.AddNotifOperationRequest - */ -export class AddNotifOperationRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: optional bool priority = 2; - */ - priority?: boolean; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddNotifOperationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "priority", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddNotifOperationRequest { - return new AddNotifOperationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddNotifOperationRequest { - return new AddNotifOperationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddNotifOperationRequest { - return new AddNotifOperationRequest().fromJsonString(jsonString, options); - } - - static equals(a: AddNotifOperationRequest | PlainMessage | undefined, b: AddNotifOperationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(AddNotifOperationRequest, a, b); - } -} - -/** - * @generated from message bsync.AddNotifOperationResponse - */ -export class AddNotifOperationResponse extends Message { - /** - * @generated from field: bsync.NotifOperation operation = 1; - */ - operation?: NotifOperation; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.AddNotifOperationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operation", kind: "message", T: NotifOperation }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AddNotifOperationResponse { - return new AddNotifOperationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AddNotifOperationResponse { - return new AddNotifOperationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AddNotifOperationResponse { - return new AddNotifOperationResponse().fromJsonString(jsonString, options); - } - - static equals(a: AddNotifOperationResponse | PlainMessage | undefined, b: AddNotifOperationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(AddNotifOperationResponse, a, b); - } -} - -/** - * @generated from message bsync.ScanNotifOperationsRequest - */ -export class ScanNotifOperationsRequest extends Message { - /** - * @generated from field: string cursor = 1; - */ - cursor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanNotifOperationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanNotifOperationsRequest { - return new ScanNotifOperationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanNotifOperationsRequest { - return new ScanNotifOperationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanNotifOperationsRequest { - return new ScanNotifOperationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ScanNotifOperationsRequest | PlainMessage | undefined, b: ScanNotifOperationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanNotifOperationsRequest, a, b); - } -} - -/** - * @generated from message bsync.ScanNotifOperationsResponse - */ -export class ScanNotifOperationsResponse extends Message { - /** - * @generated from field: repeated bsync.NotifOperation operations = 1; - */ - operations: NotifOperation[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanNotifOperationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operations", kind: "message", T: NotifOperation, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanNotifOperationsResponse { - return new ScanNotifOperationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanNotifOperationsResponse { - return new ScanNotifOperationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanNotifOperationsResponse { - return new ScanNotifOperationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ScanNotifOperationsResponse | PlainMessage | undefined, b: ScanNotifOperationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanNotifOperationsResponse, a, b); - } -} - -/** - * @generated from message bsync.Operation - */ -export class Operation extends Message { - /** - * @generated from field: string id = 1; - */ - id = ""; - - /** - * @generated from field: string actor_did = 2; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 3; - */ - namespace = ""; - - /** - * @generated from field: string key = 4; - */ - key = ""; - - /** - * @generated from field: bsync.Method method = 5; - */ - method = Method.UNSPECIFIED; - - /** - * @generated from field: bytes payload = 6; - */ - payload = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.Operation"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 5, name: "method", kind: "enum", T: proto3.getEnumType(Method) }, - { no: 6, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Operation { - return new Operation().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Operation { - return new Operation().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Operation { - return new Operation().fromJsonString(jsonString, options); - } - - static equals(a: Operation | PlainMessage | undefined, b: Operation | PlainMessage | undefined): boolean { - return proto3.util.equals(Operation, a, b); - } -} - -/** - * @generated from message bsync.PutOperationRequest - */ -export class PutOperationRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 2; - */ - namespace = ""; - - /** - * @generated from field: string key = 3; - */ - key = ""; - - /** - * @generated from field: bsync.Method method = 4; - */ - method = Method.UNSPECIFIED; - - /** - * @generated from field: bytes payload = 5; - */ - payload = new Uint8Array(0); - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PutOperationRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "method", kind: "enum", T: proto3.getEnumType(Method) }, - { no: 5, name: "payload", kind: "scalar", T: 12 /* ScalarType.BYTES */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PutOperationRequest { - return new PutOperationRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PutOperationRequest { - return new PutOperationRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PutOperationRequest { - return new PutOperationRequest().fromJsonString(jsonString, options); - } - - static equals(a: PutOperationRequest | PlainMessage | undefined, b: PutOperationRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PutOperationRequest, a, b); - } -} - -/** - * @generated from message bsync.PutOperationResponse - */ -export class PutOperationResponse extends Message { - /** - * @generated from field: bsync.Operation operation = 1; - */ - operation?: Operation; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PutOperationResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operation", kind: "message", T: Operation }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PutOperationResponse { - return new PutOperationResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PutOperationResponse { - return new PutOperationResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PutOperationResponse { - return new PutOperationResponse().fromJsonString(jsonString, options); - } - - static equals(a: PutOperationResponse | PlainMessage | undefined, b: PutOperationResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PutOperationResponse, a, b); - } -} - -/** - * @generated from message bsync.ScanOperationsRequest - */ -export class ScanOperationsRequest extends Message { - /** - * @generated from field: string cursor = 1; - */ - cursor = ""; - - /** - * @generated from field: int32 limit = 2; - */ - limit = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanOperationsRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "limit", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanOperationsRequest { - return new ScanOperationsRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanOperationsRequest { - return new ScanOperationsRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanOperationsRequest { - return new ScanOperationsRequest().fromJsonString(jsonString, options); - } - - static equals(a: ScanOperationsRequest | PlainMessage | undefined, b: ScanOperationsRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanOperationsRequest, a, b); - } -} - -/** - * @generated from message bsync.ScanOperationsResponse - */ -export class ScanOperationsResponse extends Message { - /** - * @generated from field: repeated bsync.Operation operations = 1; - */ - operations: Operation[] = []; - - /** - * @generated from field: string cursor = 2; - */ - cursor = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.ScanOperationsResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "operations", kind: "message", T: Operation, repeated: true }, - { no: 2, name: "cursor", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ScanOperationsResponse { - return new ScanOperationsResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ScanOperationsResponse { - return new ScanOperationsResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ScanOperationsResponse { - return new ScanOperationsResponse().fromJsonString(jsonString, options); - } - - static equals(a: ScanOperationsResponse | PlainMessage | undefined, b: ScanOperationsResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(ScanOperationsResponse, a, b); - } -} - -/** - * @generated from message bsync.DeleteOperationsByActorAndNamespaceRequest - */ -export class DeleteOperationsByActorAndNamespaceRequest extends Message { - /** - * @generated from field: string actor_did = 1; - */ - actorDid = ""; - - /** - * @generated from field: string namespace = 2; - */ - namespace = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.DeleteOperationsByActorAndNamespaceRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "actor_did", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "namespace", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteOperationsByActorAndNamespaceRequest { - return new DeleteOperationsByActorAndNamespaceRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteOperationsByActorAndNamespaceRequest { - return new DeleteOperationsByActorAndNamespaceRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteOperationsByActorAndNamespaceRequest { - return new DeleteOperationsByActorAndNamespaceRequest().fromJsonString(jsonString, options); - } - - static equals(a: DeleteOperationsByActorAndNamespaceRequest | PlainMessage | undefined, b: DeleteOperationsByActorAndNamespaceRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteOperationsByActorAndNamespaceRequest, a, b); - } -} - -/** - * @generated from message bsync.DeleteOperationsByActorAndNamespaceResponse - */ -export class DeleteOperationsByActorAndNamespaceResponse extends Message { - /** - * @generated from field: int32 deleted_count = 1; - */ - deletedCount = 0; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.DeleteOperationsByActorAndNamespaceResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "deleted_count", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): DeleteOperationsByActorAndNamespaceResponse { - return new DeleteOperationsByActorAndNamespaceResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): DeleteOperationsByActorAndNamespaceResponse { - return new DeleteOperationsByActorAndNamespaceResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): DeleteOperationsByActorAndNamespaceResponse { - return new DeleteOperationsByActorAndNamespaceResponse().fromJsonString(jsonString, options); - } - - static equals(a: DeleteOperationsByActorAndNamespaceResponse | PlainMessage | undefined, b: DeleteOperationsByActorAndNamespaceResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(DeleteOperationsByActorAndNamespaceResponse, a, b); - } -} - -/** - * Ping - * - * @generated from message bsync.PingRequest - */ -export class PingRequest extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PingRequest"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingRequest { - return new PingRequest().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingRequest { - return new PingRequest().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingRequest { - return new PingRequest().fromJsonString(jsonString, options); - } - - static equals(a: PingRequest | PlainMessage | undefined, b: PingRequest | PlainMessage | undefined): boolean { - return proto3.util.equals(PingRequest, a, b); - } -} - -/** - * @generated from message bsync.PingResponse - */ -export class PingResponse extends Message { - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "bsync.PingResponse"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): PingResponse { - return new PingResponse().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): PingResponse { - return new PingResponse().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): PingResponse { - return new PingResponse().fromJsonString(jsonString, options); - } - - static equals(a: PingResponse | PlainMessage | undefined, b: PingResponse | PlainMessage | undefined): boolean { - return proto3.util.equals(PingResponse, a, b); - } -} - From 3ea8e1f3704c769a215af92ef0d9d46db16ef5f6 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 20 May 2026 14:31:41 +0200 Subject: [PATCH 57/87] Un-track codegen code from "lexicon-resolver" (#4965) --- .changeset/five-apples-float.md | 5 +++ .gitattributes | 3 -- .github/workflows/repo.yaml | 7 ++- packages/lexicon-resolver/.gitignore | 2 + packages/lexicon-resolver/src/lexicons/com.ts | 5 --- .../src/lexicons/com/atproto.ts | 6 --- .../src/lexicons/com/atproto/lexicon.ts | 5 --- .../com/atproto/lexicon/schema.defs.ts | 43 ------------------- .../lexicons/com/atproto/lexicon/schema.ts | 6 --- .../src/lexicons/com/atproto/sync.ts | 5 --- .../com/atproto/sync/getRecord.defs.ts | 39 ----------------- .../lexicons/com/atproto/sync/getRecord.ts | 6 --- .../lexicon-resolver/src/lexicons/index.ts | 5 --- 13 files changed, 10 insertions(+), 127 deletions(-) create mode 100644 .changeset/five-apples-float.md create mode 100644 packages/lexicon-resolver/.gitignore delete mode 100644 packages/lexicon-resolver/src/lexicons/com.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto/lexicon.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.defs.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto/sync.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.defs.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.ts delete mode 100644 packages/lexicon-resolver/src/lexicons/index.ts diff --git a/.changeset/five-apples-float.md b/.changeset/five-apples-float.md new file mode 100644 index 00000000000..2ffdc4dc315 --- /dev/null +++ b/.changeset/five-apples-float.md @@ -0,0 +1,5 @@ +--- +'@atproto/lexicon-resolver': patch +--- + +Remove generated code from git diff --git a/.gitattributes b/.gitattributes index 884636f9349..7196697e8a1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,8 +2,5 @@ packages/api/src/client/** linguist-generated=true packages/ozone/src/lexicon/** linguist-generated=true -# @atproto/lex -packages/lexicon-resolver/src/lexicons/** linguist-generated=true - # i18n packages/oauth/oauth-provider-ui/src/locales/**/messages.po linguist-generated=true diff --git a/.github/workflows/repo.yaml b/.github/workflows/repo.yaml index 5575fb6ff49..123ae8a8795 100644 --- a/.github/workflows/repo.yaml +++ b/.github/workflows/repo.yaml @@ -25,20 +25,19 @@ jobs: - run: pnpm build - uses: actions/upload-artifact@v4 with: + # Preserve the result of codegen and build steps. name: dist retention-days: 2 path: | packages/*/dist packages/*/*/dist packages/*/src/proto + packages/*/src/lexicons packages/lex/*/src/lexicons packages/lex/*/tests/lexicons - packages/oauth/oauth-client-browser-example/src/lexicons + packages/oauth/*/src/lexicons packages/oauth/*/src/locales/*/messages.ts packages/api/src/moderation/const/labels.ts - packages/bsky/src/lexicons - packages/pds/src/lexicons - packages/sync/src/lexicons changeset: name: Changeset diff --git a/packages/lexicon-resolver/.gitignore b/packages/lexicon-resolver/.gitignore new file mode 100644 index 00000000000..8b47a029b71 --- /dev/null +++ b/packages/lexicon-resolver/.gitignore @@ -0,0 +1,2 @@ +# @atproto/lex-cli +src/lexicons diff --git a/packages/lexicon-resolver/src/lexicons/com.ts b/packages/lexicon-resolver/src/lexicons/com.ts deleted file mode 100644 index 6b6c956bdcc..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * as atproto from './com/atproto.js' diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto.ts b/packages/lexicon-resolver/src/lexicons/com/atproto.ts deleted file mode 100644 index 33a0777d5ef..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * as lexicon from './atproto/lexicon.js' -export * as sync from './atproto/sync.js' diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon.ts b/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon.ts deleted file mode 100644 index 0e0c91f1718..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * as schema from './lexicon/schema.js' diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.defs.ts b/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.defs.ts deleted file mode 100644 index 4d47b30b717..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.defs.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -import { l } from '@atproto/lex' - -const $nsid = 'com.atproto.lexicon.schema' - -export { $nsid } - -/** Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc). */ -type Main = { - $type: 'com.atproto.lexicon.schema' - - /** - * Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system. - */ - lexicon: number -} - -export type { Main } - -/** Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc). */ -const main = l.record<'nsid', Main>( - 'nsid', - $nsid, - l.object({ lexicon: l.integer() }), -) - -export { main } - -export const $isTypeOf = /*#__PURE__*/ main.isTypeOf.bind(main), - $build = /*#__PURE__*/ main.build.bind(main), - $type = /*#__PURE__*/ main.$type -export const $assert = /*#__PURE__*/ main.assert.bind(main), - $check = /*#__PURE__*/ main.check.bind(main), - $cast = /*#__PURE__*/ main.cast.bind(main), - $ifMatches = /*#__PURE__*/ main.ifMatches.bind(main), - $matches = /*#__PURE__*/ main.matches.bind(main), - $parse = /*#__PURE__*/ main.parse.bind(main), - $safeParse = /*#__PURE__*/ main.safeParse.bind(main), - $validate = /*#__PURE__*/ main.validate.bind(main), - $safeValidate = /*#__PURE__*/ main.safeValidate.bind(main) diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.ts b/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.ts deleted file mode 100644 index 291db699038..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto/lexicon/schema.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * from './schema.defs.js' -export * as $defs from './schema.defs.js' diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto/sync.ts b/packages/lexicon-resolver/src/lexicons/com/atproto/sync.ts deleted file mode 100644 index ed9d10e5634..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto/sync.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * as getRecord from './sync/getRecord.js' diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.defs.ts b/packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.defs.ts deleted file mode 100644 index a67d4b1fbc6..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.defs.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -import { l } from '@atproto/lex' - -const $nsid = 'com.atproto.sync.getRecord' - -export { $nsid } - -/** Get data blocks needed to prove the existence or non-existence of record in the current version of repo. Does not require auth. */ -const main = l.query( - $nsid, - l.params({ - did: l.string({ format: 'did' }), - collection: l.string({ format: 'nsid' }), - rkey: l.string({ format: 'record-key' }), - }), - l.payload('application/vnd.ipld.car'), - [ - 'RecordNotFound', - 'RepoNotFound', - 'RepoTakendown', - 'RepoSuspended', - 'RepoDeactivated', - ], -) -export { main } - -export type $Params = l.InferMethodParams -export type $Output = l.InferMethodOutput -export type $OutputBody = l.InferMethodOutputBody< - typeof main, - B -> - -export const $lxm = main.nsid, - $params = main.parameters, - $output = main.output diff --git a/packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.ts b/packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.ts deleted file mode 100644 index 4bda9e3cca9..00000000000 --- a/packages/lexicon-resolver/src/lexicons/com/atproto/sync/getRecord.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * from './getRecord.defs.js' -export * as $defs from './getRecord.defs.js' diff --git a/packages/lexicon-resolver/src/lexicons/index.ts b/packages/lexicon-resolver/src/lexicons/index.ts deleted file mode 100644 index 2ac75995032..00000000000 --- a/packages/lexicon-resolver/src/lexicons/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* - * THIS FILE WAS GENERATED BY "@atproto/lex". DO NOT EDIT. - */ - -export * as com from './com.js' From 53818bb1b0a67b3875f6c3ac9a079599a87426a8 Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 20 May 2026 15:08:09 +0200 Subject: [PATCH 58/87] Fix test flackyness due to seeding the database talking a long time (#4971) --- .changeset/tidy-onions-bake.md | 2 ++ packages/bsky/tests/admin/admin-auth.test.ts | 2 +- packages/bsky/tests/auth.test.ts | 2 +- packages/bsky/tests/data-plane/handle-invalidation.test.ts | 2 +- packages/bsky/tests/data-plane/indexing.test.ts | 2 +- packages/bsky/tests/data-plane/thread-mutes.test.ts | 2 +- packages/bsky/tests/views/actor-search.test.ts | 2 +- packages/bsky/tests/views/author-feed.test.ts | 2 +- packages/bsky/tests/views/follows.test.ts | 2 +- packages/bsky/tests/views/likes.test.ts | 2 +- packages/bsky/tests/views/mutes.test.ts | 2 +- packages/bsky/tests/views/quotes.test.ts | 2 +- packages/bsky/tests/views/reposts.test.ts | 2 +- packages/bsky/tests/views/verification.test.ts | 2 +- packages/lexicon-resolver/tests/lexicon.test.ts | 2 +- packages/lexicon-resolver/tests/record.test.ts | 2 +- packages/ozone/tests/repo-search.test.ts | 2 +- packages/pds/tests/moderator-auth.test.ts | 2 +- packages/pds/tests/preferences.test.ts | 2 +- packages/pds/tests/proxied/notif.test.ts | 2 +- packages/pds/tests/proxied/proxy-header.test.ts | 2 +- 21 files changed, 22 insertions(+), 20 deletions(-) create mode 100644 .changeset/tidy-onions-bake.md diff --git a/.changeset/tidy-onions-bake.md b/.changeset/tidy-onions-bake.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/tidy-onions-bake.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/bsky/tests/admin/admin-auth.test.ts b/packages/bsky/tests/admin/admin-auth.test.ts index 3e54f43920b..cc4c61699ee 100644 --- a/packages/bsky/tests/admin/admin-auth.test.ts +++ b/packages/bsky/tests/admin/admin-auth.test.ts @@ -62,7 +62,7 @@ describe('admin auth', () => { $type: 'com.atproto.admin.defs#repoRef', did: sc.dids.bob, } - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/auth.test.ts b/packages/bsky/tests/auth.test.ts index 3b988494807..3538a5e582a 100644 --- a/packages/bsky/tests/auth.test.ts +++ b/packages/bsky/tests/auth.test.ts @@ -23,7 +23,7 @@ describe('auth', () => { await network.processAll() alice = sc.dids.alice bob = sc.dids.bob - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/data-plane/handle-invalidation.test.ts b/packages/bsky/tests/data-plane/handle-invalidation.test.ts index ab53251fc4d..236a8773645 100644 --- a/packages/bsky/tests/data-plane/handle-invalidation.test.ts +++ b/packages/bsky/tests/data-plane/handle-invalidation.test.ts @@ -38,7 +38,7 @@ describe('handle invalidation', () => { } return origResolve(handle) } - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/data-plane/indexing.test.ts b/packages/bsky/tests/data-plane/indexing.test.ts index 4217f5e523f..53791d77c6c 100644 --- a/packages/bsky/tests/data-plane/indexing.test.ts +++ b/packages/bsky/tests/data-plane/indexing.test.ts @@ -37,7 +37,7 @@ describe('indexing', () => { // Data in tests is not processed from subscription await network.processAll() await network.bsky.sub.destroy() - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/data-plane/thread-mutes.test.ts b/packages/bsky/tests/data-plane/thread-mutes.test.ts index e5885959f3a..bc6757866f3 100644 --- a/packages/bsky/tests/data-plane/thread-mutes.test.ts +++ b/packages/bsky/tests/data-plane/thread-mutes.test.ts @@ -25,7 +25,7 @@ describe('thread mutes', () => { rootPost = (await sc.post(alice, 'root post')).ref replyPost = (await sc.reply(alice, rootPost, rootPost, 'first reply')).ref await network.processAll() - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/actor-search.test.ts b/packages/bsky/tests/views/actor-search.test.ts index f340ae41652..d987669e5a9 100644 --- a/packages/bsky/tests/views/actor-search.test.ts +++ b/packages/bsky/tests/views/actor-search.test.ts @@ -50,7 +50,7 @@ describe.skip('pds actor search views', () => { Object.values(sc.dids)[0], ids.AppBskyActorSearchActorsTypeahead, ) - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/author-feed.test.ts b/packages/bsky/tests/views/author-feed.test.ts index 7ed57b18e56..bcde02ca104 100644 --- a/packages/bsky/tests/views/author-feed.test.ts +++ b/packages/bsky/tests/views/author-feed.test.ts @@ -51,7 +51,7 @@ describe('pds author feed views', () => { carol = sc.dids.carol dan = sc.dids.dan eve = sc.dids.eve - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/follows.test.ts b/packages/bsky/tests/views/follows.test.ts index 6a8a019a041..09d9fb0aac9 100644 --- a/packages/bsky/tests/views/follows.test.ts +++ b/packages/bsky/tests/views/follows.test.ts @@ -25,7 +25,7 @@ describe('pds follow views', () => { await followsSeed(sc) await network.processAll() alice = sc.dids.alice - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/likes.test.ts b/packages/bsky/tests/views/likes.test.ts index 9e40e0d1ec8..a1e22af8945 100644 --- a/packages/bsky/tests/views/likes.test.ts +++ b/packages/bsky/tests/views/likes.test.ts @@ -37,7 +37,7 @@ describe('pds like views', () => { bob = sc.dids.bob carol = sc.dids.carol frankie = sc.dids.frankie - }, 20000) // @NOTE occasionally takes a long time in CI, possibly due to size of likesSeed() + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/mutes.test.ts b/packages/bsky/tests/views/mutes.test.ts index bd2098eecd0..7205d0b2d11 100644 --- a/packages/bsky/tests/views/mutes.test.ts +++ b/packages/bsky/tests/views/mutes.test.ts @@ -54,7 +54,7 @@ describe('mute views', () => { }, ) } - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/quotes.test.ts b/packages/bsky/tests/views/quotes.test.ts index 709b1e8909a..5562e6bbd5c 100644 --- a/packages/bsky/tests/views/quotes.test.ts +++ b/packages/bsky/tests/views/quotes.test.ts @@ -26,7 +26,7 @@ describe('pds quote views', () => { bob = sc.dids.bob carol = sc.dids.carol eve = sc.dids.eve - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/reposts.test.ts b/packages/bsky/tests/views/reposts.test.ts index 91cfd3ba713..82be0dab639 100644 --- a/packages/bsky/tests/views/reposts.test.ts +++ b/packages/bsky/tests/views/reposts.test.ts @@ -22,7 +22,7 @@ describe('pds repost views', () => { await network.processAll() alice = sc.dids.alice bob = sc.dids.bob - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/bsky/tests/views/verification.test.ts b/packages/bsky/tests/views/verification.test.ts index 36e794731f9..a0354dddc28 100644 --- a/packages/bsky/tests/views/verification.test.ts +++ b/packages/bsky/tests/views/verification.test.ts @@ -63,7 +63,7 @@ describe('verification views', () => { .set({ trustedVerifier: true }) .where('did', 'in', [verifier1, verifier2, verifier3]) .execute() - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/lexicon-resolver/tests/lexicon.test.ts b/packages/lexicon-resolver/tests/lexicon.test.ts index 28a27060bba..376fbd58b7d 100644 --- a/packages/lexicon-resolver/tests/lexicon.test.ts +++ b/packages/lexicon-resolver/tests/lexicon.test.ts @@ -36,7 +36,7 @@ describe('Lexicon resolution', () => { rpc: { fetch }, idResolver: network.pds.ctx.idResolver, }) - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/lexicon-resolver/tests/record.test.ts b/packages/lexicon-resolver/tests/record.test.ts index 20f98e70cef..a9e4823f19b 100644 --- a/packages/lexicon-resolver/tests/record.test.ts +++ b/packages/lexicon-resolver/tests/record.test.ts @@ -20,7 +20,7 @@ describe('Record resolution', () => { rpc: { fetch }, idResolver: network.pds.ctx.idResolver, }) - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/ozone/tests/repo-search.test.ts b/packages/ozone/tests/repo-search.test.ts index 2bbbbdde5c5..9aabb1ed6ff 100644 --- a/packages/ozone/tests/repo-search.test.ts +++ b/packages/ozone/tests/repo-search.test.ts @@ -28,7 +28,7 @@ describe('admin repo search view', () => { ids.ToolsOzoneModerationSearchRepos, ) await network.processAll() - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/pds/tests/moderator-auth.test.ts b/packages/pds/tests/moderator-auth.test.ts index a6e22dd9151..5cc94a7c3a4 100644 --- a/packages/pds/tests/moderator-auth.test.ts +++ b/packages/pds/tests/moderator-auth.test.ts @@ -68,7 +68,7 @@ describe('moderator auth', () => { $type: 'com.atproto.admin.defs#repoRef', did: sc.dids.bob, } - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/pds/tests/preferences.test.ts b/packages/pds/tests/preferences.test.ts index c0c01bdf688..122a80f88f8 100644 --- a/packages/pds/tests/preferences.test.ts +++ b/packages/pds/tests/preferences.test.ts @@ -26,7 +26,7 @@ describe('user preferences', () => { password: appPass.password, }) appPassHeaders = { authorization: `Bearer ${res.data.accessJwt}` } - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/pds/tests/proxied/notif.test.ts b/packages/pds/tests/proxied/notif.test.ts index 599b1ff0e1d..4c73205cac5 100644 --- a/packages/pds/tests/proxied/notif.test.ts +++ b/packages/pds/tests/proxied/notif.test.ts @@ -37,7 +37,7 @@ describe('notif service proxy', () => { return x }) await network.pds.ctx.idResolver.did.resolve(notifDid, true) - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await network.close() diff --git a/packages/pds/tests/proxied/proxy-header.test.ts b/packages/pds/tests/proxied/proxy-header.test.ts index 328a0ddae08..7f493116933 100644 --- a/packages/pds/tests/proxied/proxy-header.test.ts +++ b/packages/pds/tests/proxied/proxy-header.test.ts @@ -32,7 +32,7 @@ describe('proxy header', () => { alice = sc.dids.alice await network.processAll() - }) + }, 20_000) // @NOTE seeding can take a while afterAll(async () => { await proxyServer.close() From 8eb0662ac38a915c7a0c669e739fc8afc3ed7e7b Mon Sep 17 00:00:00 2001 From: Matthieu Sieben Date: Wed, 20 May 2026 15:20:55 +0200 Subject: [PATCH 59/87] Remove lex-cli generated files from git (#4968) * Remove lex-cli generated files from git * Actually make lex-cli's generated code lazily built --- .changeset/smooth-feet-taste.md | 6 + .gitattributes | 4 - .github/workflows/repo.yaml | 29 + packages/api/.gitignore | 2 +- packages/api/package.json | 5 +- packages/api/src/client/index.ts | 6422 ---- packages/api/src/client/lexicons.ts | 25832 ---------------- .../src/client/types/app/bsky/actor/defs.ts | 716 - .../types/app/bsky/actor/getPreferences.ts | 39 - .../client/types/app/bsky/actor/getProfile.ts | 39 - .../types/app/bsky/actor/getProfiles.ts | 41 - .../types/app/bsky/actor/getSuggestions.ts | 47 - .../client/types/app/bsky/actor/profile.ts | 52 - .../types/app/bsky/actor/putPreferences.ts | 39 - .../types/app/bsky/actor/searchActors.ts | 47 - .../app/bsky/actor/searchActorsTypeahead.ts | 45 - .../src/client/types/app/bsky/actor/status.ts | 46 - .../types/app/bsky/ageassurance/begin.ts | 80 - .../types/app/bsky/ageassurance/defs.ts | 303 - .../types/app/bsky/ageassurance/getConfig.ts | 36 - .../types/app/bsky/ageassurance/getState.ts | 43 - .../types/app/bsky/bookmark/createBookmark.ts | 50 - .../client/types/app/bsky/bookmark/defs.ts | 54 - .../types/app/bsky/bookmark/deleteBookmark.ts | 49 - .../types/app/bsky/bookmark/getBookmarks.ts | 43 - .../src/client/types/app/bsky/contact/defs.ts | 71 - .../types/app/bsky/contact/dismissMatch.ts | 59 - .../types/app/bsky/contact/getMatches.ts | 74 - .../types/app/bsky/contact/getSyncStatus.ts | 56 - .../types/app/bsky/contact/importContacts.ts | 86 - .../types/app/bsky/contact/removeData.ts | 56 - .../app/bsky/contact/sendNotification.ts | 44 - .../bsky/contact/startPhoneVerification.ts | 73 - .../types/app/bsky/contact/verifyPhone.ts | 85 - .../types/app/bsky/draft/createDraft.ts | 55 - .../src/client/types/app/bsky/draft/defs.ts | 212 - .../types/app/bsky/draft/deleteDraft.ts | 38 - .../client/types/app/bsky/draft/getDrafts.ts | 43 - .../types/app/bsky/draft/updateDraft.ts | 39 - .../src/client/types/app/bsky/embed/defs.ts | 32 - .../client/types/app/bsky/embed/external.ts | 85 - .../src/client/types/app/bsky/embed/images.ts | 86 - .../src/client/types/app/bsky/embed/record.ts | 146 - .../types/app/bsky/embed/recordWithMedia.ts | 59 - .../src/client/types/app/bsky/embed/video.ts | 75 - .../src/client/types/app/bsky/feed/defs.ts | 428 - .../app/bsky/feed/describeFeedGenerator.ts | 71 - .../client/types/app/bsky/feed/generator.ts | 51 - .../types/app/bsky/feed/getActorFeeds.ts | 44 - .../types/app/bsky/feed/getActorLikes.ts | 61 - .../types/app/bsky/feed/getAuthorFeed.ts | 70 - .../src/client/types/app/bsky/feed/getFeed.ts | 54 - .../types/app/bsky/feed/getFeedGenerator.ts | 46 - .../types/app/bsky/feed/getFeedGenerators.ts | 41 - .../types/app/bsky/feed/getFeedSkeleton.ts | 57 - .../client/types/app/bsky/feed/getLikes.ts | 66 - .../client/types/app/bsky/feed/getListFeed.ts | 55 - .../types/app/bsky/feed/getPostThread.ts | 61 - .../client/types/app/bsky/feed/getPosts.ts | 42 - .../client/types/app/bsky/feed/getQuotes.ts | 49 - .../types/app/bsky/feed/getRepostedBy.ts | 49 - .../types/app/bsky/feed/getSuggestedFeeds.ts | 43 - .../client/types/app/bsky/feed/getTimeline.ts | 45 - .../src/client/types/app/bsky/feed/like.ts | 40 - .../src/client/types/app/bsky/feed/post.ts | 117 - .../client/types/app/bsky/feed/postgate.ts | 58 - .../src/client/types/app/bsky/feed/repost.ts | 40 - .../client/types/app/bsky/feed/searchPosts.ts | 76 - .../types/app/bsky/feed/sendInteractions.ts | 43 - .../client/types/app/bsky/feed/threadgate.ts | 110 - .../src/client/types/app/bsky/graph/block.ts | 39 - .../src/client/types/app/bsky/graph/defs.ts | 206 - .../src/client/types/app/bsky/graph/follow.ts | 40 - .../app/bsky/graph/getActorStarterPacks.ts | 44 - .../client/types/app/bsky/graph/getBlocks.ts | 43 - .../types/app/bsky/graph/getFollowers.ts | 45 - .../client/types/app/bsky/graph/getFollows.ts | 45 - .../types/app/bsky/graph/getKnownFollowers.ts | 45 - .../client/types/app/bsky/graph/getList.ts | 46 - .../types/app/bsky/graph/getListBlocks.ts | 43 - .../types/app/bsky/graph/getListMutes.ts | 43 - .../client/types/app/bsky/graph/getLists.ts | 47 - .../app/bsky/graph/getListsWithMembership.ts | 64 - .../client/types/app/bsky/graph/getMutes.ts | 43 - .../types/app/bsky/graph/getRelationships.ts | 59 - .../types/app/bsky/graph/getStarterPack.ts | 42 - .../types/app/bsky/graph/getStarterPacks.ts | 41 - .../graph/getStarterPacksWithMembership.ts | 66 - .../bsky/graph/getSuggestedFollowsByActor.ts | 47 - .../src/client/types/app/bsky/graph/list.ts | 47 - .../client/types/app/bsky/graph/listblock.ts | 39 - .../client/types/app/bsky/graph/listitem.ts | 41 - .../client/types/app/bsky/graph/muteActor.ts | 38 - .../types/app/bsky/graph/muteActorList.ts | 38 - .../client/types/app/bsky/graph/muteThread.ts | 38 - .../app/bsky/graph/searchStarterPacks.ts | 45 - .../types/app/bsky/graph/starterpack.ts | 60 - .../types/app/bsky/graph/unmuteActor.ts | 38 - .../types/app/bsky/graph/unmuteActorList.ts | 38 - .../types/app/bsky/graph/unmuteThread.ts | 38 - .../types/app/bsky/graph/verification.ts | 44 - .../src/client/types/app/bsky/labeler/defs.ts | 100 - .../types/app/bsky/labeler/getServices.ts | 46 - .../client/types/app/bsky/labeler/service.ts | 48 - .../app/bsky/notification/declaration.ts | 38 - .../types/app/bsky/notification/defs.ts | 142 - .../app/bsky/notification/getPreferences.ts | 39 - .../app/bsky/notification/getUnreadCount.ts | 41 - .../notification/listActivitySubscriptions.ts | 43 - .../bsky/notification/listNotifications.ts | 88 - .../notification/putActivitySubscription.ts | 46 - .../app/bsky/notification/putPreferences.ts | 38 - .../app/bsky/notification/putPreferencesV2.ts | 56 - .../app/bsky/notification/registerPush.ts | 43 - .../app/bsky/notification/unregisterPush.ts | 41 - .../types/app/bsky/notification/updateSeen.ts | 38 - .../client/types/app/bsky/richtext/facet.ts | 97 - .../client/types/app/bsky/unspecced/defs.ts | 250 - .../bsky/unspecced/getAgeAssuranceState.ts | 36 - .../types/app/bsky/unspecced/getConfig.ts | 55 - .../getOnboardingSuggestedStarterPacks.ts | 41 - ...OnboardingSuggestedStarterPacksSkeleton.ts | 42 - .../getOnboardingSuggestedUsersSkeleton.ts | 48 - .../unspecced/getPopularFeedGenerators.ts | 44 - .../bsky/unspecced/getPostThreadOtherV2.ts | 61 - .../app/bsky/unspecced/getPostThreadV2.ts | 78 - .../app/bsky/unspecced/getSuggestedFeeds.ts | 41 - .../unspecced/getSuggestedFeedsSkeleton.ts | 42 - .../unspecced/getSuggestedOnboardingUsers.ts | 47 - .../unspecced/getSuggestedStarterPacks.ts | 41 - .../getSuggestedStarterPacksSkeleton.ts | 42 - .../app/bsky/unspecced/getSuggestedUsers.ts | 47 - .../unspecced/getSuggestedUsersForDiscover.ts | 43 - .../getSuggestedUsersForDiscoverSkeleton.ts | 44 - .../unspecced/getSuggestedUsersForExplore.ts | 45 - .../getSuggestedUsersForExploreSkeleton.ts | 46 - .../unspecced/getSuggestedUsersForSeeMore.ts | 45 - .../getSuggestedUsersForSeeMoreSkeleton.ts | 46 - .../unspecced/getSuggestedUsersSkeleton.ts | 48 - .../bsky/unspecced/getSuggestionsSkeleton.ts | 53 - .../bsky/unspecced/getTaggedSuggestions.ts | 55 - .../app/bsky/unspecced/getTrendingTopics.ts | 44 - .../types/app/bsky/unspecced/getTrends.ts | 41 - .../app/bsky/unspecced/getTrendsSkeleton.ts | 43 - .../app/bsky/unspecced/initAgeAssurance.ts | 71 - .../bsky/unspecced/searchActorsSkeleton.ts | 62 - .../app/bsky/unspecced/searchPostsSkeleton.ts | 78 - .../unspecced/searchStarterPacksSkeleton.ts | 60 - .../src/client/types/app/bsky/video/defs.ts | 38 - .../types/app/bsky/video/getJobStatus.ts | 41 - .../types/app/bsky/video/getUploadLimits.ts | 42 - .../types/app/bsky/video/uploadVideo.ts | 41 - .../types/chat/bsky/actor/declaration.ts | 39 - .../src/client/types/chat/bsky/actor/defs.ts | 96 - .../types/chat/bsky/actor/deleteAccount.ts | 37 - .../chat/bsky/actor/exportAccountData.ts | 34 - .../types/chat/bsky/convo/acceptConvo.ts | 54 - .../types/chat/bsky/convo/addReaction.ts | 87 - .../src/client/types/chat/bsky/convo/defs.ts | 1058 - .../chat/bsky/convo/deleteMessageForSelf.ts | 61 - .../client/types/chat/bsky/convo/getConvo.ts | 51 - .../chat/bsky/convo/getConvoAvailability.ts | 42 - .../chat/bsky/convo/getConvoForMembers.ts | 80 - .../types/chat/bsky/convo/getConvoMembers.ts | 54 - .../client/types/chat/bsky/convo/getLog.ts | 71 - .../types/chat/bsky/convo/getMessages.ts | 62 - .../types/chat/bsky/convo/leaveConvo.ts | 61 - .../chat/bsky/convo/listConvoRequests.ts | 48 - .../types/chat/bsky/convo/listConvos.ts | 50 - .../client/types/chat/bsky/convo/lockConvo.ts | 68 - .../client/types/chat/bsky/convo/muteConvo.ts | 54 - .../types/chat/bsky/convo/removeReaction.ts | 79 - .../types/chat/bsky/convo/sendMessage.ts | 60 - .../types/chat/bsky/convo/sendMessageBatch.ts | 77 - .../types/chat/bsky/convo/unlockConvo.ts | 61 - .../types/chat/bsky/convo/unmuteConvo.ts | 54 - .../types/chat/bsky/convo/updateAllRead.ts | 44 - .../types/chat/bsky/convo/updateRead.ts | 55 - .../types/chat/bsky/group/addMembers.ts | 114 - .../chat/bsky/group/approveJoinRequest.ts | 69 - .../types/chat/bsky/group/createGroup.ts | 84 - .../types/chat/bsky/group/createJoinLink.ts | 71 - .../src/client/types/chat/bsky/group/defs.ts | 75 - .../types/chat/bsky/group/disableJoinLink.ts | 68 - .../client/types/chat/bsky/group/editGroup.ts | 69 - .../types/chat/bsky/group/editJoinLink.ts | 70 - .../types/chat/bsky/group/enableJoinLink.ts | 75 - .../chat/bsky/group/getJoinLinkPreview.ts | 51 - .../types/chat/bsky/group/listJoinRequests.ts | 61 - .../types/chat/bsky/group/listMutualGroups.ts | 44 - .../chat/bsky/group/rejectJoinRequest.ts | 59 - .../types/chat/bsky/group/removeMembers.ts | 62 - .../types/chat/bsky/group/requestJoin.ts | 90 - .../chat/bsky/moderation/getActorMetadata.ts | 60 - .../chat/bsky/moderation/getMessageContext.ts | 53 - .../bsky/moderation/subscribeModEvents.ts | 367 - .../chat/bsky/moderation/updateActorAccess.ts | 40 - .../client/types/com/atproto/admin/defs.ts | 106 - .../types/com/atproto/admin/deleteAccount.ts | 38 - .../atproto/admin/disableAccountInvites.ts | 40 - .../com/atproto/admin/disableInviteCodes.ts | 39 - .../com/atproto/admin/enableAccountInvites.ts | 40 - .../types/com/atproto/admin/getAccountInfo.ts | 38 - .../com/atproto/admin/getAccountInfos.ts | 41 - .../types/com/atproto/admin/getInviteCodes.ts | 44 - .../com/atproto/admin/getSubjectStatus.ts | 50 - .../types/com/atproto/admin/searchAccounts.ts | 44 - .../types/com/atproto/admin/sendEmail.ts | 48 - .../com/atproto/admin/updateAccountEmail.ts | 40 - .../com/atproto/admin/updateAccountHandle.ts | 39 - .../atproto/admin/updateAccountPassword.ts | 39 - .../atproto/admin/updateAccountSigningKey.ts | 40 - .../com/atproto/admin/updateSubjectStatus.ts | 56 - .../client/types/com/atproto/identity/defs.ts | 34 - .../identity/getRecommendedDidCredentials.ts | 42 - .../com/atproto/identity/refreshIdentity.ts | 66 - .../identity/requestPlcOperationSignature.ts | 34 - .../types/com/atproto/identity/resolveDid.ts | 59 - .../com/atproto/identity/resolveHandle.ts | 51 - .../com/atproto/identity/resolveIdentity.ts | 63 - .../com/atproto/identity/signPlcOperation.ts | 49 - .../atproto/identity/submitPlcOperation.ts | 38 - .../com/atproto/identity/updateHandle.ts | 39 - .../client/types/com/atproto/label/defs.ts | 143 - .../types/com/atproto/label/queryLabels.ts | 47 - .../com/atproto/label/subscribeLabels.ts | 49 - .../com/atproto/lexicon/resolveLexicon.ts | 56 - .../types/com/atproto/lexicon/schema.ts | 38 - .../com/atproto/moderation/createReport.ts | 80 - .../types/com/atproto/moderation/defs.ts | 83 - .../types/com/atproto/repo/applyWrites.ts | 167 - .../types/com/atproto/repo/createRecord.ts | 68 - .../src/client/types/com/atproto/repo/defs.ts | 31 - .../types/com/atproto/repo/deleteRecord.ts | 63 - .../types/com/atproto/repo/describeRepo.ts | 48 - .../types/com/atproto/repo/getRecord.ts | 59 - .../types/com/atproto/repo/importRepo.ts | 35 - .../com/atproto/repo/listMissingBlobs.ts | 58 - .../types/com/atproto/repo/listRecords.ts | 66 - .../types/com/atproto/repo/putRecord.ts | 70 - .../types/com/atproto/repo/strongRef.ts | 31 - .../types/com/atproto/repo/uploadBlob.ts | 40 - .../com/atproto/server/activateAccount.ts | 34 - .../com/atproto/server/checkAccountStatus.ts | 46 - .../types/com/atproto/server/confirmEmail.ts | 70 - .../types/com/atproto/server/createAccount.ts | 115 - .../com/atproto/server/createAppPassword.ts | 72 - .../com/atproto/server/createInviteCode.ts | 44 - .../com/atproto/server/createInviteCodes.ts | 61 - .../types/com/atproto/server/createSession.ts | 76 - .../com/atproto/server/deactivateAccount.ts | 39 - .../client/types/com/atproto/server/defs.ts | 52 - .../types/com/atproto/server/deleteAccount.ts | 57 - .../types/com/atproto/server/deleteSession.ts | 51 - .../com/atproto/server/describeServer.ts | 77 - .../atproto/server/getAccountInviteCodes.ts | 53 - .../com/atproto/server/getServiceAuth.ts | 55 - .../types/com/atproto/server/getSession.ts | 46 - .../com/atproto/server/listAppPasswords.ts | 65 - .../com/atproto/server/refreshSession.ts | 73 - .../atproto/server/requestAccountDelete.ts | 34 - .../server/requestEmailConfirmation.ts | 34 - .../com/atproto/server/requestEmailUpdate.ts | 39 - .../atproto/server/requestPasswordReset.ts | 38 - .../com/atproto/server/reserveSigningKey.ts | 45 - .../types/com/atproto/server/resetPassword.ts | 56 - .../com/atproto/server/revokeAppPassword.ts | 38 - .../types/com/atproto/server/updateEmail.ts | 65 - .../src/client/types/com/atproto/sync/defs.ts | 23 - .../client/types/com/atproto/sync/getBlob.ts | 77 - .../types/com/atproto/sync/getBlocks.ts | 76 - .../types/com/atproto/sync/getCheckout.ts | 37 - .../client/types/com/atproto/sync/getHead.ts | 51 - .../types/com/atproto/sync/getHostStatus.ts | 57 - .../types/com/atproto/sync/getLatestCommit.ts | 73 - .../types/com/atproto/sync/getRecord.ts | 78 - .../client/types/com/atproto/sync/getRepo.ts | 70 - .../types/com/atproto/sync/getRepoStatus.ts | 63 - .../types/com/atproto/sync/listBlobs.ts | 77 - .../types/com/atproto/sync/listHosts.ts | 64 - .../types/com/atproto/sync/listRepos.ts | 70 - .../com/atproto/sync/listReposByCollection.ts | 59 - .../types/com/atproto/sync/notifyOfUpdate.ts | 39 - .../types/com/atproto/sync/requestCrawl.ts | 49 - .../types/com/atproto/sync/subscribeRepos.ts | 164 - .../com/atproto/temp/addReservedHandle.ts | 41 - .../atproto/temp/checkHandleAvailability.ts | 109 - .../com/atproto/temp/checkSignupQueue.ts | 40 - .../com/atproto/temp/dereferenceScope.ts | 53 - .../types/com/atproto/temp/fetchLabels.ts | 42 - .../atproto/temp/requestPhoneVerification.ts | 38 - .../atproto/temp/revokeAccountCredentials.ts | 38 - .../types/com/germnetwork/declaration.ts | 63 - .../ozone/communication/createTemplate.ts | 62 - .../types/tools/ozone/communication/defs.ts | 43 - .../ozone/communication/deleteTemplate.ts | 38 - .../ozone/communication/listTemplates.ts | 39 - .../ozone/communication/updateTemplate.ts | 65 - .../tools/ozone/hosting/getAccountHistory.ts | 148 - .../moderation/cancelScheduledActions.ts | 79 - .../types/tools/ozone/moderation/defs.ts | 1176 - .../types/tools/ozone/moderation/emitEvent.ts | 121 - .../ozone/moderation/getAccountTimeline.ts | 115 - .../types/tools/ozone/moderation/getEvent.ts | 38 - .../types/tools/ozone/moderation/getRecord.ts | 49 - .../tools/ozone/moderation/getRecords.ts | 45 - .../types/tools/ozone/moderation/getRepo.ts | 48 - .../ozone/moderation/getReporterStats.ts | 41 - .../types/tools/ozone/moderation/getRepos.ts | 45 - .../tools/ozone/moderation/getSubjects.ts | 41 - .../ozone/moderation/listScheduledActions.ts | 57 - .../tools/ozone/moderation/queryEvents.ts | 87 - .../tools/ozone/moderation/queryStatuses.ts | 122 - .../tools/ozone/moderation/scheduleAction.ts | 133 - .../tools/ozone/moderation/searchRepos.ts | 46 - .../tools/ozone/queue/assignModerator.ts | 55 - .../types/tools/ozone/queue/createQueue.ts | 63 - .../client/types/tools/ozone/queue/defs.ts | 99 - .../types/tools/ozone/queue/deleteQueue.ts | 48 - .../types/tools/ozone/queue/getAssignments.ts | 49 - .../types/tools/ozone/queue/listQueues.ts | 51 - .../types/tools/ozone/queue/routeReports.ts | 59 - .../tools/ozone/queue/unassignModerator.ts | 51 - .../types/tools/ozone/queue/updateQueue.ts | 51 - .../tools/ozone/report/assignModerator.ts | 66 - .../tools/ozone/report/createActivity.ts | 85 - .../client/types/tools/ozone/report/defs.ts | 466 - .../tools/ozone/report/getAssignments.ts | 49 - .../tools/ozone/report/getHistoricalStats.ts | 55 - .../tools/ozone/report/getLatestReport.ts | 49 - .../types/tools/ozone/report/getLiveStats.ts | 46 - .../types/tools/ozone/report/getReport.ts | 49 - .../tools/ozone/report/listActivities.ts | 45 - .../types/tools/ozone/report/queryReports.ts | 73 - .../types/tools/ozone/report/reassignQueue.ts | 88 - .../types/tools/ozone/report/refreshStats.ts | 46 - .../tools/ozone/report/unassignModerator.ts | 53 - .../types/tools/ozone/safelink/addRule.ts | 67 - .../client/types/tools/ozone/safelink/defs.ts | 76 - .../types/tools/ozone/safelink/queryEvents.ts | 55 - .../types/tools/ozone/safelink/queryRules.ts | 61 - .../types/tools/ozone/safelink/removeRule.ts | 58 - .../types/tools/ozone/safelink/updateRule.ts | 60 - .../types/tools/ozone/server/getConfig.ts | 79 - .../client/types/tools/ozone/set/addValues.ts | 41 - .../src/client/types/tools/ozone/set/defs.ts | 50 - .../client/types/tools/ozone/set/deleteSet.ts | 52 - .../types/tools/ozone/set/deleteValues.ts | 51 - .../client/types/tools/ozone/set/getValues.ts | 55 - .../client/types/tools/ozone/set/querySets.ts | 47 - .../client/types/tools/ozone/set/upsertSet.ts | 38 - .../client/types/tools/ozone/setting/defs.ts | 44 - .../types/tools/ozone/setting/listOptions.ts | 48 - .../tools/ozone/setting/removeOptions.ts | 42 - .../types/tools/ozone/setting/upsertOption.ts | 53 - .../types/tools/ozone/signature/defs.ts | 31 - .../tools/ozone/signature/findCorrelation.ts | 41 - .../ozone/signature/findRelatedAccounts.ts | 61 - .../tools/ozone/signature/searchAccounts.ts | 44 - .../types/tools/ozone/team/addMember.ts | 59 - .../src/client/types/tools/ozone/team/defs.ts | 51 - .../types/tools/ozone/team/deleteMember.ts | 55 - .../types/tools/ozone/team/listMembers.ts | 46 - .../types/tools/ozone/team/updateMember.ts | 59 - .../types/tools/ozone/verification/defs.ts | 59 - .../ozone/verification/grantVerifications.ts | 87 - .../ozone/verification/listVerifications.ts | 57 - .../ozone/verification/revokeVerifications.ts | 68 - packages/api/src/client/util.ts | 82 - packages/ozone/.gitignore | 2 + packages/ozone/package.json | 3 +- packages/ozone/src/lexicon/index.ts | 4515 --- packages/ozone/src/lexicon/lexicons.ts | 25762 --------------- .../src/lexicon/types/app/bsky/actor/defs.ts | 716 - .../types/app/bsky/actor/getPreferences.ts | 38 - .../types/app/bsky/actor/getProfile.ts | 37 - .../types/app/bsky/actor/getProfiles.ts | 40 - .../types/app/bsky/actor/getSuggestions.ts | 46 - .../lexicon/types/app/bsky/actor/profile.ts | 52 - .../types/app/bsky/actor/putPreferences.ts | 34 - .../types/app/bsky/actor/searchActors.ts | 46 - .../app/bsky/actor/searchActorsTypeahead.ts | 44 - .../lexicon/types/app/bsky/actor/status.ts | 46 - .../types/app/bsky/ageassurance/begin.ts | 54 - .../types/app/bsky/ageassurance/defs.ts | 303 - .../types/app/bsky/ageassurance/getConfig.ts | 34 - .../types/app/bsky/ageassurance/getState.ts | 42 - .../types/app/bsky/bookmark/createBookmark.ts | 35 - .../lexicon/types/app/bsky/bookmark/defs.ts | 54 - .../types/app/bsky/bookmark/deleteBookmark.ts | 34 - .../types/app/bsky/bookmark/getBookmarks.ts | 42 - .../lexicon/types/app/bsky/contact/defs.ts | 71 - .../types/app/bsky/contact/dismissMatch.ts | 43 - .../types/app/bsky/contact/getMatches.ts | 43 - .../types/app/bsky/contact/getSyncStatus.ts | 39 - .../types/app/bsky/contact/importContacts.ts | 54 - .../types/app/bsky/contact/removeData.ts | 40 - .../app/bsky/contact/sendNotification.ts | 44 - .../bsky/contact/startPhoneVerification.ts | 43 - .../types/app/bsky/contact/verifyPhone.ts | 53 - .../types/app/bsky/draft/createDraft.ts | 46 - .../src/lexicon/types/app/bsky/draft/defs.ts | 212 - .../types/app/bsky/draft/deleteDraft.ts | 33 - .../lexicon/types/app/bsky/draft/getDrafts.ts | 42 - .../types/app/bsky/draft/updateDraft.ts | 34 - .../src/lexicon/types/app/bsky/embed/defs.ts | 32 - .../lexicon/types/app/bsky/embed/external.ts | 85 - .../lexicon/types/app/bsky/embed/images.ts | 86 - .../lexicon/types/app/bsky/embed/record.ts | 146 - .../types/app/bsky/embed/recordWithMedia.ts | 59 - .../src/lexicon/types/app/bsky/embed/video.ts | 75 - .../src/lexicon/types/app/bsky/feed/defs.ts | 428 - .../app/bsky/feed/describeFeedGenerator.ts | 70 - .../lexicon/types/app/bsky/feed/generator.ts | 51 - .../types/app/bsky/feed/getActorFeeds.ts | 43 - .../types/app/bsky/feed/getActorLikes.ts | 44 - .../types/app/bsky/feed/getAuthorFeed.ts | 53 - .../lexicon/types/app/bsky/feed/getFeed.ts | 44 - .../types/app/bsky/feed/getFeedGenerator.ts | 45 - .../types/app/bsky/feed/getFeedGenerators.ts | 40 - .../types/app/bsky/feed/getFeedSkeleton.ts | 47 - .../lexicon/types/app/bsky/feed/getLikes.ts | 65 - .../types/app/bsky/feed/getListFeed.ts | 45 - .../types/app/bsky/feed/getPostThread.ts | 51 - .../lexicon/types/app/bsky/feed/getPosts.ts | 41 - .../lexicon/types/app/bsky/feed/getQuotes.ts | 48 - .../types/app/bsky/feed/getRepostedBy.ts | 48 - .../types/app/bsky/feed/getSuggestedFeeds.ts | 42 - .../types/app/bsky/feed/getTimeline.ts | 44 - .../src/lexicon/types/app/bsky/feed/like.ts | 40 - .../src/lexicon/types/app/bsky/feed/post.ts | 117 - .../lexicon/types/app/bsky/feed/postgate.ts | 58 - .../src/lexicon/types/app/bsky/feed/repost.ts | 40 - .../types/app/bsky/feed/searchPosts.ts | 66 - .../types/app/bsky/feed/sendInteractions.ts | 43 - .../lexicon/types/app/bsky/feed/threadgate.ts | 110 - .../src/lexicon/types/app/bsky/graph/block.ts | 39 - .../src/lexicon/types/app/bsky/graph/defs.ts | 206 - .../lexicon/types/app/bsky/graph/follow.ts | 40 - .../app/bsky/graph/getActorStarterPacks.ts | 43 - .../lexicon/types/app/bsky/graph/getBlocks.ts | 42 - .../types/app/bsky/graph/getFollowers.ts | 44 - .../types/app/bsky/graph/getFollows.ts | 44 - .../types/app/bsky/graph/getKnownFollowers.ts | 44 - .../lexicon/types/app/bsky/graph/getList.ts | 45 - .../types/app/bsky/graph/getListBlocks.ts | 42 - .../types/app/bsky/graph/getListMutes.ts | 42 - .../lexicon/types/app/bsky/graph/getLists.ts | 46 - .../app/bsky/graph/getListsWithMembership.ts | 63 - .../lexicon/types/app/bsky/graph/getMutes.ts | 42 - .../types/app/bsky/graph/getRelationships.ts | 49 - .../types/app/bsky/graph/getStarterPack.ts | 41 - .../types/app/bsky/graph/getStarterPacks.ts | 40 - .../graph/getStarterPacksWithMembership.ts | 65 - .../bsky/graph/getSuggestedFollowsByActor.ts | 46 - .../src/lexicon/types/app/bsky/graph/list.ts | 47 - .../lexicon/types/app/bsky/graph/listblock.ts | 39 - .../lexicon/types/app/bsky/graph/listitem.ts | 41 - .../lexicon/types/app/bsky/graph/muteActor.ts | 33 - .../types/app/bsky/graph/muteActorList.ts | 33 - .../types/app/bsky/graph/muteThread.ts | 33 - .../app/bsky/graph/searchStarterPacks.ts | 44 - .../types/app/bsky/graph/starterpack.ts | 60 - .../types/app/bsky/graph/unmuteActor.ts | 33 - .../types/app/bsky/graph/unmuteActorList.ts | 33 - .../types/app/bsky/graph/unmuteThread.ts | 33 - .../types/app/bsky/graph/verification.ts | 44 - .../lexicon/types/app/bsky/labeler/defs.ts | 100 - .../types/app/bsky/labeler/getServices.ts | 45 - .../lexicon/types/app/bsky/labeler/service.ts | 48 - .../app/bsky/notification/declaration.ts | 38 - .../types/app/bsky/notification/defs.ts | 142 - .../app/bsky/notification/getPreferences.ts | 38 - .../app/bsky/notification/getUnreadCount.ts | 40 - .../notification/listActivitySubscriptions.ts | 42 - .../bsky/notification/listNotifications.ts | 87 - .../notification/putActivitySubscription.ts | 46 - .../app/bsky/notification/putPreferences.ts | 33 - .../app/bsky/notification/putPreferencesV2.ts | 56 - .../app/bsky/notification/registerPush.ts | 38 - .../app/bsky/notification/unregisterPush.ts | 36 - .../types/app/bsky/notification/updateSeen.ts | 33 - .../lexicon/types/app/bsky/richtext/facet.ts | 97 - .../lexicon/types/app/bsky/unspecced/defs.ts | 250 - .../bsky/unspecced/getAgeAssuranceState.ts | 34 - .../types/app/bsky/unspecced/getConfig.ts | 54 - .../getOnboardingSuggestedStarterPacks.ts | 40 - ...OnboardingSuggestedStarterPacksSkeleton.ts | 41 - .../getOnboardingSuggestedUsersSkeleton.ts | 47 - .../unspecced/getPopularFeedGenerators.ts | 43 - .../bsky/unspecced/getPostThreadOtherV2.ts | 60 - .../app/bsky/unspecced/getPostThreadV2.ts | 77 - .../app/bsky/unspecced/getSuggestedFeeds.ts | 40 - .../unspecced/getSuggestedFeedsSkeleton.ts | 41 - .../unspecced/getSuggestedOnboardingUsers.ts | 46 - .../unspecced/getSuggestedStarterPacks.ts | 40 - .../getSuggestedStarterPacksSkeleton.ts | 41 - .../app/bsky/unspecced/getSuggestedUsers.ts | 46 - .../unspecced/getSuggestedUsersForDiscover.ts | 42 - .../getSuggestedUsersForDiscoverSkeleton.ts | 43 - .../unspecced/getSuggestedUsersForExplore.ts | 44 - .../getSuggestedUsersForExploreSkeleton.ts | 45 - .../unspecced/getSuggestedUsersForSeeMore.ts | 44 - .../getSuggestedUsersForSeeMoreSkeleton.ts | 45 - .../unspecced/getSuggestedUsersSkeleton.ts | 47 - .../bsky/unspecced/getSuggestionsSkeleton.ts | 52 - .../bsky/unspecced/getTaggedSuggestions.ts | 54 - .../app/bsky/unspecced/getTrendingTopics.ts | 43 - .../types/app/bsky/unspecced/getTrends.ts | 40 - .../app/bsky/unspecced/getTrendsSkeleton.ts | 42 - .../app/bsky/unspecced/initAgeAssurance.ts | 48 - .../bsky/unspecced/searchActorsSkeleton.ts | 52 - .../app/bsky/unspecced/searchPostsSkeleton.ts | 68 - .../unspecced/searchStarterPacksSkeleton.ts | 50 - .../src/lexicon/types/app/bsky/video/defs.ts | 38 - .../types/app/bsky/video/getJobStatus.ts | 40 - .../types/app/bsky/video/getUploadLimits.ts | 41 - .../types/app/bsky/video/uploadVideo.ts | 42 - .../types/chat/bsky/actor/declaration.ts | 39 - .../src/lexicon/types/chat/bsky/actor/defs.ts | 96 - .../types/chat/bsky/actor/deleteAccount.ts | 35 - .../chat/bsky/actor/exportAccountData.ts | 33 - .../types/chat/bsky/convo/acceptConvo.ts | 45 - .../types/chat/bsky/convo/addReaction.ts | 52 - .../src/lexicon/types/chat/bsky/convo/defs.ts | 1058 - .../chat/bsky/convo/deleteMessageForSelf.ts | 44 - .../lexicon/types/chat/bsky/convo/getConvo.ts | 41 - .../chat/bsky/convo/getConvoAvailability.ts | 41 - .../chat/bsky/convo/getConvoForMembers.ts | 46 - .../types/chat/bsky/convo/getConvoMembers.ts | 44 - .../lexicon/types/chat/bsky/convo/getLog.ts | 70 - .../types/chat/bsky/convo/getMessages.ts | 52 - .../types/chat/bsky/convo/leaveConvo.ts | 45 - .../chat/bsky/convo/listConvoRequests.ts | 47 - .../types/chat/bsky/convo/listConvos.ts | 49 - .../types/chat/bsky/convo/lockConvo.ts | 45 - .../types/chat/bsky/convo/muteConvo.ts | 45 - .../types/chat/bsky/convo/removeReaction.ts | 51 - .../types/chat/bsky/convo/sendMessage.ts | 44 - .../types/chat/bsky/convo/sendMessageBatch.ts | 61 - .../types/chat/bsky/convo/unlockConvo.ts | 45 - .../types/chat/bsky/convo/unmuteConvo.ts | 45 - .../types/chat/bsky/convo/updateAllRead.ts | 44 - .../types/chat/bsky/convo/updateRead.ts | 46 - .../types/chat/bsky/group/addMembers.ts | 57 - .../chat/bsky/group/approveJoinRequest.ts | 46 - .../types/chat/bsky/group/createGroup.ts | 51 - .../types/chat/bsky/group/createJoinLink.ts | 47 - .../src/lexicon/types/chat/bsky/group/defs.ts | 75 - .../types/chat/bsky/group/disableJoinLink.ts | 45 - .../types/chat/bsky/group/editGroup.ts | 46 - .../types/chat/bsky/group/editJoinLink.ts | 47 - .../types/chat/bsky/group/enableJoinLink.ts | 49 - .../chat/bsky/group/getJoinLinkPreview.ts | 41 - .../types/chat/bsky/group/listJoinRequests.ts | 44 - .../types/chat/bsky/group/listMutualGroups.ts | 43 - .../chat/bsky/group/rejectJoinRequest.ts | 43 - .../types/chat/bsky/group/removeMembers.ts | 46 - .../types/chat/bsky/group/requestJoin.ts | 52 - .../chat/bsky/moderation/getActorMetadata.ts | 59 - .../chat/bsky/moderation/getMessageContext.ts | 52 - .../bsky/moderation/subscribeModEvents.ts | 387 - .../chat/bsky/moderation/updateActorAccess.ts | 35 - .../lexicon/types/com/atproto/admin/defs.ts | 106 - .../types/com/atproto/admin/deleteAccount.ts | 33 - .../atproto/admin/disableAccountInvites.ts | 35 - .../com/atproto/admin/disableInviteCodes.ts | 34 - .../com/atproto/admin/enableAccountInvites.ts | 35 - .../types/com/atproto/admin/getAccountInfo.ts | 36 - .../com/atproto/admin/getAccountInfos.ts | 40 - .../types/com/atproto/admin/getInviteCodes.ts | 43 - .../com/atproto/admin/getSubjectStatus.ts | 49 - .../types/com/atproto/admin/searchAccounts.ts | 43 - .../types/com/atproto/admin/sendEmail.ts | 48 - .../com/atproto/admin/updateAccountEmail.ts | 35 - .../com/atproto/admin/updateAccountHandle.ts | 34 - .../atproto/admin/updateAccountPassword.ts | 34 - .../atproto/admin/updateAccountSigningKey.ts | 35 - .../com/atproto/admin/updateSubjectStatus.ts | 56 - .../types/com/atproto/identity/defs.ts | 34 - .../identity/getRecommendedDidCredentials.ts | 41 - .../com/atproto/identity/refreshIdentity.ts | 43 - .../identity/requestPlcOperationSignature.ts | 26 - .../types/com/atproto/identity/resolveDid.ts | 42 - .../com/atproto/identity/resolveHandle.ts | 41 - .../com/atproto/identity/resolveIdentity.ts | 38 - .../com/atproto/identity/signPlcOperation.ts | 49 - .../atproto/identity/submitPlcOperation.ts | 33 - .../com/atproto/identity/updateHandle.ts | 34 - .../lexicon/types/com/atproto/label/defs.ts | 143 - .../types/com/atproto/label/queryLabels.ts | 46 - .../com/atproto/label/subscribeLabels.ts | 58 - .../com/atproto/lexicon/resolveLexicon.ts | 46 - .../types/com/atproto/lexicon/schema.ts | 38 - .../com/atproto/moderation/createReport.ts | 80 - .../types/com/atproto/moderation/defs.ts | 83 - .../types/com/atproto/repo/applyWrites.ts | 158 - .../types/com/atproto/repo/createRecord.ts | 59 - .../lexicon/types/com/atproto/repo/defs.ts | 31 - .../types/com/atproto/repo/deleteRecord.ts | 54 - .../types/com/atproto/repo/describeRepo.ts | 47 - .../types/com/atproto/repo/getRecord.ts | 49 - .../types/com/atproto/repo/importRepo.ts | 31 - .../com/atproto/repo/listMissingBlobs.ts | 57 - .../types/com/atproto/repo/listRecords.ts | 65 - .../types/com/atproto/repo/putRecord.ts | 61 - .../types/com/atproto/repo/strongRef.ts | 31 - .../types/com/atproto/repo/uploadBlob.ts | 41 - .../com/atproto/server/activateAccount.ts | 26 - .../com/atproto/server/checkAccountStatus.ts | 45 - .../types/com/atproto/server/confirmEmail.ts | 35 - .../types/com/atproto/server/createAccount.ts | 71 - .../com/atproto/server/createAppPassword.ts | 63 - .../com/atproto/server/createInviteCode.ts | 44 - .../com/atproto/server/createInviteCodes.ts | 61 - .../types/com/atproto/server/createSession.ts | 59 - .../com/atproto/server/deactivateAccount.ts | 34 - .../lexicon/types/com/atproto/server/defs.ts | 52 - .../types/com/atproto/server/deleteAccount.ts | 36 - .../types/com/atproto/server/deleteSession.ts | 27 - .../com/atproto/server/describeServer.ts | 76 - .../atproto/server/getAccountInviteCodes.ts | 43 - .../com/atproto/server/getServiceAuth.ts | 45 - .../types/com/atproto/server/getSession.ts | 45 - .../com/atproto/server/listAppPasswords.ts | 55 - .../com/atproto/server/refreshSession.ts | 48 - .../atproto/server/requestAccountDelete.ts | 26 - .../server/requestEmailConfirmation.ts | 26 - .../com/atproto/server/requestEmailUpdate.ts | 37 - .../atproto/server/requestPasswordReset.ts | 33 - .../com/atproto/server/reserveSigningKey.ts | 45 - .../types/com/atproto/server/resetPassword.ts | 35 - .../com/atproto/server/revokeAppPassword.ts | 33 - .../types/com/atproto/server/updateEmail.ts | 37 - .../lexicon/types/com/atproto/sync/defs.ts | 23 - .../lexicon/types/com/atproto/sync/getBlob.ts | 44 - .../types/com/atproto/sync/getBlocks.ts | 43 - .../types/com/atproto/sync/getCheckout.ts | 36 - .../lexicon/types/com/atproto/sync/getHead.ts | 41 - .../types/com/atproto/sync/getHostStatus.ts | 47 - .../types/com/atproto/sync/getLatestCommit.ts | 42 - .../types/com/atproto/sync/getRecord.ts | 45 - .../lexicon/types/com/atproto/sync/getRepo.ts | 39 - .../types/com/atproto/sync/getRepoStatus.ts | 53 - .../types/com/atproto/sync/listBlobs.ts | 46 - .../types/com/atproto/sync/listHosts.ts | 63 - .../types/com/atproto/sync/listRepos.ts | 69 - .../com/atproto/sync/listReposByCollection.ts | 58 - .../types/com/atproto/sync/notifyOfUpdate.ts | 34 - .../types/com/atproto/sync/requestCrawl.ts | 35 - .../types/com/atproto/sync/subscribeRepos.ts | 179 - .../com/atproto/temp/addReservedHandle.ts | 41 - .../atproto/temp/checkHandleAvailability.ts | 99 - .../com/atproto/temp/checkSignupQueue.ts | 39 - .../com/atproto/temp/dereferenceScope.ts | 42 - .../types/com/atproto/temp/fetchLabels.ts | 41 - .../atproto/temp/requestPhoneVerification.ts | 33 - .../atproto/temp/revokeAccountCredentials.ts | 33 - .../ozone/communication/createTemplate.ts | 52 - .../types/tools/ozone/communication/defs.ts | 43 - .../ozone/communication/deleteTemplate.ts | 33 - .../ozone/communication/listTemplates.ts | 38 - .../ozone/communication/updateTemplate.ts | 55 - .../tools/ozone/hosting/getAccountHistory.ts | 147 - .../moderation/cancelScheduledActions.ts | 79 - .../types/tools/ozone/moderation/defs.ts | 1176 - .../types/tools/ozone/moderation/emitEvent.ts | 104 - .../ozone/moderation/getAccountTimeline.ts | 105 - .../types/tools/ozone/moderation/getEvent.ts | 36 - .../types/tools/ozone/moderation/getRecord.ts | 38 - .../tools/ozone/moderation/getRecords.ts | 44 - .../types/tools/ozone/moderation/getRepo.ts | 37 - .../ozone/moderation/getReporterStats.ts | 40 - .../types/tools/ozone/moderation/getRepos.ts | 44 - .../tools/ozone/moderation/getSubjects.ts | 40 - .../ozone/moderation/listScheduledActions.ts | 57 - .../tools/ozone/moderation/queryEvents.ts | 86 - .../tools/ozone/moderation/queryStatuses.ts | 121 - .../tools/ozone/moderation/scheduleAction.ts | 133 - .../tools/ozone/moderation/searchRepos.ts | 45 - .../tools/ozone/queue/assignModerator.ts | 46 - .../types/tools/ozone/queue/createQueue.ts | 54 - .../lexicon/types/tools/ozone/queue/defs.ts | 99 - .../types/tools/ozone/queue/deleteQueue.ts | 48 - .../types/tools/ozone/queue/getAssignments.ts | 48 - .../types/tools/ozone/queue/listQueues.ts | 50 - .../types/tools/ozone/queue/routeReports.ts | 50 - .../tools/ozone/queue/unassignModerator.ts | 37 - .../types/tools/ozone/queue/updateQueue.ts | 51 - .../tools/ozone/report/assignModerator.ts | 50 - .../tools/ozone/report/createActivity.ts | 60 - .../lexicon/types/tools/ozone/report/defs.ts | 466 - .../tools/ozone/report/getAssignments.ts | 48 - .../tools/ozone/report/getHistoricalStats.ts | 54 - .../tools/ozone/report/getLatestReport.ts | 39 - .../types/tools/ozone/report/getLiveStats.ts | 45 - .../types/tools/ozone/report/getReport.ts | 38 - .../tools/ozone/report/listActivities.ts | 44 - .../types/tools/ozone/report/queryReports.ts | 72 - .../types/tools/ozone/report/reassignQueue.ts | 55 - .../types/tools/ozone/report/refreshStats.ts | 46 - .../tools/ozone/report/unassignModerator.ts | 44 - .../types/tools/ozone/safelink/addRule.ts | 51 - .../types/tools/ozone/safelink/defs.ts | 76 - .../types/tools/ozone/safelink/queryEvents.ts | 55 - .../types/tools/ozone/safelink/queryRules.ts | 61 - .../types/tools/ozone/safelink/removeRule.ts | 49 - .../types/tools/ozone/safelink/updateRule.ts | 51 - .../types/tools/ozone/server/getConfig.ts | 78 - .../types/tools/ozone/set/addValues.ts | 36 - .../src/lexicon/types/tools/ozone/set/defs.ts | 50 - .../types/tools/ozone/set/deleteSet.ts | 43 - .../types/tools/ozone/set/deleteValues.ts | 37 - .../types/tools/ozone/set/getValues.ts | 45 - .../types/tools/ozone/set/querySets.ts | 46 - .../types/tools/ozone/set/upsertSet.ts | 38 - .../lexicon/types/tools/ozone/setting/defs.ts | 44 - .../types/tools/ozone/setting/listOptions.ts | 47 - .../tools/ozone/setting/removeOptions.ts | 42 - .../types/tools/ozone/setting/upsertOption.ts | 53 - .../types/tools/ozone/signature/defs.ts | 31 - .../tools/ozone/signature/findCorrelation.ts | 40 - .../ozone/signature/findRelatedAccounts.ts | 60 - .../tools/ozone/signature/searchAccounts.ts | 43 - .../types/tools/ozone/team/addMember.ts | 49 - .../lexicon/types/tools/ozone/team/defs.ts | 51 - .../types/tools/ozone/team/deleteMember.ts | 34 - .../types/tools/ozone/team/listMembers.ts | 45 - .../types/tools/ozone/team/updateMember.ts | 50 - .../types/tools/ozone/verification/defs.ts | 59 - .../ozone/verification/grantVerifications.ts | 87 - .../ozone/verification/listVerifications.ts | 56 - .../ozone/verification/revokeVerifications.ts | 68 - packages/ozone/src/lexicon/util.ts | 82 - 734 files changed, 43 insertions(+), 110495 deletions(-) create mode 100644 .changeset/smooth-feet-taste.md delete mode 100644 packages/api/src/client/index.ts delete mode 100644 packages/api/src/client/lexicons.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/getPreferences.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/getProfile.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/getProfiles.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/getSuggestions.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/profile.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/putPreferences.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/searchActors.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts delete mode 100644 packages/api/src/client/types/app/bsky/actor/status.ts delete mode 100644 packages/api/src/client/types/app/bsky/ageassurance/begin.ts delete mode 100644 packages/api/src/client/types/app/bsky/ageassurance/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts delete mode 100644 packages/api/src/client/types/app/bsky/ageassurance/getState.ts delete mode 100644 packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts delete mode 100644 packages/api/src/client/types/app/bsky/bookmark/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts delete mode 100644 packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/dismissMatch.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/getMatches.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/importContacts.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/removeData.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/sendNotification.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts delete mode 100644 packages/api/src/client/types/app/bsky/contact/verifyPhone.ts delete mode 100644 packages/api/src/client/types/app/bsky/draft/createDraft.ts delete mode 100644 packages/api/src/client/types/app/bsky/draft/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/draft/deleteDraft.ts delete mode 100644 packages/api/src/client/types/app/bsky/draft/getDrafts.ts delete mode 100644 packages/api/src/client/types/app/bsky/draft/updateDraft.ts delete mode 100644 packages/api/src/client/types/app/bsky/embed/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/embed/external.ts delete mode 100644 packages/api/src/client/types/app/bsky/embed/images.ts delete mode 100644 packages/api/src/client/types/app/bsky/embed/record.ts delete mode 100644 packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts delete mode 100644 packages/api/src/client/types/app/bsky/embed/video.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/generator.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getActorLikes.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getFeed.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getLikes.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getListFeed.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getPostThread.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getPosts.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getQuotes.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/getTimeline.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/like.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/post.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/postgate.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/repost.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/searchPosts.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/sendInteractions.ts delete mode 100644 packages/api/src/client/types/app/bsky/feed/threadgate.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/block.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/follow.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getBlocks.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getFollowers.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getFollows.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getList.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getListBlocks.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getListMutes.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getLists.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getMutes.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getRelationships.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getStarterPack.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/list.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/listblock.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/listitem.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/muteActor.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/muteActorList.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/muteThread.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/starterpack.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/unmuteActor.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/unmuteThread.ts delete mode 100644 packages/api/src/client/types/app/bsky/graph/verification.ts delete mode 100644 packages/api/src/client/types/app/bsky/labeler/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/labeler/getServices.ts delete mode 100644 packages/api/src/client/types/app/bsky/labeler/service.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/declaration.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/getPreferences.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/listNotifications.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/putPreferences.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/registerPush.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/unregisterPush.ts delete mode 100644 packages/api/src/client/types/app/bsky/notification/updateSeen.ts delete mode 100644 packages/api/src/client/types/app/bsky/richtext/facet.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getConfig.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getTrends.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts delete mode 100644 packages/api/src/client/types/app/bsky/video/defs.ts delete mode 100644 packages/api/src/client/types/app/bsky/video/getJobStatus.ts delete mode 100644 packages/api/src/client/types/app/bsky/video/getUploadLimits.ts delete mode 100644 packages/api/src/client/types/app/bsky/video/uploadVideo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/actor/declaration.ts delete mode 100644 packages/api/src/client/types/chat/bsky/actor/defs.ts delete mode 100644 packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts delete mode 100644 packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/addReaction.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/defs.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/getConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/getLog.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/getMessages.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/listConvos.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/lockConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/muteConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/removeReaction.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/sendMessage.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts delete mode 100644 packages/api/src/client/types/chat/bsky/convo/updateRead.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/addMembers.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/createGroup.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/createJoinLink.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/defs.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/editGroup.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/editJoinLink.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/removeMembers.ts delete mode 100644 packages/api/src/client/types/chat/bsky/group/requestJoin.ts delete mode 100644 packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts delete mode 100644 packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts delete mode 100644 packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts delete mode 100644 packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/deleteAccount.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/searchAccounts.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/sendEmail.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts delete mode 100644 packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/resolveDid.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/resolveHandle.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts delete mode 100644 packages/api/src/client/types/com/atproto/identity/updateHandle.ts delete mode 100644 packages/api/src/client/types/com/atproto/label/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/label/queryLabels.ts delete mode 100644 packages/api/src/client/types/com/atproto/label/subscribeLabels.ts delete mode 100644 packages/api/src/client/types/com/atproto/lexicon/resolveLexicon.ts delete mode 100644 packages/api/src/client/types/com/atproto/lexicon/schema.ts delete mode 100644 packages/api/src/client/types/com/atproto/moderation/createReport.ts delete mode 100644 packages/api/src/client/types/com/atproto/moderation/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/applyWrites.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/createRecord.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/deleteRecord.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/describeRepo.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/getRecord.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/importRepo.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/listMissingBlobs.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/listRecords.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/putRecord.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/strongRef.ts delete mode 100644 packages/api/src/client/types/com/atproto/repo/uploadBlob.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/activateAccount.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/checkAccountStatus.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/confirmEmail.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/createAccount.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/createAppPassword.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/createInviteCode.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/createInviteCodes.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/createSession.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/deactivateAccount.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/deleteAccount.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/deleteSession.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/describeServer.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/getAccountInviteCodes.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/getServiceAuth.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/getSession.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/listAppPasswords.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/refreshSession.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/requestAccountDelete.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/requestEmailConfirmation.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/requestEmailUpdate.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/requestPasswordReset.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/reserveSigningKey.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/resetPassword.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/revokeAppPassword.ts delete mode 100644 packages/api/src/client/types/com/atproto/server/updateEmail.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/defs.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getBlob.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getBlocks.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getCheckout.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getHead.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getHostStatus.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getLatestCommit.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getRecord.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getRepo.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/getRepoStatus.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/listBlobs.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/listHosts.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/listRepos.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/listReposByCollection.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/notifyOfUpdate.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/requestCrawl.ts delete mode 100644 packages/api/src/client/types/com/atproto/sync/subscribeRepos.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/addReservedHandle.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/checkHandleAvailability.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/checkSignupQueue.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/dereferenceScope.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/fetchLabels.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/requestPhoneVerification.ts delete mode 100644 packages/api/src/client/types/com/atproto/temp/revokeAccountCredentials.ts delete mode 100644 packages/api/src/client/types/com/germnetwork/declaration.ts delete mode 100644 packages/api/src/client/types/tools/ozone/communication/createTemplate.ts delete mode 100644 packages/api/src/client/types/tools/ozone/communication/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/communication/deleteTemplate.ts delete mode 100644 packages/api/src/client/types/tools/ozone/communication/listTemplates.ts delete mode 100644 packages/api/src/client/types/tools/ozone/communication/updateTemplate.ts delete mode 100644 packages/api/src/client/types/tools/ozone/hosting/getAccountHistory.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/cancelScheduledActions.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/emitEvent.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getAccountTimeline.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getEvent.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getRecord.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getRecords.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getRepo.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getReporterStats.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getRepos.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/getSubjects.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/listScheduledActions.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/queryEvents.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/queryStatuses.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/scheduleAction.ts delete mode 100644 packages/api/src/client/types/tools/ozone/moderation/searchRepos.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/assignModerator.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/createQueue.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/deleteQueue.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/getAssignments.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/listQueues.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/routeReports.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/unassignModerator.ts delete mode 100644 packages/api/src/client/types/tools/ozone/queue/updateQueue.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/assignModerator.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/createActivity.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/getAssignments.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/getHistoricalStats.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/getLatestReport.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/getLiveStats.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/getReport.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/listActivities.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/queryReports.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/reassignQueue.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/refreshStats.ts delete mode 100644 packages/api/src/client/types/tools/ozone/report/unassignModerator.ts delete mode 100644 packages/api/src/client/types/tools/ozone/safelink/addRule.ts delete mode 100644 packages/api/src/client/types/tools/ozone/safelink/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/safelink/queryEvents.ts delete mode 100644 packages/api/src/client/types/tools/ozone/safelink/queryRules.ts delete mode 100644 packages/api/src/client/types/tools/ozone/safelink/removeRule.ts delete mode 100644 packages/api/src/client/types/tools/ozone/safelink/updateRule.ts delete mode 100644 packages/api/src/client/types/tools/ozone/server/getConfig.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/addValues.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/deleteSet.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/deleteValues.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/getValues.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/querySets.ts delete mode 100644 packages/api/src/client/types/tools/ozone/set/upsertSet.ts delete mode 100644 packages/api/src/client/types/tools/ozone/setting/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/setting/listOptions.ts delete mode 100644 packages/api/src/client/types/tools/ozone/setting/removeOptions.ts delete mode 100644 packages/api/src/client/types/tools/ozone/setting/upsertOption.ts delete mode 100644 packages/api/src/client/types/tools/ozone/signature/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/signature/findCorrelation.ts delete mode 100644 packages/api/src/client/types/tools/ozone/signature/findRelatedAccounts.ts delete mode 100644 packages/api/src/client/types/tools/ozone/signature/searchAccounts.ts delete mode 100644 packages/api/src/client/types/tools/ozone/team/addMember.ts delete mode 100644 packages/api/src/client/types/tools/ozone/team/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/team/deleteMember.ts delete mode 100644 packages/api/src/client/types/tools/ozone/team/listMembers.ts delete mode 100644 packages/api/src/client/types/tools/ozone/team/updateMember.ts delete mode 100644 packages/api/src/client/types/tools/ozone/verification/defs.ts delete mode 100644 packages/api/src/client/types/tools/ozone/verification/grantVerifications.ts delete mode 100644 packages/api/src/client/types/tools/ozone/verification/listVerifications.ts delete mode 100644 packages/api/src/client/types/tools/ozone/verification/revokeVerifications.ts delete mode 100644 packages/api/src/client/util.ts create mode 100644 packages/ozone/.gitignore delete mode 100644 packages/ozone/src/lexicon/index.ts delete mode 100644 packages/ozone/src/lexicon/lexicons.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/getPreferences.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/getProfile.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/getProfiles.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/getSuggestions.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/profile.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/putPreferences.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/searchActors.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/actor/status.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/ageassurance/begin.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/ageassurance/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/ageassurance/getConfig.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/ageassurance/getState.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/bookmark/createBookmark.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/bookmark/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/bookmark/deleteBookmark.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/bookmark/getBookmarks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/dismissMatch.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/getMatches.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/getSyncStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/importContacts.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/removeData.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/sendNotification.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/startPhoneVerification.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/contact/verifyPhone.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/draft/createDraft.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/draft/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/draft/deleteDraft.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/draft/getDrafts.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/draft/updateDraft.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/embed/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/embed/external.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/embed/images.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/embed/record.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/embed/recordWithMedia.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/embed/video.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/generator.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getActorFeeds.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getActorLikes.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getFeed.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getLikes.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getListFeed.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getPostThread.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getPosts.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getQuotes.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getRepostedBy.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/getTimeline.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/like.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/post.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/postgate.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/repost.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/searchPosts.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/sendInteractions.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/feed/threadgate.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/block.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/follow.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getBlocks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getFollowers.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getFollows.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getList.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getListBlocks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getListMutes.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getLists.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getListsWithMembership.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getMutes.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getRelationships.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPack.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPacks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getStarterPacksWithMembership.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/list.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/listblock.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/listitem.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/muteActor.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/muteActorList.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/muteThread.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/starterpack.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActor.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/unmuteActorList.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/unmuteThread.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/graph/verification.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/labeler/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/labeler/getServices.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/labeler/service.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/declaration.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/getPreferences.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/getUnreadCount.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/listActivitySubscriptions.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/listNotifications.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/putActivitySubscription.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/putPreferences.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/putPreferencesV2.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/registerPush.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/unregisterPush.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/notification/updateSeen.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/richtext/facet.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getAgeAssuranceState.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getConfig.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getPostThreadOtherV2.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getPostThreadV2.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedFeeds.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrends.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/initAgeAssurance.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/video/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/video/getJobStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/video/getUploadLimits.ts delete mode 100644 packages/ozone/src/lexicon/types/app/bsky/video/uploadVideo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/actor/declaration.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/actor/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/actor/deleteAccount.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/actor/exportAccountData.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/acceptConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/addReaction.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/getConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoAvailability.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/getConvoMembers.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/getLog.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/getMessages.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/leaveConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/listConvoRequests.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/listConvos.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/lockConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/muteConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/removeReaction.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessage.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/unlockConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/updateAllRead.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/convo/updateRead.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/addMembers.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/approveJoinRequest.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/createGroup.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/createJoinLink.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/disableJoinLink.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/editGroup.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/editJoinLink.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/enableJoinLink.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/getJoinLinkPreview.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/listJoinRequests.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/listMutualGroups.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/rejectJoinRequest.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/removeMembers.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/group/requestJoin.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts delete mode 100644 packages/ozone/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/deleteAccount.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfo.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/getAccountInfos.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/getInviteCodes.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/searchAccounts.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/sendEmail.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/updateAccountSigningKey.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/refreshIdentity.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/resolveDid.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/resolveHandle.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/resolveIdentity.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/signPlcOperation.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/identity/updateHandle.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/label/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/label/queryLabels.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/label/subscribeLabels.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/lexicon/resolveLexicon.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/lexicon/schema.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/moderation/createReport.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/moderation/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/applyWrites.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/createRecord.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/deleteRecord.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/describeRepo.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/getRecord.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/importRepo.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/listRecords.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/putRecord.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/strongRef.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/repo/uploadBlob.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/activateAccount.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/checkAccountStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/confirmEmail.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/createAccount.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/createAppPassword.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/createInviteCode.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/createInviteCodes.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/createSession.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/deactivateAccount.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/deleteAccount.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/deleteSession.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/describeServer.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/getServiceAuth.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/getSession.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/listAppPasswords.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/refreshSession.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/requestAccountDelete.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/requestPasswordReset.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/reserveSigningKey.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/resetPassword.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/revokeAppPassword.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/server/updateEmail.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getBlob.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getBlocks.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getCheckout.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getHead.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getHostStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getLatestCommit.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getRecord.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getRepo.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/getRepoStatus.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/listBlobs.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/listHosts.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/listRepos.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/listReposByCollection.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/requestCrawl.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/sync/subscribeRepos.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/addReservedHandle.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/checkHandleAvailability.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/dereferenceScope.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/fetchLabels.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts delete mode 100644 packages/ozone/src/lexicon/types/com/atproto/temp/revokeAccountCredentials.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/communication/createTemplate.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/communication/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/communication/listTemplates.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/communication/updateTemplate.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/hosting/getAccountHistory.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/emitEvent.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getEvent.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecord.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getRecords.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepo.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getReporterStats.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getRepos.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/getSubjects.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/queryEvents.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/moderation/searchRepos.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/assignModerator.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/createQueue.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/deleteQueue.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/getAssignments.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/listQueues.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/routeReports.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/unassignModerator.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/queue/updateQueue.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/assignModerator.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/createActivity.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getAssignments.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getLatestReport.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getLiveStats.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/getReport.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/listActivities.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/queryReports.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/reassignQueue.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/refreshStats.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/report/unassignModerator.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/safelink/addRule.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/safelink/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/safelink/queryEvents.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/safelink/queryRules.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/safelink/removeRule.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/safelink/updateRule.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/server/getConfig.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/addValues.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/deleteSet.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/deleteValues.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/getValues.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/querySets.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/set/upsertSet.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/setting/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/setting/listOptions.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/setting/removeOptions.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/setting/upsertOption.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/signature/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/signature/findCorrelation.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/signature/searchAccounts.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/team/addMember.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/team/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/team/deleteMember.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/team/listMembers.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/team/updateMember.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/verification/defs.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/verification/grantVerifications.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/verification/listVerifications.ts delete mode 100644 packages/ozone/src/lexicon/types/tools/ozone/verification/revokeVerifications.ts delete mode 100644 packages/ozone/src/lexicon/util.ts diff --git a/.changeset/smooth-feet-taste.md b/.changeset/smooth-feet-taste.md new file mode 100644 index 00000000000..23a41963d8e --- /dev/null +++ b/.changeset/smooth-feet-taste.md @@ -0,0 +1,6 @@ +--- +'@atproto/ozone': patch +'@atproto/api': patch +--- + +Run "lexgen" during CI instead of keeping the generated code in Git diff --git a/.gitattributes b/.gitattributes index 7196697e8a1..c67629eeb96 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,2 @@ -# codegen -packages/api/src/client/** linguist-generated=true -packages/ozone/src/lexicon/** linguist-generated=true - # i18n packages/oauth/oauth-provider-ui/src/locales/**/messages.po linguist-generated=true diff --git a/.github/workflows/repo.yaml b/.github/workflows/repo.yaml index 123ae8a8795..f2321e81e4f 100644 --- a/.github/workflows/repo.yaml +++ b/.github/workflows/repo.yaml @@ -22,7 +22,34 @@ jobs: env: PUPPETEER_SKIP_DOWNLOAD: true + # lex-cli code generation can be a bottleneck. The "prebuild" script in + # the "api" and "ozone" packages only re-runs lex-cli when needed: if the + # generated output is missing, or if any lexicon JSON has a newer mtime + # than the generated files. We cache the generated output keyed on the + # content of the lexicon JSONs (plus the package.json files that define + # the codegen command), so unchanged lexicons restore from cache. + # + # However, on a cache hit we have to fix mtimes by hand. + # `actions/checkout` writes every checked-out file (including + # lexicons/**/*.json) with mtime = checkout time, while `actions/cache` + # restores files with their original archived mtime (older). Without + # intervention, every lexicon JSON looks "newer" than the restored + # generated files and the prebuild script would re-run lex-cli even though + # nothing has changed. Touching the restored files brings their mtime to + # "now", so the prebuild's `find -newer` check correctly reports no newer + # lexicons. + - uses: actions/cache@v4 + id: lex-cli-cache + with: + path: | + packages/api/src/client + packages/ozone/src/lexicon + key: lex-cli-${{ hashFiles('lexicons/**/*.json', 'packages/api/package.json', 'packages/ozone/package.json') }} + - if: steps.lex-cli-cache.outputs.cache-hit == 'true' + run: find packages/api/src/client packages/ozone/src/lexicon -exec touch {} + + - run: pnpm build + - uses: actions/upload-artifact@v4 with: # Preserve the result of codegen and build steps. @@ -37,7 +64,9 @@ jobs: packages/lex/*/tests/lexicons packages/oauth/*/src/lexicons packages/oauth/*/src/locales/*/messages.ts + packages/api/src/client packages/api/src/moderation/const/labels.ts + packages/ozone/src/lexicon changeset: name: Changeset diff --git a/packages/api/.gitignore b/packages/api/.gitignore index be83884b87c..239dba5afae 100644 --- a/packages/api/.gitignore +++ b/packages/api/.gitignore @@ -1,5 +1,5 @@ # @atproto/lex-cli -# src/client +src/client # ./scripts/generate-code.mjs src/moderation/const/labels.ts diff --git a/packages/api/package.json b/packages/api/package.json index c8d036f0ee9..d71451c9593 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -18,8 +18,9 @@ "directory": "packages/api" }, "scripts": { - "codegen": "lex gen-api --yes ./src/client ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/* ../../lexicons/com/germnetwork/*", - "prebuild": "node ./scripts/generate-code.mjs && ([ -f ./src/client/index.ts ] || pnpm run codegen)", + "codegen:lex": "lex gen-api --yes ./src/client ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/* ../../lexicons/com/germnetwork/*", + "codegen:code": "node ./scripts/generate-code.mjs", + "prebuild": "pnpm run codegen:code && if [ ! -f ./src/client/index.ts ] || [ -n \"$(find ../../lexicons -name '*.json' -newer ./src/client/index.ts -type f -print -quit)\" ]; then pnpm run codegen:lex; fi", "build": "tsc --build tsconfig.build.json", "test": "NODE_OPTIONS=--experimental-vm-modules jest" }, diff --git a/packages/api/src/client/index.ts b/packages/api/src/client/index.ts deleted file mode 100644 index 43392230c46..00000000000 --- a/packages/api/src/client/index.ts +++ /dev/null @@ -1,6422 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { - XrpcClient, - type FetchHandler, - type FetchHandlerOptions, -} from '@atproto/xrpc' -import { schemas } from './lexicons.js' -import { CID } from 'multiformats/cid' -import { type OmitKey, type Un$Typed } from './util.js' -import * as AppBskyActorDefs from './types/app/bsky/actor/defs.js' -import * as AppBskyActorGetPreferences from './types/app/bsky/actor/getPreferences.js' -import * as AppBskyActorGetProfile from './types/app/bsky/actor/getProfile.js' -import * as AppBskyActorGetProfiles from './types/app/bsky/actor/getProfiles.js' -import * as AppBskyActorGetSuggestions from './types/app/bsky/actor/getSuggestions.js' -import * as AppBskyActorProfile from './types/app/bsky/actor/profile.js' -import * as AppBskyActorPutPreferences from './types/app/bsky/actor/putPreferences.js' -import * as AppBskyActorSearchActors from './types/app/bsky/actor/searchActors.js' -import * as AppBskyActorSearchActorsTypeahead from './types/app/bsky/actor/searchActorsTypeahead.js' -import * as AppBskyActorStatus from './types/app/bsky/actor/status.js' -import * as AppBskyAgeassuranceBegin from './types/app/bsky/ageassurance/begin.js' -import * as AppBskyAgeassuranceDefs from './types/app/bsky/ageassurance/defs.js' -import * as AppBskyAgeassuranceGetConfig from './types/app/bsky/ageassurance/getConfig.js' -import * as AppBskyAgeassuranceGetState from './types/app/bsky/ageassurance/getState.js' -import * as AppBskyBookmarkCreateBookmark from './types/app/bsky/bookmark/createBookmark.js' -import * as AppBskyBookmarkDefs from './types/app/bsky/bookmark/defs.js' -import * as AppBskyBookmarkDeleteBookmark from './types/app/bsky/bookmark/deleteBookmark.js' -import * as AppBskyBookmarkGetBookmarks from './types/app/bsky/bookmark/getBookmarks.js' -import * as AppBskyContactDefs from './types/app/bsky/contact/defs.js' -import * as AppBskyContactDismissMatch from './types/app/bsky/contact/dismissMatch.js' -import * as AppBskyContactGetMatches from './types/app/bsky/contact/getMatches.js' -import * as AppBskyContactGetSyncStatus from './types/app/bsky/contact/getSyncStatus.js' -import * as AppBskyContactImportContacts from './types/app/bsky/contact/importContacts.js' -import * as AppBskyContactRemoveData from './types/app/bsky/contact/removeData.js' -import * as AppBskyContactSendNotification from './types/app/bsky/contact/sendNotification.js' -import * as AppBskyContactStartPhoneVerification from './types/app/bsky/contact/startPhoneVerification.js' -import * as AppBskyContactVerifyPhone from './types/app/bsky/contact/verifyPhone.js' -import * as AppBskyDraftCreateDraft from './types/app/bsky/draft/createDraft.js' -import * as AppBskyDraftDefs from './types/app/bsky/draft/defs.js' -import * as AppBskyDraftDeleteDraft from './types/app/bsky/draft/deleteDraft.js' -import * as AppBskyDraftGetDrafts from './types/app/bsky/draft/getDrafts.js' -import * as AppBskyDraftUpdateDraft from './types/app/bsky/draft/updateDraft.js' -import * as AppBskyEmbedDefs from './types/app/bsky/embed/defs.js' -import * as AppBskyEmbedExternal from './types/app/bsky/embed/external.js' -import * as AppBskyEmbedImages from './types/app/bsky/embed/images.js' -import * as AppBskyEmbedRecord from './types/app/bsky/embed/record.js' -import * as AppBskyEmbedRecordWithMedia from './types/app/bsky/embed/recordWithMedia.js' -import * as AppBskyEmbedVideo from './types/app/bsky/embed/video.js' -import * as AppBskyFeedDefs from './types/app/bsky/feed/defs.js' -import * as AppBskyFeedDescribeFeedGenerator from './types/app/bsky/feed/describeFeedGenerator.js' -import * as AppBskyFeedGenerator from './types/app/bsky/feed/generator.js' -import * as AppBskyFeedGetActorFeeds from './types/app/bsky/feed/getActorFeeds.js' -import * as AppBskyFeedGetActorLikes from './types/app/bsky/feed/getActorLikes.js' -import * as AppBskyFeedGetAuthorFeed from './types/app/bsky/feed/getAuthorFeed.js' -import * as AppBskyFeedGetFeed from './types/app/bsky/feed/getFeed.js' -import * as AppBskyFeedGetFeedGenerator from './types/app/bsky/feed/getFeedGenerator.js' -import * as AppBskyFeedGetFeedGenerators from './types/app/bsky/feed/getFeedGenerators.js' -import * as AppBskyFeedGetFeedSkeleton from './types/app/bsky/feed/getFeedSkeleton.js' -import * as AppBskyFeedGetLikes from './types/app/bsky/feed/getLikes.js' -import * as AppBskyFeedGetListFeed from './types/app/bsky/feed/getListFeed.js' -import * as AppBskyFeedGetPostThread from './types/app/bsky/feed/getPostThread.js' -import * as AppBskyFeedGetPosts from './types/app/bsky/feed/getPosts.js' -import * as AppBskyFeedGetQuotes from './types/app/bsky/feed/getQuotes.js' -import * as AppBskyFeedGetRepostedBy from './types/app/bsky/feed/getRepostedBy.js' -import * as AppBskyFeedGetSuggestedFeeds from './types/app/bsky/feed/getSuggestedFeeds.js' -import * as AppBskyFeedGetTimeline from './types/app/bsky/feed/getTimeline.js' -import * as AppBskyFeedLike from './types/app/bsky/feed/like.js' -import * as AppBskyFeedPost from './types/app/bsky/feed/post.js' -import * as AppBskyFeedPostgate from './types/app/bsky/feed/postgate.js' -import * as AppBskyFeedRepost from './types/app/bsky/feed/repost.js' -import * as AppBskyFeedSearchPosts from './types/app/bsky/feed/searchPosts.js' -import * as AppBskyFeedSendInteractions from './types/app/bsky/feed/sendInteractions.js' -import * as AppBskyFeedThreadgate from './types/app/bsky/feed/threadgate.js' -import * as AppBskyGraphBlock from './types/app/bsky/graph/block.js' -import * as AppBskyGraphDefs from './types/app/bsky/graph/defs.js' -import * as AppBskyGraphFollow from './types/app/bsky/graph/follow.js' -import * as AppBskyGraphGetActorStarterPacks from './types/app/bsky/graph/getActorStarterPacks.js' -import * as AppBskyGraphGetBlocks from './types/app/bsky/graph/getBlocks.js' -import * as AppBskyGraphGetFollowers from './types/app/bsky/graph/getFollowers.js' -import * as AppBskyGraphGetFollows from './types/app/bsky/graph/getFollows.js' -import * as AppBskyGraphGetKnownFollowers from './types/app/bsky/graph/getKnownFollowers.js' -import * as AppBskyGraphGetList from './types/app/bsky/graph/getList.js' -import * as AppBskyGraphGetListBlocks from './types/app/bsky/graph/getListBlocks.js' -import * as AppBskyGraphGetListMutes from './types/app/bsky/graph/getListMutes.js' -import * as AppBskyGraphGetLists from './types/app/bsky/graph/getLists.js' -import * as AppBskyGraphGetListsWithMembership from './types/app/bsky/graph/getListsWithMembership.js' -import * as AppBskyGraphGetMutes from './types/app/bsky/graph/getMutes.js' -import * as AppBskyGraphGetRelationships from './types/app/bsky/graph/getRelationships.js' -import * as AppBskyGraphGetStarterPack from './types/app/bsky/graph/getStarterPack.js' -import * as AppBskyGraphGetStarterPacks from './types/app/bsky/graph/getStarterPacks.js' -import * as AppBskyGraphGetStarterPacksWithMembership from './types/app/bsky/graph/getStarterPacksWithMembership.js' -import * as AppBskyGraphGetSuggestedFollowsByActor from './types/app/bsky/graph/getSuggestedFollowsByActor.js' -import * as AppBskyGraphList from './types/app/bsky/graph/list.js' -import * as AppBskyGraphListblock from './types/app/bsky/graph/listblock.js' -import * as AppBskyGraphListitem from './types/app/bsky/graph/listitem.js' -import * as AppBskyGraphMuteActor from './types/app/bsky/graph/muteActor.js' -import * as AppBskyGraphMuteActorList from './types/app/bsky/graph/muteActorList.js' -import * as AppBskyGraphMuteThread from './types/app/bsky/graph/muteThread.js' -import * as AppBskyGraphSearchStarterPacks from './types/app/bsky/graph/searchStarterPacks.js' -import * as AppBskyGraphStarterpack from './types/app/bsky/graph/starterpack.js' -import * as AppBskyGraphUnmuteActor from './types/app/bsky/graph/unmuteActor.js' -import * as AppBskyGraphUnmuteActorList from './types/app/bsky/graph/unmuteActorList.js' -import * as AppBskyGraphUnmuteThread from './types/app/bsky/graph/unmuteThread.js' -import * as AppBskyGraphVerification from './types/app/bsky/graph/verification.js' -import * as AppBskyLabelerDefs from './types/app/bsky/labeler/defs.js' -import * as AppBskyLabelerGetServices from './types/app/bsky/labeler/getServices.js' -import * as AppBskyLabelerService from './types/app/bsky/labeler/service.js' -import * as AppBskyNotificationDeclaration from './types/app/bsky/notification/declaration.js' -import * as AppBskyNotificationDefs from './types/app/bsky/notification/defs.js' -import * as AppBskyNotificationGetPreferences from './types/app/bsky/notification/getPreferences.js' -import * as AppBskyNotificationGetUnreadCount from './types/app/bsky/notification/getUnreadCount.js' -import * as AppBskyNotificationListActivitySubscriptions from './types/app/bsky/notification/listActivitySubscriptions.js' -import * as AppBskyNotificationListNotifications from './types/app/bsky/notification/listNotifications.js' -import * as AppBskyNotificationPutActivitySubscription from './types/app/bsky/notification/putActivitySubscription.js' -import * as AppBskyNotificationPutPreferences from './types/app/bsky/notification/putPreferences.js' -import * as AppBskyNotificationPutPreferencesV2 from './types/app/bsky/notification/putPreferencesV2.js' -import * as AppBskyNotificationRegisterPush from './types/app/bsky/notification/registerPush.js' -import * as AppBskyNotificationUnregisterPush from './types/app/bsky/notification/unregisterPush.js' -import * as AppBskyNotificationUpdateSeen from './types/app/bsky/notification/updateSeen.js' -import * as AppBskyRichtextFacet from './types/app/bsky/richtext/facet.js' -import * as AppBskyUnspeccedDefs from './types/app/bsky/unspecced/defs.js' -import * as AppBskyUnspeccedGetAgeAssuranceState from './types/app/bsky/unspecced/getAgeAssuranceState.js' -import * as AppBskyUnspeccedGetConfig from './types/app/bsky/unspecced/getConfig.js' -import * as AppBskyUnspeccedGetOnboardingSuggestedStarterPacks from './types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js' -import * as AppBskyUnspeccedGetOnboardingSuggestedStarterPacksSkeleton from './types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.js' -import * as AppBskyUnspeccedGetOnboardingSuggestedUsersSkeleton from './types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.js' -import * as AppBskyUnspeccedGetPopularFeedGenerators from './types/app/bsky/unspecced/getPopularFeedGenerators.js' -import * as AppBskyUnspeccedGetPostThreadOtherV2 from './types/app/bsky/unspecced/getPostThreadOtherV2.js' -import * as AppBskyUnspeccedGetPostThreadV2 from './types/app/bsky/unspecced/getPostThreadV2.js' -import * as AppBskyUnspeccedGetSuggestedFeeds from './types/app/bsky/unspecced/getSuggestedFeeds.js' -import * as AppBskyUnspeccedGetSuggestedFeedsSkeleton from './types/app/bsky/unspecced/getSuggestedFeedsSkeleton.js' -import * as AppBskyUnspeccedGetSuggestedOnboardingUsers from './types/app/bsky/unspecced/getSuggestedOnboardingUsers.js' -import * as AppBskyUnspeccedGetSuggestedStarterPacks from './types/app/bsky/unspecced/getSuggestedStarterPacks.js' -import * as AppBskyUnspeccedGetSuggestedStarterPacksSkeleton from './types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js' -import * as AppBskyUnspeccedGetSuggestedUsers from './types/app/bsky/unspecced/getSuggestedUsers.js' -import * as AppBskyUnspeccedGetSuggestedUsersForDiscover from './types/app/bsky/unspecced/getSuggestedUsersForDiscover.js' -import * as AppBskyUnspeccedGetSuggestedUsersForDiscoverSkeleton from './types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js' -import * as AppBskyUnspeccedGetSuggestedUsersForExplore from './types/app/bsky/unspecced/getSuggestedUsersForExplore.js' -import * as AppBskyUnspeccedGetSuggestedUsersForExploreSkeleton from './types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js' -import * as AppBskyUnspeccedGetSuggestedUsersForSeeMore from './types/app/bsky/unspecced/getSuggestedUsersForSeeMore.js' -import * as AppBskyUnspeccedGetSuggestedUsersForSeeMoreSkeleton from './types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js' -import * as AppBskyUnspeccedGetSuggestedUsersSkeleton from './types/app/bsky/unspecced/getSuggestedUsersSkeleton.js' -import * as AppBskyUnspeccedGetSuggestionsSkeleton from './types/app/bsky/unspecced/getSuggestionsSkeleton.js' -import * as AppBskyUnspeccedGetTaggedSuggestions from './types/app/bsky/unspecced/getTaggedSuggestions.js' -import * as AppBskyUnspeccedGetTrendingTopics from './types/app/bsky/unspecced/getTrendingTopics.js' -import * as AppBskyUnspeccedGetTrends from './types/app/bsky/unspecced/getTrends.js' -import * as AppBskyUnspeccedGetTrendsSkeleton from './types/app/bsky/unspecced/getTrendsSkeleton.js' -import * as AppBskyUnspeccedInitAgeAssurance from './types/app/bsky/unspecced/initAgeAssurance.js' -import * as AppBskyUnspeccedSearchActorsSkeleton from './types/app/bsky/unspecced/searchActorsSkeleton.js' -import * as AppBskyUnspeccedSearchPostsSkeleton from './types/app/bsky/unspecced/searchPostsSkeleton.js' -import * as AppBskyUnspeccedSearchStarterPacksSkeleton from './types/app/bsky/unspecced/searchStarterPacksSkeleton.js' -import * as AppBskyVideoDefs from './types/app/bsky/video/defs.js' -import * as AppBskyVideoGetJobStatus from './types/app/bsky/video/getJobStatus.js' -import * as AppBskyVideoGetUploadLimits from './types/app/bsky/video/getUploadLimits.js' -import * as AppBskyVideoUploadVideo from './types/app/bsky/video/uploadVideo.js' -import * as ChatBskyActorDeclaration from './types/chat/bsky/actor/declaration.js' -import * as ChatBskyActorDefs from './types/chat/bsky/actor/defs.js' -import * as ChatBskyActorDeleteAccount from './types/chat/bsky/actor/deleteAccount.js' -import * as ChatBskyActorExportAccountData from './types/chat/bsky/actor/exportAccountData.js' -import * as ChatBskyConvoAcceptConvo from './types/chat/bsky/convo/acceptConvo.js' -import * as ChatBskyConvoAddReaction from './types/chat/bsky/convo/addReaction.js' -import * as ChatBskyConvoDefs from './types/chat/bsky/convo/defs.js' -import * as ChatBskyConvoDeleteMessageForSelf from './types/chat/bsky/convo/deleteMessageForSelf.js' -import * as ChatBskyConvoGetConvo from './types/chat/bsky/convo/getConvo.js' -import * as ChatBskyConvoGetConvoAvailability from './types/chat/bsky/convo/getConvoAvailability.js' -import * as ChatBskyConvoGetConvoForMembers from './types/chat/bsky/convo/getConvoForMembers.js' -import * as ChatBskyConvoGetConvoMembers from './types/chat/bsky/convo/getConvoMembers.js' -import * as ChatBskyConvoGetLog from './types/chat/bsky/convo/getLog.js' -import * as ChatBskyConvoGetMessages from './types/chat/bsky/convo/getMessages.js' -import * as ChatBskyConvoLeaveConvo from './types/chat/bsky/convo/leaveConvo.js' -import * as ChatBskyConvoListConvoRequests from './types/chat/bsky/convo/listConvoRequests.js' -import * as ChatBskyConvoListConvos from './types/chat/bsky/convo/listConvos.js' -import * as ChatBskyConvoLockConvo from './types/chat/bsky/convo/lockConvo.js' -import * as ChatBskyConvoMuteConvo from './types/chat/bsky/convo/muteConvo.js' -import * as ChatBskyConvoRemoveReaction from './types/chat/bsky/convo/removeReaction.js' -import * as ChatBskyConvoSendMessage from './types/chat/bsky/convo/sendMessage.js' -import * as ChatBskyConvoSendMessageBatch from './types/chat/bsky/convo/sendMessageBatch.js' -import * as ChatBskyConvoUnlockConvo from './types/chat/bsky/convo/unlockConvo.js' -import * as ChatBskyConvoUnmuteConvo from './types/chat/bsky/convo/unmuteConvo.js' -import * as ChatBskyConvoUpdateAllRead from './types/chat/bsky/convo/updateAllRead.js' -import * as ChatBskyConvoUpdateRead from './types/chat/bsky/convo/updateRead.js' -import * as ChatBskyGroupAddMembers from './types/chat/bsky/group/addMembers.js' -import * as ChatBskyGroupApproveJoinRequest from './types/chat/bsky/group/approveJoinRequest.js' -import * as ChatBskyGroupCreateGroup from './types/chat/bsky/group/createGroup.js' -import * as ChatBskyGroupCreateJoinLink from './types/chat/bsky/group/createJoinLink.js' -import * as ChatBskyGroupDefs from './types/chat/bsky/group/defs.js' -import * as ChatBskyGroupDisableJoinLink from './types/chat/bsky/group/disableJoinLink.js' -import * as ChatBskyGroupEditGroup from './types/chat/bsky/group/editGroup.js' -import * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink.js' -import * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' -import * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' -import * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' -import * as ChatBskyGroupListMutualGroups from './types/chat/bsky/group/listMutualGroups.js' -import * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' -import * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' -import * as ChatBskyGroupRequestJoin from './types/chat/bsky/group/requestJoin.js' -import * as ChatBskyModerationGetActorMetadata from './types/chat/bsky/moderation/getActorMetadata.js' -import * as ChatBskyModerationGetMessageContext from './types/chat/bsky/moderation/getMessageContext.js' -import * as ChatBskyModerationSubscribeModEvents from './types/chat/bsky/moderation/subscribeModEvents.js' -import * as ChatBskyModerationUpdateActorAccess from './types/chat/bsky/moderation/updateActorAccess.js' -import * as ComAtprotoAdminDefs from './types/com/atproto/admin/defs.js' -import * as ComAtprotoAdminDeleteAccount from './types/com/atproto/admin/deleteAccount.js' -import * as ComAtprotoAdminDisableAccountInvites from './types/com/atproto/admin/disableAccountInvites.js' -import * as ComAtprotoAdminDisableInviteCodes from './types/com/atproto/admin/disableInviteCodes.js' -import * as ComAtprotoAdminEnableAccountInvites from './types/com/atproto/admin/enableAccountInvites.js' -import * as ComAtprotoAdminGetAccountInfo from './types/com/atproto/admin/getAccountInfo.js' -import * as ComAtprotoAdminGetAccountInfos from './types/com/atproto/admin/getAccountInfos.js' -import * as ComAtprotoAdminGetInviteCodes from './types/com/atproto/admin/getInviteCodes.js' -import * as ComAtprotoAdminGetSubjectStatus from './types/com/atproto/admin/getSubjectStatus.js' -import * as ComAtprotoAdminSearchAccounts from './types/com/atproto/admin/searchAccounts.js' -import * as ComAtprotoAdminSendEmail from './types/com/atproto/admin/sendEmail.js' -import * as ComAtprotoAdminUpdateAccountEmail from './types/com/atproto/admin/updateAccountEmail.js' -import * as ComAtprotoAdminUpdateAccountHandle from './types/com/atproto/admin/updateAccountHandle.js' -import * as ComAtprotoAdminUpdateAccountPassword from './types/com/atproto/admin/updateAccountPassword.js' -import * as ComAtprotoAdminUpdateAccountSigningKey from './types/com/atproto/admin/updateAccountSigningKey.js' -import * as ComAtprotoAdminUpdateSubjectStatus from './types/com/atproto/admin/updateSubjectStatus.js' -import * as ComAtprotoIdentityDefs from './types/com/atproto/identity/defs.js' -import * as ComAtprotoIdentityGetRecommendedDidCredentials from './types/com/atproto/identity/getRecommendedDidCredentials.js' -import * as ComAtprotoIdentityRefreshIdentity from './types/com/atproto/identity/refreshIdentity.js' -import * as ComAtprotoIdentityRequestPlcOperationSignature from './types/com/atproto/identity/requestPlcOperationSignature.js' -import * as ComAtprotoIdentityResolveDid from './types/com/atproto/identity/resolveDid.js' -import * as ComAtprotoIdentityResolveHandle from './types/com/atproto/identity/resolveHandle.js' -import * as ComAtprotoIdentityResolveIdentity from './types/com/atproto/identity/resolveIdentity.js' -import * as ComAtprotoIdentitySignPlcOperation from './types/com/atproto/identity/signPlcOperation.js' -import * as ComAtprotoIdentitySubmitPlcOperation from './types/com/atproto/identity/submitPlcOperation.js' -import * as ComAtprotoIdentityUpdateHandle from './types/com/atproto/identity/updateHandle.js' -import * as ComAtprotoLabelDefs from './types/com/atproto/label/defs.js' -import * as ComAtprotoLabelQueryLabels from './types/com/atproto/label/queryLabels.js' -import * as ComAtprotoLabelSubscribeLabels from './types/com/atproto/label/subscribeLabels.js' -import * as ComAtprotoLexiconResolveLexicon from './types/com/atproto/lexicon/resolveLexicon.js' -import * as ComAtprotoLexiconSchema from './types/com/atproto/lexicon/schema.js' -import * as ComAtprotoModerationCreateReport from './types/com/atproto/moderation/createReport.js' -import * as ComAtprotoModerationDefs from './types/com/atproto/moderation/defs.js' -import * as ComAtprotoRepoApplyWrites from './types/com/atproto/repo/applyWrites.js' -import * as ComAtprotoRepoCreateRecord from './types/com/atproto/repo/createRecord.js' -import * as ComAtprotoRepoDefs from './types/com/atproto/repo/defs.js' -import * as ComAtprotoRepoDeleteRecord from './types/com/atproto/repo/deleteRecord.js' -import * as ComAtprotoRepoDescribeRepo from './types/com/atproto/repo/describeRepo.js' -import * as ComAtprotoRepoGetRecord from './types/com/atproto/repo/getRecord.js' -import * as ComAtprotoRepoImportRepo from './types/com/atproto/repo/importRepo.js' -import * as ComAtprotoRepoListMissingBlobs from './types/com/atproto/repo/listMissingBlobs.js' -import * as ComAtprotoRepoListRecords from './types/com/atproto/repo/listRecords.js' -import * as ComAtprotoRepoPutRecord from './types/com/atproto/repo/putRecord.js' -import * as ComAtprotoRepoStrongRef from './types/com/atproto/repo/strongRef.js' -import * as ComAtprotoRepoUploadBlob from './types/com/atproto/repo/uploadBlob.js' -import * as ComAtprotoServerActivateAccount from './types/com/atproto/server/activateAccount.js' -import * as ComAtprotoServerCheckAccountStatus from './types/com/atproto/server/checkAccountStatus.js' -import * as ComAtprotoServerConfirmEmail from './types/com/atproto/server/confirmEmail.js' -import * as ComAtprotoServerCreateAccount from './types/com/atproto/server/createAccount.js' -import * as ComAtprotoServerCreateAppPassword from './types/com/atproto/server/createAppPassword.js' -import * as ComAtprotoServerCreateInviteCode from './types/com/atproto/server/createInviteCode.js' -import * as ComAtprotoServerCreateInviteCodes from './types/com/atproto/server/createInviteCodes.js' -import * as ComAtprotoServerCreateSession from './types/com/atproto/server/createSession.js' -import * as ComAtprotoServerDeactivateAccount from './types/com/atproto/server/deactivateAccount.js' -import * as ComAtprotoServerDefs from './types/com/atproto/server/defs.js' -import * as ComAtprotoServerDeleteAccount from './types/com/atproto/server/deleteAccount.js' -import * as ComAtprotoServerDeleteSession from './types/com/atproto/server/deleteSession.js' -import * as ComAtprotoServerDescribeServer from './types/com/atproto/server/describeServer.js' -import * as ComAtprotoServerGetAccountInviteCodes from './types/com/atproto/server/getAccountInviteCodes.js' -import * as ComAtprotoServerGetServiceAuth from './types/com/atproto/server/getServiceAuth.js' -import * as ComAtprotoServerGetSession from './types/com/atproto/server/getSession.js' -import * as ComAtprotoServerListAppPasswords from './types/com/atproto/server/listAppPasswords.js' -import * as ComAtprotoServerRefreshSession from './types/com/atproto/server/refreshSession.js' -import * as ComAtprotoServerRequestAccountDelete from './types/com/atproto/server/requestAccountDelete.js' -import * as ComAtprotoServerRequestEmailConfirmation from './types/com/atproto/server/requestEmailConfirmation.js' -import * as ComAtprotoServerRequestEmailUpdate from './types/com/atproto/server/requestEmailUpdate.js' -import * as ComAtprotoServerRequestPasswordReset from './types/com/atproto/server/requestPasswordReset.js' -import * as ComAtprotoServerReserveSigningKey from './types/com/atproto/server/reserveSigningKey.js' -import * as ComAtprotoServerResetPassword from './types/com/atproto/server/resetPassword.js' -import * as ComAtprotoServerRevokeAppPassword from './types/com/atproto/server/revokeAppPassword.js' -import * as ComAtprotoServerUpdateEmail from './types/com/atproto/server/updateEmail.js' -import * as ComAtprotoSyncDefs from './types/com/atproto/sync/defs.js' -import * as ComAtprotoSyncGetBlob from './types/com/atproto/sync/getBlob.js' -import * as ComAtprotoSyncGetBlocks from './types/com/atproto/sync/getBlocks.js' -import * as ComAtprotoSyncGetCheckout from './types/com/atproto/sync/getCheckout.js' -import * as ComAtprotoSyncGetHead from './types/com/atproto/sync/getHead.js' -import * as ComAtprotoSyncGetHostStatus from './types/com/atproto/sync/getHostStatus.js' -import * as ComAtprotoSyncGetLatestCommit from './types/com/atproto/sync/getLatestCommit.js' -import * as ComAtprotoSyncGetRecord from './types/com/atproto/sync/getRecord.js' -import * as ComAtprotoSyncGetRepo from './types/com/atproto/sync/getRepo.js' -import * as ComAtprotoSyncGetRepoStatus from './types/com/atproto/sync/getRepoStatus.js' -import * as ComAtprotoSyncListBlobs from './types/com/atproto/sync/listBlobs.js' -import * as ComAtprotoSyncListHosts from './types/com/atproto/sync/listHosts.js' -import * as ComAtprotoSyncListRepos from './types/com/atproto/sync/listRepos.js' -import * as ComAtprotoSyncListReposByCollection from './types/com/atproto/sync/listReposByCollection.js' -import * as ComAtprotoSyncNotifyOfUpdate from './types/com/atproto/sync/notifyOfUpdate.js' -import * as ComAtprotoSyncRequestCrawl from './types/com/atproto/sync/requestCrawl.js' -import * as ComAtprotoSyncSubscribeRepos from './types/com/atproto/sync/subscribeRepos.js' -import * as ComAtprotoTempAddReservedHandle from './types/com/atproto/temp/addReservedHandle.js' -import * as ComAtprotoTempCheckHandleAvailability from './types/com/atproto/temp/checkHandleAvailability.js' -import * as ComAtprotoTempCheckSignupQueue from './types/com/atproto/temp/checkSignupQueue.js' -import * as ComAtprotoTempDereferenceScope from './types/com/atproto/temp/dereferenceScope.js' -import * as ComAtprotoTempFetchLabels from './types/com/atproto/temp/fetchLabels.js' -import * as ComAtprotoTempRequestPhoneVerification from './types/com/atproto/temp/requestPhoneVerification.js' -import * as ComAtprotoTempRevokeAccountCredentials from './types/com/atproto/temp/revokeAccountCredentials.js' -import * as ComGermnetworkDeclaration from './types/com/germnetwork/declaration.js' -import * as ToolsOzoneCommunicationCreateTemplate from './types/tools/ozone/communication/createTemplate.js' -import * as ToolsOzoneCommunicationDefs from './types/tools/ozone/communication/defs.js' -import * as ToolsOzoneCommunicationDeleteTemplate from './types/tools/ozone/communication/deleteTemplate.js' -import * as ToolsOzoneCommunicationListTemplates from './types/tools/ozone/communication/listTemplates.js' -import * as ToolsOzoneCommunicationUpdateTemplate from './types/tools/ozone/communication/updateTemplate.js' -import * as ToolsOzoneHostingGetAccountHistory from './types/tools/ozone/hosting/getAccountHistory.js' -import * as ToolsOzoneModerationCancelScheduledActions from './types/tools/ozone/moderation/cancelScheduledActions.js' -import * as ToolsOzoneModerationDefs from './types/tools/ozone/moderation/defs.js' -import * as ToolsOzoneModerationEmitEvent from './types/tools/ozone/moderation/emitEvent.js' -import * as ToolsOzoneModerationGetAccountTimeline from './types/tools/ozone/moderation/getAccountTimeline.js' -import * as ToolsOzoneModerationGetEvent from './types/tools/ozone/moderation/getEvent.js' -import * as ToolsOzoneModerationGetRecord from './types/tools/ozone/moderation/getRecord.js' -import * as ToolsOzoneModerationGetRecords from './types/tools/ozone/moderation/getRecords.js' -import * as ToolsOzoneModerationGetRepo from './types/tools/ozone/moderation/getRepo.js' -import * as ToolsOzoneModerationGetReporterStats from './types/tools/ozone/moderation/getReporterStats.js' -import * as ToolsOzoneModerationGetRepos from './types/tools/ozone/moderation/getRepos.js' -import * as ToolsOzoneModerationGetSubjects from './types/tools/ozone/moderation/getSubjects.js' -import * as ToolsOzoneModerationListScheduledActions from './types/tools/ozone/moderation/listScheduledActions.js' -import * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation/queryEvents.js' -import * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js' -import * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js' -import * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js' -import * as ToolsOzoneQueueAssignModerator from './types/tools/ozone/queue/assignModerator.js' -import * as ToolsOzoneQueueCreateQueue from './types/tools/ozone/queue/createQueue.js' -import * as ToolsOzoneQueueDefs from './types/tools/ozone/queue/defs.js' -import * as ToolsOzoneQueueDeleteQueue from './types/tools/ozone/queue/deleteQueue.js' -import * as ToolsOzoneQueueGetAssignments from './types/tools/ozone/queue/getAssignments.js' -import * as ToolsOzoneQueueListQueues from './types/tools/ozone/queue/listQueues.js' -import * as ToolsOzoneQueueRouteReports from './types/tools/ozone/queue/routeReports.js' -import * as ToolsOzoneQueueUnassignModerator from './types/tools/ozone/queue/unassignModerator.js' -import * as ToolsOzoneQueueUpdateQueue from './types/tools/ozone/queue/updateQueue.js' -import * as ToolsOzoneReportAssignModerator from './types/tools/ozone/report/assignModerator.js' -import * as ToolsOzoneReportCreateActivity from './types/tools/ozone/report/createActivity.js' -import * as ToolsOzoneReportDefs from './types/tools/ozone/report/defs.js' -import * as ToolsOzoneReportGetAssignments from './types/tools/ozone/report/getAssignments.js' -import * as ToolsOzoneReportGetHistoricalStats from './types/tools/ozone/report/getHistoricalStats.js' -import * as ToolsOzoneReportGetLatestReport from './types/tools/ozone/report/getLatestReport.js' -import * as ToolsOzoneReportGetLiveStats from './types/tools/ozone/report/getLiveStats.js' -import * as ToolsOzoneReportGetReport from './types/tools/ozone/report/getReport.js' -import * as ToolsOzoneReportListActivities from './types/tools/ozone/report/listActivities.js' -import * as ToolsOzoneReportQueryReports from './types/tools/ozone/report/queryReports.js' -import * as ToolsOzoneReportReassignQueue from './types/tools/ozone/report/reassignQueue.js' -import * as ToolsOzoneReportRefreshStats from './types/tools/ozone/report/refreshStats.js' -import * as ToolsOzoneReportUnassignModerator from './types/tools/ozone/report/unassignModerator.js' -import * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js' -import * as ToolsOzoneSafelinkDefs from './types/tools/ozone/safelink/defs.js' -import * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js' -import * as ToolsOzoneSafelinkQueryRules from './types/tools/ozone/safelink/queryRules.js' -import * as ToolsOzoneSafelinkRemoveRule from './types/tools/ozone/safelink/removeRule.js' -import * as ToolsOzoneSafelinkUpdateRule from './types/tools/ozone/safelink/updateRule.js' -import * as ToolsOzoneServerGetConfig from './types/tools/ozone/server/getConfig.js' -import * as ToolsOzoneSetAddValues from './types/tools/ozone/set/addValues.js' -import * as ToolsOzoneSetDefs from './types/tools/ozone/set/defs.js' -import * as ToolsOzoneSetDeleteSet from './types/tools/ozone/set/deleteSet.js' -import * as ToolsOzoneSetDeleteValues from './types/tools/ozone/set/deleteValues.js' -import * as ToolsOzoneSetGetValues from './types/tools/ozone/set/getValues.js' -import * as ToolsOzoneSetQuerySets from './types/tools/ozone/set/querySets.js' -import * as ToolsOzoneSetUpsertSet from './types/tools/ozone/set/upsertSet.js' -import * as ToolsOzoneSettingDefs from './types/tools/ozone/setting/defs.js' -import * as ToolsOzoneSettingListOptions from './types/tools/ozone/setting/listOptions.js' -import * as ToolsOzoneSettingRemoveOptions from './types/tools/ozone/setting/removeOptions.js' -import * as ToolsOzoneSettingUpsertOption from './types/tools/ozone/setting/upsertOption.js' -import * as ToolsOzoneSignatureDefs from './types/tools/ozone/signature/defs.js' -import * as ToolsOzoneSignatureFindCorrelation from './types/tools/ozone/signature/findCorrelation.js' -import * as ToolsOzoneSignatureFindRelatedAccounts from './types/tools/ozone/signature/findRelatedAccounts.js' -import * as ToolsOzoneSignatureSearchAccounts from './types/tools/ozone/signature/searchAccounts.js' -import * as ToolsOzoneTeamAddMember from './types/tools/ozone/team/addMember.js' -import * as ToolsOzoneTeamDefs from './types/tools/ozone/team/defs.js' -import * as ToolsOzoneTeamDeleteMember from './types/tools/ozone/team/deleteMember.js' -import * as ToolsOzoneTeamListMembers from './types/tools/ozone/team/listMembers.js' -import * as ToolsOzoneTeamUpdateMember from './types/tools/ozone/team/updateMember.js' -import * as ToolsOzoneVerificationDefs from './types/tools/ozone/verification/defs.js' -import * as ToolsOzoneVerificationGrantVerifications from './types/tools/ozone/verification/grantVerifications.js' -import * as ToolsOzoneVerificationListVerifications from './types/tools/ozone/verification/listVerifications.js' -import * as ToolsOzoneVerificationRevokeVerifications from './types/tools/ozone/verification/revokeVerifications.js' - -export * as AppBskyActorDefs from './types/app/bsky/actor/defs.js' -export * as AppBskyActorGetPreferences from './types/app/bsky/actor/getPreferences.js' -export * as AppBskyActorGetProfile from './types/app/bsky/actor/getProfile.js' -export * as AppBskyActorGetProfiles from './types/app/bsky/actor/getProfiles.js' -export * as AppBskyActorGetSuggestions from './types/app/bsky/actor/getSuggestions.js' -export * as AppBskyActorProfile from './types/app/bsky/actor/profile.js' -export * as AppBskyActorPutPreferences from './types/app/bsky/actor/putPreferences.js' -export * as AppBskyActorSearchActors from './types/app/bsky/actor/searchActors.js' -export * as AppBskyActorSearchActorsTypeahead from './types/app/bsky/actor/searchActorsTypeahead.js' -export * as AppBskyActorStatus from './types/app/bsky/actor/status.js' -export * as AppBskyAgeassuranceBegin from './types/app/bsky/ageassurance/begin.js' -export * as AppBskyAgeassuranceDefs from './types/app/bsky/ageassurance/defs.js' -export * as AppBskyAgeassuranceGetConfig from './types/app/bsky/ageassurance/getConfig.js' -export * as AppBskyAgeassuranceGetState from './types/app/bsky/ageassurance/getState.js' -export * as AppBskyBookmarkCreateBookmark from './types/app/bsky/bookmark/createBookmark.js' -export * as AppBskyBookmarkDefs from './types/app/bsky/bookmark/defs.js' -export * as AppBskyBookmarkDeleteBookmark from './types/app/bsky/bookmark/deleteBookmark.js' -export * as AppBskyBookmarkGetBookmarks from './types/app/bsky/bookmark/getBookmarks.js' -export * as AppBskyContactDefs from './types/app/bsky/contact/defs.js' -export * as AppBskyContactDismissMatch from './types/app/bsky/contact/dismissMatch.js' -export * as AppBskyContactGetMatches from './types/app/bsky/contact/getMatches.js' -export * as AppBskyContactGetSyncStatus from './types/app/bsky/contact/getSyncStatus.js' -export * as AppBskyContactImportContacts from './types/app/bsky/contact/importContacts.js' -export * as AppBskyContactRemoveData from './types/app/bsky/contact/removeData.js' -export * as AppBskyContactSendNotification from './types/app/bsky/contact/sendNotification.js' -export * as AppBskyContactStartPhoneVerification from './types/app/bsky/contact/startPhoneVerification.js' -export * as AppBskyContactVerifyPhone from './types/app/bsky/contact/verifyPhone.js' -export * as AppBskyDraftCreateDraft from './types/app/bsky/draft/createDraft.js' -export * as AppBskyDraftDefs from './types/app/bsky/draft/defs.js' -export * as AppBskyDraftDeleteDraft from './types/app/bsky/draft/deleteDraft.js' -export * as AppBskyDraftGetDrafts from './types/app/bsky/draft/getDrafts.js' -export * as AppBskyDraftUpdateDraft from './types/app/bsky/draft/updateDraft.js' -export * as AppBskyEmbedDefs from './types/app/bsky/embed/defs.js' -export * as AppBskyEmbedExternal from './types/app/bsky/embed/external.js' -export * as AppBskyEmbedImages from './types/app/bsky/embed/images.js' -export * as AppBskyEmbedRecord from './types/app/bsky/embed/record.js' -export * as AppBskyEmbedRecordWithMedia from './types/app/bsky/embed/recordWithMedia.js' -export * as AppBskyEmbedVideo from './types/app/bsky/embed/video.js' -export * as AppBskyFeedDefs from './types/app/bsky/feed/defs.js' -export * as AppBskyFeedDescribeFeedGenerator from './types/app/bsky/feed/describeFeedGenerator.js' -export * as AppBskyFeedGenerator from './types/app/bsky/feed/generator.js' -export * as AppBskyFeedGetActorFeeds from './types/app/bsky/feed/getActorFeeds.js' -export * as AppBskyFeedGetActorLikes from './types/app/bsky/feed/getActorLikes.js' -export * as AppBskyFeedGetAuthorFeed from './types/app/bsky/feed/getAuthorFeed.js' -export * as AppBskyFeedGetFeed from './types/app/bsky/feed/getFeed.js' -export * as AppBskyFeedGetFeedGenerator from './types/app/bsky/feed/getFeedGenerator.js' -export * as AppBskyFeedGetFeedGenerators from './types/app/bsky/feed/getFeedGenerators.js' -export * as AppBskyFeedGetFeedSkeleton from './types/app/bsky/feed/getFeedSkeleton.js' -export * as AppBskyFeedGetLikes from './types/app/bsky/feed/getLikes.js' -export * as AppBskyFeedGetListFeed from './types/app/bsky/feed/getListFeed.js' -export * as AppBskyFeedGetPostThread from './types/app/bsky/feed/getPostThread.js' -export * as AppBskyFeedGetPosts from './types/app/bsky/feed/getPosts.js' -export * as AppBskyFeedGetQuotes from './types/app/bsky/feed/getQuotes.js' -export * as AppBskyFeedGetRepostedBy from './types/app/bsky/feed/getRepostedBy.js' -export * as AppBskyFeedGetSuggestedFeeds from './types/app/bsky/feed/getSuggestedFeeds.js' -export * as AppBskyFeedGetTimeline from './types/app/bsky/feed/getTimeline.js' -export * as AppBskyFeedLike from './types/app/bsky/feed/like.js' -export * as AppBskyFeedPost from './types/app/bsky/feed/post.js' -export * as AppBskyFeedPostgate from './types/app/bsky/feed/postgate.js' -export * as AppBskyFeedRepost from './types/app/bsky/feed/repost.js' -export * as AppBskyFeedSearchPosts from './types/app/bsky/feed/searchPosts.js' -export * as AppBskyFeedSendInteractions from './types/app/bsky/feed/sendInteractions.js' -export * as AppBskyFeedThreadgate from './types/app/bsky/feed/threadgate.js' -export * as AppBskyGraphBlock from './types/app/bsky/graph/block.js' -export * as AppBskyGraphDefs from './types/app/bsky/graph/defs.js' -export * as AppBskyGraphFollow from './types/app/bsky/graph/follow.js' -export * as AppBskyGraphGetActorStarterPacks from './types/app/bsky/graph/getActorStarterPacks.js' -export * as AppBskyGraphGetBlocks from './types/app/bsky/graph/getBlocks.js' -export * as AppBskyGraphGetFollowers from './types/app/bsky/graph/getFollowers.js' -export * as AppBskyGraphGetFollows from './types/app/bsky/graph/getFollows.js' -export * as AppBskyGraphGetKnownFollowers from './types/app/bsky/graph/getKnownFollowers.js' -export * as AppBskyGraphGetList from './types/app/bsky/graph/getList.js' -export * as AppBskyGraphGetListBlocks from './types/app/bsky/graph/getListBlocks.js' -export * as AppBskyGraphGetListMutes from './types/app/bsky/graph/getListMutes.js' -export * as AppBskyGraphGetLists from './types/app/bsky/graph/getLists.js' -export * as AppBskyGraphGetListsWithMembership from './types/app/bsky/graph/getListsWithMembership.js' -export * as AppBskyGraphGetMutes from './types/app/bsky/graph/getMutes.js' -export * as AppBskyGraphGetRelationships from './types/app/bsky/graph/getRelationships.js' -export * as AppBskyGraphGetStarterPack from './types/app/bsky/graph/getStarterPack.js' -export * as AppBskyGraphGetStarterPacks from './types/app/bsky/graph/getStarterPacks.js' -export * as AppBskyGraphGetStarterPacksWithMembership from './types/app/bsky/graph/getStarterPacksWithMembership.js' -export * as AppBskyGraphGetSuggestedFollowsByActor from './types/app/bsky/graph/getSuggestedFollowsByActor.js' -export * as AppBskyGraphList from './types/app/bsky/graph/list.js' -export * as AppBskyGraphListblock from './types/app/bsky/graph/listblock.js' -export * as AppBskyGraphListitem from './types/app/bsky/graph/listitem.js' -export * as AppBskyGraphMuteActor from './types/app/bsky/graph/muteActor.js' -export * as AppBskyGraphMuteActorList from './types/app/bsky/graph/muteActorList.js' -export * as AppBskyGraphMuteThread from './types/app/bsky/graph/muteThread.js' -export * as AppBskyGraphSearchStarterPacks from './types/app/bsky/graph/searchStarterPacks.js' -export * as AppBskyGraphStarterpack from './types/app/bsky/graph/starterpack.js' -export * as AppBskyGraphUnmuteActor from './types/app/bsky/graph/unmuteActor.js' -export * as AppBskyGraphUnmuteActorList from './types/app/bsky/graph/unmuteActorList.js' -export * as AppBskyGraphUnmuteThread from './types/app/bsky/graph/unmuteThread.js' -export * as AppBskyGraphVerification from './types/app/bsky/graph/verification.js' -export * as AppBskyLabelerDefs from './types/app/bsky/labeler/defs.js' -export * as AppBskyLabelerGetServices from './types/app/bsky/labeler/getServices.js' -export * as AppBskyLabelerService from './types/app/bsky/labeler/service.js' -export * as AppBskyNotificationDeclaration from './types/app/bsky/notification/declaration.js' -export * as AppBskyNotificationDefs from './types/app/bsky/notification/defs.js' -export * as AppBskyNotificationGetPreferences from './types/app/bsky/notification/getPreferences.js' -export * as AppBskyNotificationGetUnreadCount from './types/app/bsky/notification/getUnreadCount.js' -export * as AppBskyNotificationListActivitySubscriptions from './types/app/bsky/notification/listActivitySubscriptions.js' -export * as AppBskyNotificationListNotifications from './types/app/bsky/notification/listNotifications.js' -export * as AppBskyNotificationPutActivitySubscription from './types/app/bsky/notification/putActivitySubscription.js' -export * as AppBskyNotificationPutPreferences from './types/app/bsky/notification/putPreferences.js' -export * as AppBskyNotificationPutPreferencesV2 from './types/app/bsky/notification/putPreferencesV2.js' -export * as AppBskyNotificationRegisterPush from './types/app/bsky/notification/registerPush.js' -export * as AppBskyNotificationUnregisterPush from './types/app/bsky/notification/unregisterPush.js' -export * as AppBskyNotificationUpdateSeen from './types/app/bsky/notification/updateSeen.js' -export * as AppBskyRichtextFacet from './types/app/bsky/richtext/facet.js' -export * as AppBskyUnspeccedDefs from './types/app/bsky/unspecced/defs.js' -export * as AppBskyUnspeccedGetAgeAssuranceState from './types/app/bsky/unspecced/getAgeAssuranceState.js' -export * as AppBskyUnspeccedGetConfig from './types/app/bsky/unspecced/getConfig.js' -export * as AppBskyUnspeccedGetOnboardingSuggestedStarterPacks from './types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.js' -export * as AppBskyUnspeccedGetOnboardingSuggestedStarterPacksSkeleton from './types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.js' -export * as AppBskyUnspeccedGetOnboardingSuggestedUsersSkeleton from './types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.js' -export * as AppBskyUnspeccedGetPopularFeedGenerators from './types/app/bsky/unspecced/getPopularFeedGenerators.js' -export * as AppBskyUnspeccedGetPostThreadOtherV2 from './types/app/bsky/unspecced/getPostThreadOtherV2.js' -export * as AppBskyUnspeccedGetPostThreadV2 from './types/app/bsky/unspecced/getPostThreadV2.js' -export * as AppBskyUnspeccedGetSuggestedFeeds from './types/app/bsky/unspecced/getSuggestedFeeds.js' -export * as AppBskyUnspeccedGetSuggestedFeedsSkeleton from './types/app/bsky/unspecced/getSuggestedFeedsSkeleton.js' -export * as AppBskyUnspeccedGetSuggestedOnboardingUsers from './types/app/bsky/unspecced/getSuggestedOnboardingUsers.js' -export * as AppBskyUnspeccedGetSuggestedStarterPacks from './types/app/bsky/unspecced/getSuggestedStarterPacks.js' -export * as AppBskyUnspeccedGetSuggestedStarterPacksSkeleton from './types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.js' -export * as AppBskyUnspeccedGetSuggestedUsers from './types/app/bsky/unspecced/getSuggestedUsers.js' -export * as AppBskyUnspeccedGetSuggestedUsersForDiscover from './types/app/bsky/unspecced/getSuggestedUsersForDiscover.js' -export * as AppBskyUnspeccedGetSuggestedUsersForDiscoverSkeleton from './types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.js' -export * as AppBskyUnspeccedGetSuggestedUsersForExplore from './types/app/bsky/unspecced/getSuggestedUsersForExplore.js' -export * as AppBskyUnspeccedGetSuggestedUsersForExploreSkeleton from './types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.js' -export * as AppBskyUnspeccedGetSuggestedUsersForSeeMore from './types/app/bsky/unspecced/getSuggestedUsersForSeeMore.js' -export * as AppBskyUnspeccedGetSuggestedUsersForSeeMoreSkeleton from './types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.js' -export * as AppBskyUnspeccedGetSuggestedUsersSkeleton from './types/app/bsky/unspecced/getSuggestedUsersSkeleton.js' -export * as AppBskyUnspeccedGetSuggestionsSkeleton from './types/app/bsky/unspecced/getSuggestionsSkeleton.js' -export * as AppBskyUnspeccedGetTaggedSuggestions from './types/app/bsky/unspecced/getTaggedSuggestions.js' -export * as AppBskyUnspeccedGetTrendingTopics from './types/app/bsky/unspecced/getTrendingTopics.js' -export * as AppBskyUnspeccedGetTrends from './types/app/bsky/unspecced/getTrends.js' -export * as AppBskyUnspeccedGetTrendsSkeleton from './types/app/bsky/unspecced/getTrendsSkeleton.js' -export * as AppBskyUnspeccedInitAgeAssurance from './types/app/bsky/unspecced/initAgeAssurance.js' -export * as AppBskyUnspeccedSearchActorsSkeleton from './types/app/bsky/unspecced/searchActorsSkeleton.js' -export * as AppBskyUnspeccedSearchPostsSkeleton from './types/app/bsky/unspecced/searchPostsSkeleton.js' -export * as AppBskyUnspeccedSearchStarterPacksSkeleton from './types/app/bsky/unspecced/searchStarterPacksSkeleton.js' -export * as AppBskyVideoDefs from './types/app/bsky/video/defs.js' -export * as AppBskyVideoGetJobStatus from './types/app/bsky/video/getJobStatus.js' -export * as AppBskyVideoGetUploadLimits from './types/app/bsky/video/getUploadLimits.js' -export * as AppBskyVideoUploadVideo from './types/app/bsky/video/uploadVideo.js' -export * as ChatBskyActorDeclaration from './types/chat/bsky/actor/declaration.js' -export * as ChatBskyActorDefs from './types/chat/bsky/actor/defs.js' -export * as ChatBskyActorDeleteAccount from './types/chat/bsky/actor/deleteAccount.js' -export * as ChatBskyActorExportAccountData from './types/chat/bsky/actor/exportAccountData.js' -export * as ChatBskyConvoAcceptConvo from './types/chat/bsky/convo/acceptConvo.js' -export * as ChatBskyConvoAddReaction from './types/chat/bsky/convo/addReaction.js' -export * as ChatBskyConvoDefs from './types/chat/bsky/convo/defs.js' -export * as ChatBskyConvoDeleteMessageForSelf from './types/chat/bsky/convo/deleteMessageForSelf.js' -export * as ChatBskyConvoGetConvo from './types/chat/bsky/convo/getConvo.js' -export * as ChatBskyConvoGetConvoAvailability from './types/chat/bsky/convo/getConvoAvailability.js' -export * as ChatBskyConvoGetConvoForMembers from './types/chat/bsky/convo/getConvoForMembers.js' -export * as ChatBskyConvoGetConvoMembers from './types/chat/bsky/convo/getConvoMembers.js' -export * as ChatBskyConvoGetLog from './types/chat/bsky/convo/getLog.js' -export * as ChatBskyConvoGetMessages from './types/chat/bsky/convo/getMessages.js' -export * as ChatBskyConvoLeaveConvo from './types/chat/bsky/convo/leaveConvo.js' -export * as ChatBskyConvoListConvoRequests from './types/chat/bsky/convo/listConvoRequests.js' -export * as ChatBskyConvoListConvos from './types/chat/bsky/convo/listConvos.js' -export * as ChatBskyConvoLockConvo from './types/chat/bsky/convo/lockConvo.js' -export * as ChatBskyConvoMuteConvo from './types/chat/bsky/convo/muteConvo.js' -export * as ChatBskyConvoRemoveReaction from './types/chat/bsky/convo/removeReaction.js' -export * as ChatBskyConvoSendMessage from './types/chat/bsky/convo/sendMessage.js' -export * as ChatBskyConvoSendMessageBatch from './types/chat/bsky/convo/sendMessageBatch.js' -export * as ChatBskyConvoUnlockConvo from './types/chat/bsky/convo/unlockConvo.js' -export * as ChatBskyConvoUnmuteConvo from './types/chat/bsky/convo/unmuteConvo.js' -export * as ChatBskyConvoUpdateAllRead from './types/chat/bsky/convo/updateAllRead.js' -export * as ChatBskyConvoUpdateRead from './types/chat/bsky/convo/updateRead.js' -export * as ChatBskyGroupAddMembers from './types/chat/bsky/group/addMembers.js' -export * as ChatBskyGroupApproveJoinRequest from './types/chat/bsky/group/approveJoinRequest.js' -export * as ChatBskyGroupCreateGroup from './types/chat/bsky/group/createGroup.js' -export * as ChatBskyGroupCreateJoinLink from './types/chat/bsky/group/createJoinLink.js' -export * as ChatBskyGroupDefs from './types/chat/bsky/group/defs.js' -export * as ChatBskyGroupDisableJoinLink from './types/chat/bsky/group/disableJoinLink.js' -export * as ChatBskyGroupEditGroup from './types/chat/bsky/group/editGroup.js' -export * as ChatBskyGroupEditJoinLink from './types/chat/bsky/group/editJoinLink.js' -export * as ChatBskyGroupEnableJoinLink from './types/chat/bsky/group/enableJoinLink.js' -export * as ChatBskyGroupGetJoinLinkPreview from './types/chat/bsky/group/getJoinLinkPreview.js' -export * as ChatBskyGroupListJoinRequests from './types/chat/bsky/group/listJoinRequests.js' -export * as ChatBskyGroupListMutualGroups from './types/chat/bsky/group/listMutualGroups.js' -export * as ChatBskyGroupRejectJoinRequest from './types/chat/bsky/group/rejectJoinRequest.js' -export * as ChatBskyGroupRemoveMembers from './types/chat/bsky/group/removeMembers.js' -export * as ChatBskyGroupRequestJoin from './types/chat/bsky/group/requestJoin.js' -export * as ChatBskyModerationGetActorMetadata from './types/chat/bsky/moderation/getActorMetadata.js' -export * as ChatBskyModerationGetMessageContext from './types/chat/bsky/moderation/getMessageContext.js' -export * as ChatBskyModerationSubscribeModEvents from './types/chat/bsky/moderation/subscribeModEvents.js' -export * as ChatBskyModerationUpdateActorAccess from './types/chat/bsky/moderation/updateActorAccess.js' -export * as ComAtprotoAdminDefs from './types/com/atproto/admin/defs.js' -export * as ComAtprotoAdminDeleteAccount from './types/com/atproto/admin/deleteAccount.js' -export * as ComAtprotoAdminDisableAccountInvites from './types/com/atproto/admin/disableAccountInvites.js' -export * as ComAtprotoAdminDisableInviteCodes from './types/com/atproto/admin/disableInviteCodes.js' -export * as ComAtprotoAdminEnableAccountInvites from './types/com/atproto/admin/enableAccountInvites.js' -export * as ComAtprotoAdminGetAccountInfo from './types/com/atproto/admin/getAccountInfo.js' -export * as ComAtprotoAdminGetAccountInfos from './types/com/atproto/admin/getAccountInfos.js' -export * as ComAtprotoAdminGetInviteCodes from './types/com/atproto/admin/getInviteCodes.js' -export * as ComAtprotoAdminGetSubjectStatus from './types/com/atproto/admin/getSubjectStatus.js' -export * as ComAtprotoAdminSearchAccounts from './types/com/atproto/admin/searchAccounts.js' -export * as ComAtprotoAdminSendEmail from './types/com/atproto/admin/sendEmail.js' -export * as ComAtprotoAdminUpdateAccountEmail from './types/com/atproto/admin/updateAccountEmail.js' -export * as ComAtprotoAdminUpdateAccountHandle from './types/com/atproto/admin/updateAccountHandle.js' -export * as ComAtprotoAdminUpdateAccountPassword from './types/com/atproto/admin/updateAccountPassword.js' -export * as ComAtprotoAdminUpdateAccountSigningKey from './types/com/atproto/admin/updateAccountSigningKey.js' -export * as ComAtprotoAdminUpdateSubjectStatus from './types/com/atproto/admin/updateSubjectStatus.js' -export * as ComAtprotoIdentityDefs from './types/com/atproto/identity/defs.js' -export * as ComAtprotoIdentityGetRecommendedDidCredentials from './types/com/atproto/identity/getRecommendedDidCredentials.js' -export * as ComAtprotoIdentityRefreshIdentity from './types/com/atproto/identity/refreshIdentity.js' -export * as ComAtprotoIdentityRequestPlcOperationSignature from './types/com/atproto/identity/requestPlcOperationSignature.js' -export * as ComAtprotoIdentityResolveDid from './types/com/atproto/identity/resolveDid.js' -export * as ComAtprotoIdentityResolveHandle from './types/com/atproto/identity/resolveHandle.js' -export * as ComAtprotoIdentityResolveIdentity from './types/com/atproto/identity/resolveIdentity.js' -export * as ComAtprotoIdentitySignPlcOperation from './types/com/atproto/identity/signPlcOperation.js' -export * as ComAtprotoIdentitySubmitPlcOperation from './types/com/atproto/identity/submitPlcOperation.js' -export * as ComAtprotoIdentityUpdateHandle from './types/com/atproto/identity/updateHandle.js' -export * as ComAtprotoLabelDefs from './types/com/atproto/label/defs.js' -export * as ComAtprotoLabelQueryLabels from './types/com/atproto/label/queryLabels.js' -export * as ComAtprotoLabelSubscribeLabels from './types/com/atproto/label/subscribeLabels.js' -export * as ComAtprotoLexiconResolveLexicon from './types/com/atproto/lexicon/resolveLexicon.js' -export * as ComAtprotoLexiconSchema from './types/com/atproto/lexicon/schema.js' -export * as ComAtprotoModerationCreateReport from './types/com/atproto/moderation/createReport.js' -export * as ComAtprotoModerationDefs from './types/com/atproto/moderation/defs.js' -export * as ComAtprotoRepoApplyWrites from './types/com/atproto/repo/applyWrites.js' -export * as ComAtprotoRepoCreateRecord from './types/com/atproto/repo/createRecord.js' -export * as ComAtprotoRepoDefs from './types/com/atproto/repo/defs.js' -export * as ComAtprotoRepoDeleteRecord from './types/com/atproto/repo/deleteRecord.js' -export * as ComAtprotoRepoDescribeRepo from './types/com/atproto/repo/describeRepo.js' -export * as ComAtprotoRepoGetRecord from './types/com/atproto/repo/getRecord.js' -export * as ComAtprotoRepoImportRepo from './types/com/atproto/repo/importRepo.js' -export * as ComAtprotoRepoListMissingBlobs from './types/com/atproto/repo/listMissingBlobs.js' -export * as ComAtprotoRepoListRecords from './types/com/atproto/repo/listRecords.js' -export * as ComAtprotoRepoPutRecord from './types/com/atproto/repo/putRecord.js' -export * as ComAtprotoRepoStrongRef from './types/com/atproto/repo/strongRef.js' -export * as ComAtprotoRepoUploadBlob from './types/com/atproto/repo/uploadBlob.js' -export * as ComAtprotoServerActivateAccount from './types/com/atproto/server/activateAccount.js' -export * as ComAtprotoServerCheckAccountStatus from './types/com/atproto/server/checkAccountStatus.js' -export * as ComAtprotoServerConfirmEmail from './types/com/atproto/server/confirmEmail.js' -export * as ComAtprotoServerCreateAccount from './types/com/atproto/server/createAccount.js' -export * as ComAtprotoServerCreateAppPassword from './types/com/atproto/server/createAppPassword.js' -export * as ComAtprotoServerCreateInviteCode from './types/com/atproto/server/createInviteCode.js' -export * as ComAtprotoServerCreateInviteCodes from './types/com/atproto/server/createInviteCodes.js' -export * as ComAtprotoServerCreateSession from './types/com/atproto/server/createSession.js' -export * as ComAtprotoServerDeactivateAccount from './types/com/atproto/server/deactivateAccount.js' -export * as ComAtprotoServerDefs from './types/com/atproto/server/defs.js' -export * as ComAtprotoServerDeleteAccount from './types/com/atproto/server/deleteAccount.js' -export * as ComAtprotoServerDeleteSession from './types/com/atproto/server/deleteSession.js' -export * as ComAtprotoServerDescribeServer from './types/com/atproto/server/describeServer.js' -export * as ComAtprotoServerGetAccountInviteCodes from './types/com/atproto/server/getAccountInviteCodes.js' -export * as ComAtprotoServerGetServiceAuth from './types/com/atproto/server/getServiceAuth.js' -export * as ComAtprotoServerGetSession from './types/com/atproto/server/getSession.js' -export * as ComAtprotoServerListAppPasswords from './types/com/atproto/server/listAppPasswords.js' -export * as ComAtprotoServerRefreshSession from './types/com/atproto/server/refreshSession.js' -export * as ComAtprotoServerRequestAccountDelete from './types/com/atproto/server/requestAccountDelete.js' -export * as ComAtprotoServerRequestEmailConfirmation from './types/com/atproto/server/requestEmailConfirmation.js' -export * as ComAtprotoServerRequestEmailUpdate from './types/com/atproto/server/requestEmailUpdate.js' -export * as ComAtprotoServerRequestPasswordReset from './types/com/atproto/server/requestPasswordReset.js' -export * as ComAtprotoServerReserveSigningKey from './types/com/atproto/server/reserveSigningKey.js' -export * as ComAtprotoServerResetPassword from './types/com/atproto/server/resetPassword.js' -export * as ComAtprotoServerRevokeAppPassword from './types/com/atproto/server/revokeAppPassword.js' -export * as ComAtprotoServerUpdateEmail from './types/com/atproto/server/updateEmail.js' -export * as ComAtprotoSyncDefs from './types/com/atproto/sync/defs.js' -export * as ComAtprotoSyncGetBlob from './types/com/atproto/sync/getBlob.js' -export * as ComAtprotoSyncGetBlocks from './types/com/atproto/sync/getBlocks.js' -export * as ComAtprotoSyncGetCheckout from './types/com/atproto/sync/getCheckout.js' -export * as ComAtprotoSyncGetHead from './types/com/atproto/sync/getHead.js' -export * as ComAtprotoSyncGetHostStatus from './types/com/atproto/sync/getHostStatus.js' -export * as ComAtprotoSyncGetLatestCommit from './types/com/atproto/sync/getLatestCommit.js' -export * as ComAtprotoSyncGetRecord from './types/com/atproto/sync/getRecord.js' -export * as ComAtprotoSyncGetRepo from './types/com/atproto/sync/getRepo.js' -export * as ComAtprotoSyncGetRepoStatus from './types/com/atproto/sync/getRepoStatus.js' -export * as ComAtprotoSyncListBlobs from './types/com/atproto/sync/listBlobs.js' -export * as ComAtprotoSyncListHosts from './types/com/atproto/sync/listHosts.js' -export * as ComAtprotoSyncListRepos from './types/com/atproto/sync/listRepos.js' -export * as ComAtprotoSyncListReposByCollection from './types/com/atproto/sync/listReposByCollection.js' -export * as ComAtprotoSyncNotifyOfUpdate from './types/com/atproto/sync/notifyOfUpdate.js' -export * as ComAtprotoSyncRequestCrawl from './types/com/atproto/sync/requestCrawl.js' -export * as ComAtprotoSyncSubscribeRepos from './types/com/atproto/sync/subscribeRepos.js' -export * as ComAtprotoTempAddReservedHandle from './types/com/atproto/temp/addReservedHandle.js' -export * as ComAtprotoTempCheckHandleAvailability from './types/com/atproto/temp/checkHandleAvailability.js' -export * as ComAtprotoTempCheckSignupQueue from './types/com/atproto/temp/checkSignupQueue.js' -export * as ComAtprotoTempDereferenceScope from './types/com/atproto/temp/dereferenceScope.js' -export * as ComAtprotoTempFetchLabels from './types/com/atproto/temp/fetchLabels.js' -export * as ComAtprotoTempRequestPhoneVerification from './types/com/atproto/temp/requestPhoneVerification.js' -export * as ComAtprotoTempRevokeAccountCredentials from './types/com/atproto/temp/revokeAccountCredentials.js' -export * as ComGermnetworkDeclaration from './types/com/germnetwork/declaration.js' -export * as ToolsOzoneCommunicationCreateTemplate from './types/tools/ozone/communication/createTemplate.js' -export * as ToolsOzoneCommunicationDefs from './types/tools/ozone/communication/defs.js' -export * as ToolsOzoneCommunicationDeleteTemplate from './types/tools/ozone/communication/deleteTemplate.js' -export * as ToolsOzoneCommunicationListTemplates from './types/tools/ozone/communication/listTemplates.js' -export * as ToolsOzoneCommunicationUpdateTemplate from './types/tools/ozone/communication/updateTemplate.js' -export * as ToolsOzoneHostingGetAccountHistory from './types/tools/ozone/hosting/getAccountHistory.js' -export * as ToolsOzoneModerationCancelScheduledActions from './types/tools/ozone/moderation/cancelScheduledActions.js' -export * as ToolsOzoneModerationDefs from './types/tools/ozone/moderation/defs.js' -export * as ToolsOzoneModerationEmitEvent from './types/tools/ozone/moderation/emitEvent.js' -export * as ToolsOzoneModerationGetAccountTimeline from './types/tools/ozone/moderation/getAccountTimeline.js' -export * as ToolsOzoneModerationGetEvent from './types/tools/ozone/moderation/getEvent.js' -export * as ToolsOzoneModerationGetRecord from './types/tools/ozone/moderation/getRecord.js' -export * as ToolsOzoneModerationGetRecords from './types/tools/ozone/moderation/getRecords.js' -export * as ToolsOzoneModerationGetRepo from './types/tools/ozone/moderation/getRepo.js' -export * as ToolsOzoneModerationGetReporterStats from './types/tools/ozone/moderation/getReporterStats.js' -export * as ToolsOzoneModerationGetRepos from './types/tools/ozone/moderation/getRepos.js' -export * as ToolsOzoneModerationGetSubjects from './types/tools/ozone/moderation/getSubjects.js' -export * as ToolsOzoneModerationListScheduledActions from './types/tools/ozone/moderation/listScheduledActions.js' -export * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation/queryEvents.js' -export * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses.js' -export * as ToolsOzoneModerationScheduleAction from './types/tools/ozone/moderation/scheduleAction.js' -export * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos.js' -export * as ToolsOzoneQueueAssignModerator from './types/tools/ozone/queue/assignModerator.js' -export * as ToolsOzoneQueueCreateQueue from './types/tools/ozone/queue/createQueue.js' -export * as ToolsOzoneQueueDefs from './types/tools/ozone/queue/defs.js' -export * as ToolsOzoneQueueDeleteQueue from './types/tools/ozone/queue/deleteQueue.js' -export * as ToolsOzoneQueueGetAssignments from './types/tools/ozone/queue/getAssignments.js' -export * as ToolsOzoneQueueListQueues from './types/tools/ozone/queue/listQueues.js' -export * as ToolsOzoneQueueRouteReports from './types/tools/ozone/queue/routeReports.js' -export * as ToolsOzoneQueueUnassignModerator from './types/tools/ozone/queue/unassignModerator.js' -export * as ToolsOzoneQueueUpdateQueue from './types/tools/ozone/queue/updateQueue.js' -export * as ToolsOzoneReportAssignModerator from './types/tools/ozone/report/assignModerator.js' -export * as ToolsOzoneReportCreateActivity from './types/tools/ozone/report/createActivity.js' -export * as ToolsOzoneReportDefs from './types/tools/ozone/report/defs.js' -export * as ToolsOzoneReportGetAssignments from './types/tools/ozone/report/getAssignments.js' -export * as ToolsOzoneReportGetHistoricalStats from './types/tools/ozone/report/getHistoricalStats.js' -export * as ToolsOzoneReportGetLatestReport from './types/tools/ozone/report/getLatestReport.js' -export * as ToolsOzoneReportGetLiveStats from './types/tools/ozone/report/getLiveStats.js' -export * as ToolsOzoneReportGetReport from './types/tools/ozone/report/getReport.js' -export * as ToolsOzoneReportListActivities from './types/tools/ozone/report/listActivities.js' -export * as ToolsOzoneReportQueryReports from './types/tools/ozone/report/queryReports.js' -export * as ToolsOzoneReportReassignQueue from './types/tools/ozone/report/reassignQueue.js' -export * as ToolsOzoneReportRefreshStats from './types/tools/ozone/report/refreshStats.js' -export * as ToolsOzoneReportUnassignModerator from './types/tools/ozone/report/unassignModerator.js' -export * as ToolsOzoneSafelinkAddRule from './types/tools/ozone/safelink/addRule.js' -export * as ToolsOzoneSafelinkDefs from './types/tools/ozone/safelink/defs.js' -export * as ToolsOzoneSafelinkQueryEvents from './types/tools/ozone/safelink/queryEvents.js' -export * as ToolsOzoneSafelinkQueryRules from './types/tools/ozone/safelink/queryRules.js' -export * as ToolsOzoneSafelinkRemoveRule from './types/tools/ozone/safelink/removeRule.js' -export * as ToolsOzoneSafelinkUpdateRule from './types/tools/ozone/safelink/updateRule.js' -export * as ToolsOzoneServerGetConfig from './types/tools/ozone/server/getConfig.js' -export * as ToolsOzoneSetAddValues from './types/tools/ozone/set/addValues.js' -export * as ToolsOzoneSetDefs from './types/tools/ozone/set/defs.js' -export * as ToolsOzoneSetDeleteSet from './types/tools/ozone/set/deleteSet.js' -export * as ToolsOzoneSetDeleteValues from './types/tools/ozone/set/deleteValues.js' -export * as ToolsOzoneSetGetValues from './types/tools/ozone/set/getValues.js' -export * as ToolsOzoneSetQuerySets from './types/tools/ozone/set/querySets.js' -export * as ToolsOzoneSetUpsertSet from './types/tools/ozone/set/upsertSet.js' -export * as ToolsOzoneSettingDefs from './types/tools/ozone/setting/defs.js' -export * as ToolsOzoneSettingListOptions from './types/tools/ozone/setting/listOptions.js' -export * as ToolsOzoneSettingRemoveOptions from './types/tools/ozone/setting/removeOptions.js' -export * as ToolsOzoneSettingUpsertOption from './types/tools/ozone/setting/upsertOption.js' -export * as ToolsOzoneSignatureDefs from './types/tools/ozone/signature/defs.js' -export * as ToolsOzoneSignatureFindCorrelation from './types/tools/ozone/signature/findCorrelation.js' -export * as ToolsOzoneSignatureFindRelatedAccounts from './types/tools/ozone/signature/findRelatedAccounts.js' -export * as ToolsOzoneSignatureSearchAccounts from './types/tools/ozone/signature/searchAccounts.js' -export * as ToolsOzoneTeamAddMember from './types/tools/ozone/team/addMember.js' -export * as ToolsOzoneTeamDefs from './types/tools/ozone/team/defs.js' -export * as ToolsOzoneTeamDeleteMember from './types/tools/ozone/team/deleteMember.js' -export * as ToolsOzoneTeamListMembers from './types/tools/ozone/team/listMembers.js' -export * as ToolsOzoneTeamUpdateMember from './types/tools/ozone/team/updateMember.js' -export * as ToolsOzoneVerificationDefs from './types/tools/ozone/verification/defs.js' -export * as ToolsOzoneVerificationGrantVerifications from './types/tools/ozone/verification/grantVerifications.js' -export * as ToolsOzoneVerificationListVerifications from './types/tools/ozone/verification/listVerifications.js' -export * as ToolsOzoneVerificationRevokeVerifications from './types/tools/ozone/verification/revokeVerifications.js' - -export const APP_BSKY_ACTOR = { - StatusLive: 'app.bsky.actor.status#live', -} -export const APP_BSKY_FEED = { - DefsRequestLess: 'app.bsky.feed.defs#requestLess', - DefsRequestMore: 'app.bsky.feed.defs#requestMore', - DefsClickthroughItem: 'app.bsky.feed.defs#clickthroughItem', - DefsClickthroughAuthor: 'app.bsky.feed.defs#clickthroughAuthor', - DefsClickthroughReposter: 'app.bsky.feed.defs#clickthroughReposter', - DefsClickthroughEmbed: 'app.bsky.feed.defs#clickthroughEmbed', - DefsContentModeUnspecified: 'app.bsky.feed.defs#contentModeUnspecified', - DefsContentModeVideo: 'app.bsky.feed.defs#contentModeVideo', - DefsInteractionSeen: 'app.bsky.feed.defs#interactionSeen', - DefsInteractionLike: 'app.bsky.feed.defs#interactionLike', - DefsInteractionRepost: 'app.bsky.feed.defs#interactionRepost', - DefsInteractionReply: 'app.bsky.feed.defs#interactionReply', - DefsInteractionQuote: 'app.bsky.feed.defs#interactionQuote', - DefsInteractionShare: 'app.bsky.feed.defs#interactionShare', -} -export const APP_BSKY_GRAPH = { - DefsModlist: 'app.bsky.graph.defs#modlist', - DefsCuratelist: 'app.bsky.graph.defs#curatelist', - DefsReferencelist: 'app.bsky.graph.defs#referencelist', -} -export const COM_ATPROTO_MODERATION = { - DefsReasonSpam: 'com.atproto.moderation.defs#reasonSpam', - DefsReasonViolation: 'com.atproto.moderation.defs#reasonViolation', - DefsReasonMisleading: 'com.atproto.moderation.defs#reasonMisleading', - DefsReasonSexual: 'com.atproto.moderation.defs#reasonSexual', - DefsReasonRude: 'com.atproto.moderation.defs#reasonRude', - DefsReasonOther: 'com.atproto.moderation.defs#reasonOther', - DefsReasonAppeal: 'com.atproto.moderation.defs#reasonAppeal', -} -export const TOOLS_OZONE_MODERATION = { - DefsReviewOpen: 'tools.ozone.moderation.defs#reviewOpen', - DefsReviewEscalated: 'tools.ozone.moderation.defs#reviewEscalated', - DefsReviewClosed: 'tools.ozone.moderation.defs#reviewClosed', - DefsReviewNone: 'tools.ozone.moderation.defs#reviewNone', - DefsTimelineEventPlcCreate: - 'tools.ozone.moderation.defs#timelineEventPlcCreate', - DefsTimelineEventPlcOperation: - 'tools.ozone.moderation.defs#timelineEventPlcOperation', - DefsTimelineEventPlcTombstone: - 'tools.ozone.moderation.defs#timelineEventPlcTombstone', -} -export const TOOLS_OZONE_REPORT = { - DefsReasonAppeal: 'tools.ozone.report.defs#reasonAppeal', - DefsReasonOther: 'tools.ozone.report.defs#reasonOther', - DefsReasonViolenceAnimal: 'tools.ozone.report.defs#reasonViolenceAnimal', - DefsReasonViolenceThreats: 'tools.ozone.report.defs#reasonViolenceThreats', - DefsReasonViolenceGraphicContent: - 'tools.ozone.report.defs#reasonViolenceGraphicContent', - DefsReasonViolenceGlorification: - 'tools.ozone.report.defs#reasonViolenceGlorification', - DefsReasonViolenceExtremistContent: - 'tools.ozone.report.defs#reasonViolenceExtremistContent', - DefsReasonViolenceTrafficking: - 'tools.ozone.report.defs#reasonViolenceTrafficking', - DefsReasonViolenceOther: 'tools.ozone.report.defs#reasonViolenceOther', - DefsReasonSexualAbuseContent: - 'tools.ozone.report.defs#reasonSexualAbuseContent', - DefsReasonSexualNCII: 'tools.ozone.report.defs#reasonSexualNCII', - DefsReasonSexualDeepfake: 'tools.ozone.report.defs#reasonSexualDeepfake', - DefsReasonSexualAnimal: 'tools.ozone.report.defs#reasonSexualAnimal', - DefsReasonSexualUnlabeled: 'tools.ozone.report.defs#reasonSexualUnlabeled', - DefsReasonSexualOther: 'tools.ozone.report.defs#reasonSexualOther', - DefsReasonChildSafetyCSAM: 'tools.ozone.report.defs#reasonChildSafetyCSAM', - DefsReasonChildSafetyGroom: 'tools.ozone.report.defs#reasonChildSafetyGroom', - DefsReasonChildSafetyPrivacy: - 'tools.ozone.report.defs#reasonChildSafetyPrivacy', - DefsReasonChildSafetyHarassment: - 'tools.ozone.report.defs#reasonChildSafetyHarassment', - DefsReasonChildSafetyOther: 'tools.ozone.report.defs#reasonChildSafetyOther', - DefsReasonHarassmentTroll: 'tools.ozone.report.defs#reasonHarassmentTroll', - DefsReasonHarassmentTargeted: - 'tools.ozone.report.defs#reasonHarassmentTargeted', - DefsReasonHarassmentHateSpeech: - 'tools.ozone.report.defs#reasonHarassmentHateSpeech', - DefsReasonHarassmentDoxxing: - 'tools.ozone.report.defs#reasonHarassmentDoxxing', - DefsReasonHarassmentOther: 'tools.ozone.report.defs#reasonHarassmentOther', - DefsReasonMisleadingBot: 'tools.ozone.report.defs#reasonMisleadingBot', - DefsReasonMisleadingImpersonation: - 'tools.ozone.report.defs#reasonMisleadingImpersonation', - DefsReasonMisleadingSpam: 'tools.ozone.report.defs#reasonMisleadingSpam', - DefsReasonMisleadingScam: 'tools.ozone.report.defs#reasonMisleadingScam', - DefsReasonMisleadingElections: - 'tools.ozone.report.defs#reasonMisleadingElections', - DefsReasonMisleadingOther: 'tools.ozone.report.defs#reasonMisleadingOther', - DefsReasonRuleSiteSecurity: 'tools.ozone.report.defs#reasonRuleSiteSecurity', - DefsReasonRuleProhibitedSales: - 'tools.ozone.report.defs#reasonRuleProhibitedSales', - DefsReasonRuleBanEvasion: 'tools.ozone.report.defs#reasonRuleBanEvasion', - DefsReasonRuleOther: 'tools.ozone.report.defs#reasonRuleOther', - DefsReasonSelfHarmContent: 'tools.ozone.report.defs#reasonSelfHarmContent', - DefsReasonSelfHarmED: 'tools.ozone.report.defs#reasonSelfHarmED', - DefsReasonSelfHarmStunts: 'tools.ozone.report.defs#reasonSelfHarmStunts', - DefsReasonSelfHarmSubstances: - 'tools.ozone.report.defs#reasonSelfHarmSubstances', - DefsReasonSelfHarmOther: 'tools.ozone.report.defs#reasonSelfHarmOther', -} -export const TOOLS_OZONE_TEAM = { - DefsRoleAdmin: 'tools.ozone.team.defs#roleAdmin', - DefsRoleModerator: 'tools.ozone.team.defs#roleModerator', - DefsRoleTriage: 'tools.ozone.team.defs#roleTriage', - DefsRoleVerifier: 'tools.ozone.team.defs#roleVerifier', -} - -export class AtpBaseClient extends XrpcClient { - app: AppNS - chat: ChatNS - com: ComNS - tools: ToolsNS - - constructor(options: FetchHandler | FetchHandlerOptions) { - super(options, schemas) - this.app = new AppNS(this) - this.chat = new ChatNS(this) - this.com = new ComNS(this) - this.tools = new ToolsNS(this) - } - - /** @deprecated use `this` instead */ - get xrpc(): XrpcClient { - return this - } -} - -export class AppNS { - _client: XrpcClient - bsky: AppBskyNS - - constructor(client: XrpcClient) { - this._client = client - this.bsky = new AppBskyNS(client) - } -} - -export class AppBskyNS { - _client: XrpcClient - actor: AppBskyActorNS - ageassurance: AppBskyAgeassuranceNS - bookmark: AppBskyBookmarkNS - contact: AppBskyContactNS - draft: AppBskyDraftNS - embed: AppBskyEmbedNS - feed: AppBskyFeedNS - graph: AppBskyGraphNS - labeler: AppBskyLabelerNS - notification: AppBskyNotificationNS - richtext: AppBskyRichtextNS - unspecced: AppBskyUnspeccedNS - video: AppBskyVideoNS - - constructor(client: XrpcClient) { - this._client = client - this.actor = new AppBskyActorNS(client) - this.ageassurance = new AppBskyAgeassuranceNS(client) - this.bookmark = new AppBskyBookmarkNS(client) - this.contact = new AppBskyContactNS(client) - this.draft = new AppBskyDraftNS(client) - this.embed = new AppBskyEmbedNS(client) - this.feed = new AppBskyFeedNS(client) - this.graph = new AppBskyGraphNS(client) - this.labeler = new AppBskyLabelerNS(client) - this.notification = new AppBskyNotificationNS(client) - this.richtext = new AppBskyRichtextNS(client) - this.unspecced = new AppBskyUnspeccedNS(client) - this.video = new AppBskyVideoNS(client) - } -} - -export class AppBskyActorNS { - _client: XrpcClient - profile: AppBskyActorProfileRecord - status: AppBskyActorStatusRecord - - constructor(client: XrpcClient) { - this._client = client - this.profile = new AppBskyActorProfileRecord(client) - this.status = new AppBskyActorStatusRecord(client) - } - - getPreferences( - params?: AppBskyActorGetPreferences.QueryParams, - opts?: AppBskyActorGetPreferences.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.getPreferences', - params, - undefined, - opts, - ) - } - - getProfile( - params?: AppBskyActorGetProfile.QueryParams, - opts?: AppBskyActorGetProfile.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.getProfile', - params, - undefined, - opts, - ) - } - - getProfiles( - params?: AppBskyActorGetProfiles.QueryParams, - opts?: AppBskyActorGetProfiles.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.getProfiles', - params, - undefined, - opts, - ) - } - - getSuggestions( - params?: AppBskyActorGetSuggestions.QueryParams, - opts?: AppBskyActorGetSuggestions.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.getSuggestions', - params, - undefined, - opts, - ) - } - - putPreferences( - data?: AppBskyActorPutPreferences.InputSchema, - opts?: AppBskyActorPutPreferences.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.putPreferences', - opts?.qp, - data, - opts, - ) - } - - searchActors( - params?: AppBskyActorSearchActors.QueryParams, - opts?: AppBskyActorSearchActors.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.searchActors', - params, - undefined, - opts, - ) - } - - searchActorsTypeahead( - params?: AppBskyActorSearchActorsTypeahead.QueryParams, - opts?: AppBskyActorSearchActorsTypeahead.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.actor.searchActorsTypeahead', - params, - undefined, - opts, - ) - } -} - -export class AppBskyActorProfileRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyActorProfile.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.actor.profile', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyActorProfile.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.actor.profile', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.actor.profile' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { - collection, - rkey: 'self', - ...params, - record: { ...record, $type: collection }, - }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.actor.profile' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.actor.profile', ...params }, - { headers }, - ) - } -} - -export class AppBskyActorStatusRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyActorStatus.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.actor.status', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyActorStatus.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.actor.status', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.actor.status' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { - collection, - rkey: 'self', - ...params, - record: { ...record, $type: collection }, - }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.actor.status' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.actor.status', ...params }, - { headers }, - ) - } -} - -export class AppBskyAgeassuranceNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - begin( - data?: AppBskyAgeassuranceBegin.InputSchema, - opts?: AppBskyAgeassuranceBegin.CallOptions, - ): Promise { - return this._client - .call('app.bsky.ageassurance.begin', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyAgeassuranceBegin.toKnownErr(e) - }) - } - - getConfig( - params?: AppBskyAgeassuranceGetConfig.QueryParams, - opts?: AppBskyAgeassuranceGetConfig.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.ageassurance.getConfig', - params, - undefined, - opts, - ) - } - - getState( - params?: AppBskyAgeassuranceGetState.QueryParams, - opts?: AppBskyAgeassuranceGetState.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.ageassurance.getState', - params, - undefined, - opts, - ) - } -} - -export class AppBskyBookmarkNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - createBookmark( - data?: AppBskyBookmarkCreateBookmark.InputSchema, - opts?: AppBskyBookmarkCreateBookmark.CallOptions, - ): Promise { - return this._client - .call('app.bsky.bookmark.createBookmark', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyBookmarkCreateBookmark.toKnownErr(e) - }) - } - - deleteBookmark( - data?: AppBskyBookmarkDeleteBookmark.InputSchema, - opts?: AppBskyBookmarkDeleteBookmark.CallOptions, - ): Promise { - return this._client - .call('app.bsky.bookmark.deleteBookmark', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyBookmarkDeleteBookmark.toKnownErr(e) - }) - } - - getBookmarks( - params?: AppBskyBookmarkGetBookmarks.QueryParams, - opts?: AppBskyBookmarkGetBookmarks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.bookmark.getBookmarks', - params, - undefined, - opts, - ) - } -} - -export class AppBskyContactNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - dismissMatch( - data?: AppBskyContactDismissMatch.InputSchema, - opts?: AppBskyContactDismissMatch.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.dismissMatch', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyContactDismissMatch.toKnownErr(e) - }) - } - - getMatches( - params?: AppBskyContactGetMatches.QueryParams, - opts?: AppBskyContactGetMatches.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.getMatches', params, undefined, opts) - .catch((e) => { - throw AppBskyContactGetMatches.toKnownErr(e) - }) - } - - getSyncStatus( - params?: AppBskyContactGetSyncStatus.QueryParams, - opts?: AppBskyContactGetSyncStatus.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.getSyncStatus', params, undefined, opts) - .catch((e) => { - throw AppBskyContactGetSyncStatus.toKnownErr(e) - }) - } - - importContacts( - data?: AppBskyContactImportContacts.InputSchema, - opts?: AppBskyContactImportContacts.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.importContacts', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyContactImportContacts.toKnownErr(e) - }) - } - - removeData( - data?: AppBskyContactRemoveData.InputSchema, - opts?: AppBskyContactRemoveData.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.removeData', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyContactRemoveData.toKnownErr(e) - }) - } - - sendNotification( - data?: AppBskyContactSendNotification.InputSchema, - opts?: AppBskyContactSendNotification.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.contact.sendNotification', - opts?.qp, - data, - opts, - ) - } - - startPhoneVerification( - data?: AppBskyContactStartPhoneVerification.InputSchema, - opts?: AppBskyContactStartPhoneVerification.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.startPhoneVerification', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyContactStartPhoneVerification.toKnownErr(e) - }) - } - - verifyPhone( - data?: AppBskyContactVerifyPhone.InputSchema, - opts?: AppBskyContactVerifyPhone.CallOptions, - ): Promise { - return this._client - .call('app.bsky.contact.verifyPhone', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyContactVerifyPhone.toKnownErr(e) - }) - } -} - -export class AppBskyDraftNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - createDraft( - data?: AppBskyDraftCreateDraft.InputSchema, - opts?: AppBskyDraftCreateDraft.CallOptions, - ): Promise { - return this._client - .call('app.bsky.draft.createDraft', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyDraftCreateDraft.toKnownErr(e) - }) - } - - deleteDraft( - data?: AppBskyDraftDeleteDraft.InputSchema, - opts?: AppBskyDraftDeleteDraft.CallOptions, - ): Promise { - return this._client.call('app.bsky.draft.deleteDraft', opts?.qp, data, opts) - } - - getDrafts( - params?: AppBskyDraftGetDrafts.QueryParams, - opts?: AppBskyDraftGetDrafts.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.draft.getDrafts', - params, - undefined, - opts, - ) - } - - updateDraft( - data?: AppBskyDraftUpdateDraft.InputSchema, - opts?: AppBskyDraftUpdateDraft.CallOptions, - ): Promise { - return this._client.call('app.bsky.draft.updateDraft', opts?.qp, data, opts) - } -} - -export class AppBskyEmbedNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } -} - -export class AppBskyFeedNS { - _client: XrpcClient - generator: AppBskyFeedGeneratorRecord - like: AppBskyFeedLikeRecord - post: AppBskyFeedPostRecord - postgate: AppBskyFeedPostgateRecord - repost: AppBskyFeedRepostRecord - threadgate: AppBskyFeedThreadgateRecord - - constructor(client: XrpcClient) { - this._client = client - this.generator = new AppBskyFeedGeneratorRecord(client) - this.like = new AppBskyFeedLikeRecord(client) - this.post = new AppBskyFeedPostRecord(client) - this.postgate = new AppBskyFeedPostgateRecord(client) - this.repost = new AppBskyFeedRepostRecord(client) - this.threadgate = new AppBskyFeedThreadgateRecord(client) - } - - describeFeedGenerator( - params?: AppBskyFeedDescribeFeedGenerator.QueryParams, - opts?: AppBskyFeedDescribeFeedGenerator.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.describeFeedGenerator', - params, - undefined, - opts, - ) - } - - getActorFeeds( - params?: AppBskyFeedGetActorFeeds.QueryParams, - opts?: AppBskyFeedGetActorFeeds.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.getActorFeeds', - params, - undefined, - opts, - ) - } - - getActorLikes( - params?: AppBskyFeedGetActorLikes.QueryParams, - opts?: AppBskyFeedGetActorLikes.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.getActorLikes', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedGetActorLikes.toKnownErr(e) - }) - } - - getAuthorFeed( - params?: AppBskyFeedGetAuthorFeed.QueryParams, - opts?: AppBskyFeedGetAuthorFeed.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.getAuthorFeed', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedGetAuthorFeed.toKnownErr(e) - }) - } - - getFeed( - params?: AppBskyFeedGetFeed.QueryParams, - opts?: AppBskyFeedGetFeed.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.getFeed', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedGetFeed.toKnownErr(e) - }) - } - - getFeedGenerator( - params?: AppBskyFeedGetFeedGenerator.QueryParams, - opts?: AppBskyFeedGetFeedGenerator.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.getFeedGenerator', - params, - undefined, - opts, - ) - } - - getFeedGenerators( - params?: AppBskyFeedGetFeedGenerators.QueryParams, - opts?: AppBskyFeedGetFeedGenerators.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.getFeedGenerators', - params, - undefined, - opts, - ) - } - - getFeedSkeleton( - params?: AppBskyFeedGetFeedSkeleton.QueryParams, - opts?: AppBskyFeedGetFeedSkeleton.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.getFeedSkeleton', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedGetFeedSkeleton.toKnownErr(e) - }) - } - - getLikes( - params?: AppBskyFeedGetLikes.QueryParams, - opts?: AppBskyFeedGetLikes.CallOptions, - ): Promise { - return this._client.call('app.bsky.feed.getLikes', params, undefined, opts) - } - - getListFeed( - params?: AppBskyFeedGetListFeed.QueryParams, - opts?: AppBskyFeedGetListFeed.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.getListFeed', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedGetListFeed.toKnownErr(e) - }) - } - - getPostThread( - params?: AppBskyFeedGetPostThread.QueryParams, - opts?: AppBskyFeedGetPostThread.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.getPostThread', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedGetPostThread.toKnownErr(e) - }) - } - - getPosts( - params?: AppBskyFeedGetPosts.QueryParams, - opts?: AppBskyFeedGetPosts.CallOptions, - ): Promise { - return this._client.call('app.bsky.feed.getPosts', params, undefined, opts) - } - - getQuotes( - params?: AppBskyFeedGetQuotes.QueryParams, - opts?: AppBskyFeedGetQuotes.CallOptions, - ): Promise { - return this._client.call('app.bsky.feed.getQuotes', params, undefined, opts) - } - - getRepostedBy( - params?: AppBskyFeedGetRepostedBy.QueryParams, - opts?: AppBskyFeedGetRepostedBy.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.getRepostedBy', - params, - undefined, - opts, - ) - } - - getSuggestedFeeds( - params?: AppBskyFeedGetSuggestedFeeds.QueryParams, - opts?: AppBskyFeedGetSuggestedFeeds.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.getSuggestedFeeds', - params, - undefined, - opts, - ) - } - - getTimeline( - params?: AppBskyFeedGetTimeline.QueryParams, - opts?: AppBskyFeedGetTimeline.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.getTimeline', - params, - undefined, - opts, - ) - } - - searchPosts( - params?: AppBskyFeedSearchPosts.QueryParams, - opts?: AppBskyFeedSearchPosts.CallOptions, - ): Promise { - return this._client - .call('app.bsky.feed.searchPosts', params, undefined, opts) - .catch((e) => { - throw AppBskyFeedSearchPosts.toKnownErr(e) - }) - } - - sendInteractions( - data?: AppBskyFeedSendInteractions.InputSchema, - opts?: AppBskyFeedSendInteractions.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.feed.sendInteractions', - opts?.qp, - data, - opts, - ) - } -} - -export class AppBskyFeedGeneratorRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyFeedGenerator.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.feed.generator', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyFeedGenerator.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.feed.generator', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.generator' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.generator' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.feed.generator', ...params }, - { headers }, - ) - } -} - -export class AppBskyFeedLikeRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyFeedLike.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.feed.like', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyFeedLike.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.feed.like', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.like' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.like' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.feed.like', ...params }, - { headers }, - ) - } -} - -export class AppBskyFeedPostRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyFeedPost.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.feed.post', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyFeedPost.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.feed.post', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.post' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.post' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.feed.post', ...params }, - { headers }, - ) - } -} - -export class AppBskyFeedPostgateRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyFeedPostgate.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.feed.postgate', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyFeedPostgate.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.feed.postgate', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.postgate' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.postgate' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.feed.postgate', ...params }, - { headers }, - ) - } -} - -export class AppBskyFeedRepostRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyFeedRepost.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.feed.repost', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyFeedRepost.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.feed.repost', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.repost' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.repost' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.feed.repost', ...params }, - { headers }, - ) - } -} - -export class AppBskyFeedThreadgateRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyFeedThreadgate.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.feed.threadgate', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: AppBskyFeedThreadgate.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.feed.threadgate', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.threadgate' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.feed.threadgate' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.feed.threadgate', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphNS { - _client: XrpcClient - block: AppBskyGraphBlockRecord - follow: AppBskyGraphFollowRecord - list: AppBskyGraphListRecord - listblock: AppBskyGraphListblockRecord - listitem: AppBskyGraphListitemRecord - starterpack: AppBskyGraphStarterpackRecord - verification: AppBskyGraphVerificationRecord - - constructor(client: XrpcClient) { - this._client = client - this.block = new AppBskyGraphBlockRecord(client) - this.follow = new AppBskyGraphFollowRecord(client) - this.list = new AppBskyGraphListRecord(client) - this.listblock = new AppBskyGraphListblockRecord(client) - this.listitem = new AppBskyGraphListitemRecord(client) - this.starterpack = new AppBskyGraphStarterpackRecord(client) - this.verification = new AppBskyGraphVerificationRecord(client) - } - - getActorStarterPacks( - params?: AppBskyGraphGetActorStarterPacks.QueryParams, - opts?: AppBskyGraphGetActorStarterPacks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getActorStarterPacks', - params, - undefined, - opts, - ) - } - - getBlocks( - params?: AppBskyGraphGetBlocks.QueryParams, - opts?: AppBskyGraphGetBlocks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getBlocks', - params, - undefined, - opts, - ) - } - - getFollowers( - params?: AppBskyGraphGetFollowers.QueryParams, - opts?: AppBskyGraphGetFollowers.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getFollowers', - params, - undefined, - opts, - ) - } - - getFollows( - params?: AppBskyGraphGetFollows.QueryParams, - opts?: AppBskyGraphGetFollows.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getFollows', - params, - undefined, - opts, - ) - } - - getKnownFollowers( - params?: AppBskyGraphGetKnownFollowers.QueryParams, - opts?: AppBskyGraphGetKnownFollowers.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getKnownFollowers', - params, - undefined, - opts, - ) - } - - getList( - params?: AppBskyGraphGetList.QueryParams, - opts?: AppBskyGraphGetList.CallOptions, - ): Promise { - return this._client.call('app.bsky.graph.getList', params, undefined, opts) - } - - getListBlocks( - params?: AppBskyGraphGetListBlocks.QueryParams, - opts?: AppBskyGraphGetListBlocks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getListBlocks', - params, - undefined, - opts, - ) - } - - getListMutes( - params?: AppBskyGraphGetListMutes.QueryParams, - opts?: AppBskyGraphGetListMutes.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getListMutes', - params, - undefined, - opts, - ) - } - - getLists( - params?: AppBskyGraphGetLists.QueryParams, - opts?: AppBskyGraphGetLists.CallOptions, - ): Promise { - return this._client.call('app.bsky.graph.getLists', params, undefined, opts) - } - - getListsWithMembership( - params?: AppBskyGraphGetListsWithMembership.QueryParams, - opts?: AppBskyGraphGetListsWithMembership.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getListsWithMembership', - params, - undefined, - opts, - ) - } - - getMutes( - params?: AppBskyGraphGetMutes.QueryParams, - opts?: AppBskyGraphGetMutes.CallOptions, - ): Promise { - return this._client.call('app.bsky.graph.getMutes', params, undefined, opts) - } - - getRelationships( - params?: AppBskyGraphGetRelationships.QueryParams, - opts?: AppBskyGraphGetRelationships.CallOptions, - ): Promise { - return this._client - .call('app.bsky.graph.getRelationships', params, undefined, opts) - .catch((e) => { - throw AppBskyGraphGetRelationships.toKnownErr(e) - }) - } - - getStarterPack( - params?: AppBskyGraphGetStarterPack.QueryParams, - opts?: AppBskyGraphGetStarterPack.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getStarterPack', - params, - undefined, - opts, - ) - } - - getStarterPacks( - params?: AppBskyGraphGetStarterPacks.QueryParams, - opts?: AppBskyGraphGetStarterPacks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getStarterPacks', - params, - undefined, - opts, - ) - } - - getStarterPacksWithMembership( - params?: AppBskyGraphGetStarterPacksWithMembership.QueryParams, - opts?: AppBskyGraphGetStarterPacksWithMembership.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getStarterPacksWithMembership', - params, - undefined, - opts, - ) - } - - getSuggestedFollowsByActor( - params?: AppBskyGraphGetSuggestedFollowsByActor.QueryParams, - opts?: AppBskyGraphGetSuggestedFollowsByActor.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.getSuggestedFollowsByActor', - params, - undefined, - opts, - ) - } - - muteActor( - data?: AppBskyGraphMuteActor.InputSchema, - opts?: AppBskyGraphMuteActor.CallOptions, - ): Promise { - return this._client.call('app.bsky.graph.muteActor', opts?.qp, data, opts) - } - - muteActorList( - data?: AppBskyGraphMuteActorList.InputSchema, - opts?: AppBskyGraphMuteActorList.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.muteActorList', - opts?.qp, - data, - opts, - ) - } - - muteThread( - data?: AppBskyGraphMuteThread.InputSchema, - opts?: AppBskyGraphMuteThread.CallOptions, - ): Promise { - return this._client.call('app.bsky.graph.muteThread', opts?.qp, data, opts) - } - - searchStarterPacks( - params?: AppBskyGraphSearchStarterPacks.QueryParams, - opts?: AppBskyGraphSearchStarterPacks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.searchStarterPacks', - params, - undefined, - opts, - ) - } - - unmuteActor( - data?: AppBskyGraphUnmuteActor.InputSchema, - opts?: AppBskyGraphUnmuteActor.CallOptions, - ): Promise { - return this._client.call('app.bsky.graph.unmuteActor', opts?.qp, data, opts) - } - - unmuteActorList( - data?: AppBskyGraphUnmuteActorList.InputSchema, - opts?: AppBskyGraphUnmuteActorList.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.unmuteActorList', - opts?.qp, - data, - opts, - ) - } - - unmuteThread( - data?: AppBskyGraphUnmuteThread.InputSchema, - opts?: AppBskyGraphUnmuteThread.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.graph.unmuteThread', - opts?.qp, - data, - opts, - ) - } -} - -export class AppBskyGraphBlockRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphBlock.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.block', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyGraphBlock.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.block', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.block' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.block' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.block', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphFollowRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphFollow.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.follow', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyGraphFollow.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.follow', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.follow' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.follow' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.follow', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphListRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphList.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.list', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyGraphList.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.list', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.list' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.list' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.list', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphListblockRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphListblock.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.listblock', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: AppBskyGraphListblock.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.listblock', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.listblock' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.listblock' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.listblock', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphListitemRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphListitem.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.listitem', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ uri: string; cid: string; value: AppBskyGraphListitem.Record }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.listitem', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.listitem' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.listitem' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.listitem', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphStarterpackRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphStarterpack.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.starterpack', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: AppBskyGraphStarterpack.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.starterpack', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.starterpack' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.starterpack' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.starterpack', ...params }, - { headers }, - ) - } -} - -export class AppBskyGraphVerificationRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyGraphVerification.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.graph.verification', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: AppBskyGraphVerification.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.graph.verification', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.verification' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.graph.verification' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.graph.verification', ...params }, - { headers }, - ) - } -} - -export class AppBskyLabelerNS { - _client: XrpcClient - service: AppBskyLabelerServiceRecord - - constructor(client: XrpcClient) { - this._client = client - this.service = new AppBskyLabelerServiceRecord(client) - } - - getServices( - params?: AppBskyLabelerGetServices.QueryParams, - opts?: AppBskyLabelerGetServices.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.labeler.getServices', - params, - undefined, - opts, - ) - } -} - -export class AppBskyLabelerServiceRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyLabelerService.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.labeler.service', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: AppBskyLabelerService.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.labeler.service', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.labeler.service' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { - collection, - rkey: 'self', - ...params, - record: { ...record, $type: collection }, - }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.labeler.service' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.labeler.service', ...params }, - { headers }, - ) - } -} - -export class AppBskyNotificationNS { - _client: XrpcClient - declaration: AppBskyNotificationDeclarationRecord - - constructor(client: XrpcClient) { - this._client = client - this.declaration = new AppBskyNotificationDeclarationRecord(client) - } - - getPreferences( - params?: AppBskyNotificationGetPreferences.QueryParams, - opts?: AppBskyNotificationGetPreferences.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.getPreferences', - params, - undefined, - opts, - ) - } - - getUnreadCount( - params?: AppBskyNotificationGetUnreadCount.QueryParams, - opts?: AppBskyNotificationGetUnreadCount.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.getUnreadCount', - params, - undefined, - opts, - ) - } - - listActivitySubscriptions( - params?: AppBskyNotificationListActivitySubscriptions.QueryParams, - opts?: AppBskyNotificationListActivitySubscriptions.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.listActivitySubscriptions', - params, - undefined, - opts, - ) - } - - listNotifications( - params?: AppBskyNotificationListNotifications.QueryParams, - opts?: AppBskyNotificationListNotifications.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.listNotifications', - params, - undefined, - opts, - ) - } - - putActivitySubscription( - data?: AppBskyNotificationPutActivitySubscription.InputSchema, - opts?: AppBskyNotificationPutActivitySubscription.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.putActivitySubscription', - opts?.qp, - data, - opts, - ) - } - - putPreferences( - data?: AppBskyNotificationPutPreferences.InputSchema, - opts?: AppBskyNotificationPutPreferences.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.putPreferences', - opts?.qp, - data, - opts, - ) - } - - putPreferencesV2( - data?: AppBskyNotificationPutPreferencesV2.InputSchema, - opts?: AppBskyNotificationPutPreferencesV2.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.putPreferencesV2', - opts?.qp, - data, - opts, - ) - } - - registerPush( - data?: AppBskyNotificationRegisterPush.InputSchema, - opts?: AppBskyNotificationRegisterPush.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.registerPush', - opts?.qp, - data, - opts, - ) - } - - unregisterPush( - data?: AppBskyNotificationUnregisterPush.InputSchema, - opts?: AppBskyNotificationUnregisterPush.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.unregisterPush', - opts?.qp, - data, - opts, - ) - } - - updateSeen( - data?: AppBskyNotificationUpdateSeen.InputSchema, - opts?: AppBskyNotificationUpdateSeen.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.notification.updateSeen', - opts?.qp, - data, - opts, - ) - } -} - -export class AppBskyNotificationDeclarationRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: AppBskyNotificationDeclaration.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'app.bsky.notification.declaration', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: AppBskyNotificationDeclaration.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'app.bsky.notification.declaration', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.notification.declaration' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { - collection, - rkey: 'self', - ...params, - record: { ...record, $type: collection }, - }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'app.bsky.notification.declaration' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'app.bsky.notification.declaration', ...params }, - { headers }, - ) - } -} - -export class AppBskyRichtextNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } -} - -export class AppBskyUnspeccedNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getAgeAssuranceState( - params?: AppBskyUnspeccedGetAgeAssuranceState.QueryParams, - opts?: AppBskyUnspeccedGetAgeAssuranceState.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getAgeAssuranceState', - params, - undefined, - opts, - ) - } - - getConfig( - params?: AppBskyUnspeccedGetConfig.QueryParams, - opts?: AppBskyUnspeccedGetConfig.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getConfig', - params, - undefined, - opts, - ) - } - - getOnboardingSuggestedStarterPacks( - params?: AppBskyUnspeccedGetOnboardingSuggestedStarterPacks.QueryParams, - opts?: AppBskyUnspeccedGetOnboardingSuggestedStarterPacks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getOnboardingSuggestedStarterPacks', - params, - undefined, - opts, - ) - } - - getOnboardingSuggestedStarterPacksSkeleton( - params?: AppBskyUnspeccedGetOnboardingSuggestedStarterPacksSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetOnboardingSuggestedStarterPacksSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton', - params, - undefined, - opts, - ) - } - - getOnboardingSuggestedUsersSkeleton( - params?: AppBskyUnspeccedGetOnboardingSuggestedUsersSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetOnboardingSuggestedUsersSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton', - params, - undefined, - opts, - ) - } - - getPopularFeedGenerators( - params?: AppBskyUnspeccedGetPopularFeedGenerators.QueryParams, - opts?: AppBskyUnspeccedGetPopularFeedGenerators.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getPopularFeedGenerators', - params, - undefined, - opts, - ) - } - - getPostThreadOtherV2( - params?: AppBskyUnspeccedGetPostThreadOtherV2.QueryParams, - opts?: AppBskyUnspeccedGetPostThreadOtherV2.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getPostThreadOtherV2', - params, - undefined, - opts, - ) - } - - getPostThreadV2( - params?: AppBskyUnspeccedGetPostThreadV2.QueryParams, - opts?: AppBskyUnspeccedGetPostThreadV2.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getPostThreadV2', - params, - undefined, - opts, - ) - } - - getSuggestedFeeds( - params?: AppBskyUnspeccedGetSuggestedFeeds.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedFeeds.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedFeeds', - params, - undefined, - opts, - ) - } - - getSuggestedFeedsSkeleton( - params?: AppBskyUnspeccedGetSuggestedFeedsSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedFeedsSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedFeedsSkeleton', - params, - undefined, - opts, - ) - } - - getSuggestedOnboardingUsers( - params?: AppBskyUnspeccedGetSuggestedOnboardingUsers.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedOnboardingUsers.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedOnboardingUsers', - params, - undefined, - opts, - ) - } - - getSuggestedStarterPacks( - params?: AppBskyUnspeccedGetSuggestedStarterPacks.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedStarterPacks.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedStarterPacks', - params, - undefined, - opts, - ) - } - - getSuggestedStarterPacksSkeleton( - params?: AppBskyUnspeccedGetSuggestedStarterPacksSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedStarterPacksSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedStarterPacksSkeleton', - params, - undefined, - opts, - ) - } - - getSuggestedUsers( - params?: AppBskyUnspeccedGetSuggestedUsers.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsers.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsers', - params, - undefined, - opts, - ) - } - - getSuggestedUsersForDiscover( - params?: AppBskyUnspeccedGetSuggestedUsersForDiscover.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersForDiscover.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersForDiscover', - params, - undefined, - opts, - ) - } - - getSuggestedUsersForDiscoverSkeleton( - params?: AppBskyUnspeccedGetSuggestedUsersForDiscoverSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersForDiscoverSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton', - params, - undefined, - opts, - ) - } - - getSuggestedUsersForExplore( - params?: AppBskyUnspeccedGetSuggestedUsersForExplore.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersForExplore.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersForExplore', - params, - undefined, - opts, - ) - } - - getSuggestedUsersForExploreSkeleton( - params?: AppBskyUnspeccedGetSuggestedUsersForExploreSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersForExploreSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersForExploreSkeleton', - params, - undefined, - opts, - ) - } - - getSuggestedUsersForSeeMore( - params?: AppBskyUnspeccedGetSuggestedUsersForSeeMore.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersForSeeMore.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersForSeeMore', - params, - undefined, - opts, - ) - } - - getSuggestedUsersForSeeMoreSkeleton( - params?: AppBskyUnspeccedGetSuggestedUsersForSeeMoreSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersForSeeMoreSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton', - params, - undefined, - opts, - ) - } - - getSuggestedUsersSkeleton( - params?: AppBskyUnspeccedGetSuggestedUsersSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestedUsersSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestedUsersSkeleton', - params, - undefined, - opts, - ) - } - - getSuggestionsSkeleton( - params?: AppBskyUnspeccedGetSuggestionsSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetSuggestionsSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getSuggestionsSkeleton', - params, - undefined, - opts, - ) - } - - getTaggedSuggestions( - params?: AppBskyUnspeccedGetTaggedSuggestions.QueryParams, - opts?: AppBskyUnspeccedGetTaggedSuggestions.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getTaggedSuggestions', - params, - undefined, - opts, - ) - } - - getTrendingTopics( - params?: AppBskyUnspeccedGetTrendingTopics.QueryParams, - opts?: AppBskyUnspeccedGetTrendingTopics.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getTrendingTopics', - params, - undefined, - opts, - ) - } - - getTrends( - params?: AppBskyUnspeccedGetTrends.QueryParams, - opts?: AppBskyUnspeccedGetTrends.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getTrends', - params, - undefined, - opts, - ) - } - - getTrendsSkeleton( - params?: AppBskyUnspeccedGetTrendsSkeleton.QueryParams, - opts?: AppBskyUnspeccedGetTrendsSkeleton.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.unspecced.getTrendsSkeleton', - params, - undefined, - opts, - ) - } - - initAgeAssurance( - data?: AppBskyUnspeccedInitAgeAssurance.InputSchema, - opts?: AppBskyUnspeccedInitAgeAssurance.CallOptions, - ): Promise { - return this._client - .call('app.bsky.unspecced.initAgeAssurance', opts?.qp, data, opts) - .catch((e) => { - throw AppBskyUnspeccedInitAgeAssurance.toKnownErr(e) - }) - } - - searchActorsSkeleton( - params?: AppBskyUnspeccedSearchActorsSkeleton.QueryParams, - opts?: AppBskyUnspeccedSearchActorsSkeleton.CallOptions, - ): Promise { - return this._client - .call('app.bsky.unspecced.searchActorsSkeleton', params, undefined, opts) - .catch((e) => { - throw AppBskyUnspeccedSearchActorsSkeleton.toKnownErr(e) - }) - } - - searchPostsSkeleton( - params?: AppBskyUnspeccedSearchPostsSkeleton.QueryParams, - opts?: AppBskyUnspeccedSearchPostsSkeleton.CallOptions, - ): Promise { - return this._client - .call('app.bsky.unspecced.searchPostsSkeleton', params, undefined, opts) - .catch((e) => { - throw AppBskyUnspeccedSearchPostsSkeleton.toKnownErr(e) - }) - } - - searchStarterPacksSkeleton( - params?: AppBskyUnspeccedSearchStarterPacksSkeleton.QueryParams, - opts?: AppBskyUnspeccedSearchStarterPacksSkeleton.CallOptions, - ): Promise { - return this._client - .call( - 'app.bsky.unspecced.searchStarterPacksSkeleton', - params, - undefined, - opts, - ) - .catch((e) => { - throw AppBskyUnspeccedSearchStarterPacksSkeleton.toKnownErr(e) - }) - } -} - -export class AppBskyVideoNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getJobStatus( - params?: AppBskyVideoGetJobStatus.QueryParams, - opts?: AppBskyVideoGetJobStatus.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.video.getJobStatus', - params, - undefined, - opts, - ) - } - - getUploadLimits( - params?: AppBskyVideoGetUploadLimits.QueryParams, - opts?: AppBskyVideoGetUploadLimits.CallOptions, - ): Promise { - return this._client.call( - 'app.bsky.video.getUploadLimits', - params, - undefined, - opts, - ) - } - - uploadVideo( - data?: AppBskyVideoUploadVideo.InputSchema, - opts?: AppBskyVideoUploadVideo.CallOptions, - ): Promise { - return this._client.call('app.bsky.video.uploadVideo', opts?.qp, data, opts) - } -} - -export class ChatNS { - _client: XrpcClient - bsky: ChatBskyNS - - constructor(client: XrpcClient) { - this._client = client - this.bsky = new ChatBskyNS(client) - } -} - -export class ChatBskyNS { - _client: XrpcClient - actor: ChatBskyActorNS - convo: ChatBskyConvoNS - group: ChatBskyGroupNS - moderation: ChatBskyModerationNS - - constructor(client: XrpcClient) { - this._client = client - this.actor = new ChatBskyActorNS(client) - this.convo = new ChatBskyConvoNS(client) - this.group = new ChatBskyGroupNS(client) - this.moderation = new ChatBskyModerationNS(client) - } -} - -export class ChatBskyActorNS { - _client: XrpcClient - declaration: ChatBskyActorDeclarationRecord - - constructor(client: XrpcClient) { - this._client = client - this.declaration = new ChatBskyActorDeclarationRecord(client) - } - - deleteAccount( - data?: ChatBskyActorDeleteAccount.InputSchema, - opts?: ChatBskyActorDeleteAccount.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.actor.deleteAccount', - opts?.qp, - data, - opts, - ) - } - - exportAccountData( - params?: ChatBskyActorExportAccountData.QueryParams, - opts?: ChatBskyActorExportAccountData.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.actor.exportAccountData', - params, - undefined, - opts, - ) - } -} - -export class ChatBskyActorDeclarationRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: ChatBskyActorDeclaration.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'chat.bsky.actor.declaration', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: ChatBskyActorDeclaration.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'chat.bsky.actor.declaration', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'chat.bsky.actor.declaration' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { - collection, - rkey: 'self', - ...params, - record: { ...record, $type: collection }, - }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'chat.bsky.actor.declaration' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'chat.bsky.actor.declaration', ...params }, - { headers }, - ) - } -} - -export class ChatBskyConvoNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - acceptConvo( - data?: ChatBskyConvoAcceptConvo.InputSchema, - opts?: ChatBskyConvoAcceptConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.acceptConvo', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoAcceptConvo.toKnownErr(e) - }) - } - - addReaction( - data?: ChatBskyConvoAddReaction.InputSchema, - opts?: ChatBskyConvoAddReaction.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.addReaction', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoAddReaction.toKnownErr(e) - }) - } - - deleteMessageForSelf( - data?: ChatBskyConvoDeleteMessageForSelf.InputSchema, - opts?: ChatBskyConvoDeleteMessageForSelf.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.deleteMessageForSelf', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoDeleteMessageForSelf.toKnownErr(e) - }) - } - - getConvo( - params?: ChatBskyConvoGetConvo.QueryParams, - opts?: ChatBskyConvoGetConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.getConvo', params, undefined, opts) - .catch((e) => { - throw ChatBskyConvoGetConvo.toKnownErr(e) - }) - } - - getConvoAvailability( - params?: ChatBskyConvoGetConvoAvailability.QueryParams, - opts?: ChatBskyConvoGetConvoAvailability.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.convo.getConvoAvailability', - params, - undefined, - opts, - ) - } - - getConvoForMembers( - params?: ChatBskyConvoGetConvoForMembers.QueryParams, - opts?: ChatBskyConvoGetConvoForMembers.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.getConvoForMembers', params, undefined, opts) - .catch((e) => { - throw ChatBskyConvoGetConvoForMembers.toKnownErr(e) - }) - } - - getConvoMembers( - params?: ChatBskyConvoGetConvoMembers.QueryParams, - opts?: ChatBskyConvoGetConvoMembers.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.getConvoMembers', params, undefined, opts) - .catch((e) => { - throw ChatBskyConvoGetConvoMembers.toKnownErr(e) - }) - } - - getLog( - params?: ChatBskyConvoGetLog.QueryParams, - opts?: ChatBskyConvoGetLog.CallOptions, - ): Promise { - return this._client.call('chat.bsky.convo.getLog', params, undefined, opts) - } - - getMessages( - params?: ChatBskyConvoGetMessages.QueryParams, - opts?: ChatBskyConvoGetMessages.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.getMessages', params, undefined, opts) - .catch((e) => { - throw ChatBskyConvoGetMessages.toKnownErr(e) - }) - } - - leaveConvo( - data?: ChatBskyConvoLeaveConvo.InputSchema, - opts?: ChatBskyConvoLeaveConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.leaveConvo', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoLeaveConvo.toKnownErr(e) - }) - } - - listConvoRequests( - params?: ChatBskyConvoListConvoRequests.QueryParams, - opts?: ChatBskyConvoListConvoRequests.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.convo.listConvoRequests', - params, - undefined, - opts, - ) - } - - listConvos( - params?: ChatBskyConvoListConvos.QueryParams, - opts?: ChatBskyConvoListConvos.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.convo.listConvos', - params, - undefined, - opts, - ) - } - - lockConvo( - data?: ChatBskyConvoLockConvo.InputSchema, - opts?: ChatBskyConvoLockConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.lockConvo', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoLockConvo.toKnownErr(e) - }) - } - - muteConvo( - data?: ChatBskyConvoMuteConvo.InputSchema, - opts?: ChatBskyConvoMuteConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.muteConvo', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoMuteConvo.toKnownErr(e) - }) - } - - removeReaction( - data?: ChatBskyConvoRemoveReaction.InputSchema, - opts?: ChatBskyConvoRemoveReaction.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.removeReaction', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoRemoveReaction.toKnownErr(e) - }) - } - - sendMessage( - data?: ChatBskyConvoSendMessage.InputSchema, - opts?: ChatBskyConvoSendMessage.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.sendMessage', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoSendMessage.toKnownErr(e) - }) - } - - sendMessageBatch( - data?: ChatBskyConvoSendMessageBatch.InputSchema, - opts?: ChatBskyConvoSendMessageBatch.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.sendMessageBatch', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoSendMessageBatch.toKnownErr(e) - }) - } - - unlockConvo( - data?: ChatBskyConvoUnlockConvo.InputSchema, - opts?: ChatBskyConvoUnlockConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.unlockConvo', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoUnlockConvo.toKnownErr(e) - }) - } - - unmuteConvo( - data?: ChatBskyConvoUnmuteConvo.InputSchema, - opts?: ChatBskyConvoUnmuteConvo.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.unmuteConvo', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoUnmuteConvo.toKnownErr(e) - }) - } - - updateAllRead( - data?: ChatBskyConvoUpdateAllRead.InputSchema, - opts?: ChatBskyConvoUpdateAllRead.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.convo.updateAllRead', - opts?.qp, - data, - opts, - ) - } - - updateRead( - data?: ChatBskyConvoUpdateRead.InputSchema, - opts?: ChatBskyConvoUpdateRead.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.convo.updateRead', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyConvoUpdateRead.toKnownErr(e) - }) - } -} - -export class ChatBskyGroupNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - addMembers( - data?: ChatBskyGroupAddMembers.InputSchema, - opts?: ChatBskyGroupAddMembers.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.addMembers', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupAddMembers.toKnownErr(e) - }) - } - - approveJoinRequest( - data?: ChatBskyGroupApproveJoinRequest.InputSchema, - opts?: ChatBskyGroupApproveJoinRequest.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.approveJoinRequest', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupApproveJoinRequest.toKnownErr(e) - }) - } - - createGroup( - data?: ChatBskyGroupCreateGroup.InputSchema, - opts?: ChatBskyGroupCreateGroup.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.createGroup', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupCreateGroup.toKnownErr(e) - }) - } - - createJoinLink( - data?: ChatBskyGroupCreateJoinLink.InputSchema, - opts?: ChatBskyGroupCreateJoinLink.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.createJoinLink', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupCreateJoinLink.toKnownErr(e) - }) - } - - disableJoinLink( - data?: ChatBskyGroupDisableJoinLink.InputSchema, - opts?: ChatBskyGroupDisableJoinLink.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.disableJoinLink', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupDisableJoinLink.toKnownErr(e) - }) - } - - editGroup( - data?: ChatBskyGroupEditGroup.InputSchema, - opts?: ChatBskyGroupEditGroup.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.editGroup', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupEditGroup.toKnownErr(e) - }) - } - - editJoinLink( - data?: ChatBskyGroupEditJoinLink.InputSchema, - opts?: ChatBskyGroupEditJoinLink.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.editJoinLink', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupEditJoinLink.toKnownErr(e) - }) - } - - enableJoinLink( - data?: ChatBskyGroupEnableJoinLink.InputSchema, - opts?: ChatBskyGroupEnableJoinLink.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.enableJoinLink', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupEnableJoinLink.toKnownErr(e) - }) - } - - getJoinLinkPreview( - params?: ChatBskyGroupGetJoinLinkPreview.QueryParams, - opts?: ChatBskyGroupGetJoinLinkPreview.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.getJoinLinkPreview', params, undefined, opts) - .catch((e) => { - throw ChatBskyGroupGetJoinLinkPreview.toKnownErr(e) - }) - } - - listJoinRequests( - params?: ChatBskyGroupListJoinRequests.QueryParams, - opts?: ChatBskyGroupListJoinRequests.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.listJoinRequests', params, undefined, opts) - .catch((e) => { - throw ChatBskyGroupListJoinRequests.toKnownErr(e) - }) - } - - listMutualGroups( - params?: ChatBskyGroupListMutualGroups.QueryParams, - opts?: ChatBskyGroupListMutualGroups.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.group.listMutualGroups', - params, - undefined, - opts, - ) - } - - rejectJoinRequest( - data?: ChatBskyGroupRejectJoinRequest.InputSchema, - opts?: ChatBskyGroupRejectJoinRequest.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.rejectJoinRequest', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupRejectJoinRequest.toKnownErr(e) - }) - } - - removeMembers( - data?: ChatBskyGroupRemoveMembers.InputSchema, - opts?: ChatBskyGroupRemoveMembers.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.removeMembers', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupRemoveMembers.toKnownErr(e) - }) - } - - requestJoin( - data?: ChatBskyGroupRequestJoin.InputSchema, - opts?: ChatBskyGroupRequestJoin.CallOptions, - ): Promise { - return this._client - .call('chat.bsky.group.requestJoin', opts?.qp, data, opts) - .catch((e) => { - throw ChatBskyGroupRequestJoin.toKnownErr(e) - }) - } -} - -export class ChatBskyModerationNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getActorMetadata( - params?: ChatBskyModerationGetActorMetadata.QueryParams, - opts?: ChatBskyModerationGetActorMetadata.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.moderation.getActorMetadata', - params, - undefined, - opts, - ) - } - - getMessageContext( - params?: ChatBskyModerationGetMessageContext.QueryParams, - opts?: ChatBskyModerationGetMessageContext.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.moderation.getMessageContext', - params, - undefined, - opts, - ) - } - - updateActorAccess( - data?: ChatBskyModerationUpdateActorAccess.InputSchema, - opts?: ChatBskyModerationUpdateActorAccess.CallOptions, - ): Promise { - return this._client.call( - 'chat.bsky.moderation.updateActorAccess', - opts?.qp, - data, - opts, - ) - } -} - -export class ComNS { - _client: XrpcClient - atproto: ComAtprotoNS - germnetwork: ComGermnetworkNS - - constructor(client: XrpcClient) { - this._client = client - this.atproto = new ComAtprotoNS(client) - this.germnetwork = new ComGermnetworkNS(client) - } -} - -export class ComAtprotoNS { - _client: XrpcClient - admin: ComAtprotoAdminNS - identity: ComAtprotoIdentityNS - label: ComAtprotoLabelNS - lexicon: ComAtprotoLexiconNS - moderation: ComAtprotoModerationNS - repo: ComAtprotoRepoNS - server: ComAtprotoServerNS - sync: ComAtprotoSyncNS - temp: ComAtprotoTempNS - - constructor(client: XrpcClient) { - this._client = client - this.admin = new ComAtprotoAdminNS(client) - this.identity = new ComAtprotoIdentityNS(client) - this.label = new ComAtprotoLabelNS(client) - this.lexicon = new ComAtprotoLexiconNS(client) - this.moderation = new ComAtprotoModerationNS(client) - this.repo = new ComAtprotoRepoNS(client) - this.server = new ComAtprotoServerNS(client) - this.sync = new ComAtprotoSyncNS(client) - this.temp = new ComAtprotoTempNS(client) - } -} - -export class ComAtprotoAdminNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - deleteAccount( - data?: ComAtprotoAdminDeleteAccount.InputSchema, - opts?: ComAtprotoAdminDeleteAccount.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.deleteAccount', - opts?.qp, - data, - opts, - ) - } - - disableAccountInvites( - data?: ComAtprotoAdminDisableAccountInvites.InputSchema, - opts?: ComAtprotoAdminDisableAccountInvites.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.disableAccountInvites', - opts?.qp, - data, - opts, - ) - } - - disableInviteCodes( - data?: ComAtprotoAdminDisableInviteCodes.InputSchema, - opts?: ComAtprotoAdminDisableInviteCodes.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.disableInviteCodes', - opts?.qp, - data, - opts, - ) - } - - enableAccountInvites( - data?: ComAtprotoAdminEnableAccountInvites.InputSchema, - opts?: ComAtprotoAdminEnableAccountInvites.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.enableAccountInvites', - opts?.qp, - data, - opts, - ) - } - - getAccountInfo( - params?: ComAtprotoAdminGetAccountInfo.QueryParams, - opts?: ComAtprotoAdminGetAccountInfo.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.getAccountInfo', - params, - undefined, - opts, - ) - } - - getAccountInfos( - params?: ComAtprotoAdminGetAccountInfos.QueryParams, - opts?: ComAtprotoAdminGetAccountInfos.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.getAccountInfos', - params, - undefined, - opts, - ) - } - - getInviteCodes( - params?: ComAtprotoAdminGetInviteCodes.QueryParams, - opts?: ComAtprotoAdminGetInviteCodes.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.getInviteCodes', - params, - undefined, - opts, - ) - } - - getSubjectStatus( - params?: ComAtprotoAdminGetSubjectStatus.QueryParams, - opts?: ComAtprotoAdminGetSubjectStatus.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.getSubjectStatus', - params, - undefined, - opts, - ) - } - - searchAccounts( - params?: ComAtprotoAdminSearchAccounts.QueryParams, - opts?: ComAtprotoAdminSearchAccounts.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.searchAccounts', - params, - undefined, - opts, - ) - } - - sendEmail( - data?: ComAtprotoAdminSendEmail.InputSchema, - opts?: ComAtprotoAdminSendEmail.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.sendEmail', - opts?.qp, - data, - opts, - ) - } - - updateAccountEmail( - data?: ComAtprotoAdminUpdateAccountEmail.InputSchema, - opts?: ComAtprotoAdminUpdateAccountEmail.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.updateAccountEmail', - opts?.qp, - data, - opts, - ) - } - - updateAccountHandle( - data?: ComAtprotoAdminUpdateAccountHandle.InputSchema, - opts?: ComAtprotoAdminUpdateAccountHandle.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.updateAccountHandle', - opts?.qp, - data, - opts, - ) - } - - updateAccountPassword( - data?: ComAtprotoAdminUpdateAccountPassword.InputSchema, - opts?: ComAtprotoAdminUpdateAccountPassword.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.updateAccountPassword', - opts?.qp, - data, - opts, - ) - } - - updateAccountSigningKey( - data?: ComAtprotoAdminUpdateAccountSigningKey.InputSchema, - opts?: ComAtprotoAdminUpdateAccountSigningKey.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.updateAccountSigningKey', - opts?.qp, - data, - opts, - ) - } - - updateSubjectStatus( - data?: ComAtprotoAdminUpdateSubjectStatus.InputSchema, - opts?: ComAtprotoAdminUpdateSubjectStatus.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.admin.updateSubjectStatus', - opts?.qp, - data, - opts, - ) - } -} - -export class ComAtprotoIdentityNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getRecommendedDidCredentials( - params?: ComAtprotoIdentityGetRecommendedDidCredentials.QueryParams, - opts?: ComAtprotoIdentityGetRecommendedDidCredentials.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.identity.getRecommendedDidCredentials', - params, - undefined, - opts, - ) - } - - refreshIdentity( - data?: ComAtprotoIdentityRefreshIdentity.InputSchema, - opts?: ComAtprotoIdentityRefreshIdentity.CallOptions, - ): Promise { - return this._client - .call('com.atproto.identity.refreshIdentity', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoIdentityRefreshIdentity.toKnownErr(e) - }) - } - - requestPlcOperationSignature( - data?: ComAtprotoIdentityRequestPlcOperationSignature.InputSchema, - opts?: ComAtprotoIdentityRequestPlcOperationSignature.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.identity.requestPlcOperationSignature', - opts?.qp, - data, - opts, - ) - } - - resolveDid( - params?: ComAtprotoIdentityResolveDid.QueryParams, - opts?: ComAtprotoIdentityResolveDid.CallOptions, - ): Promise { - return this._client - .call('com.atproto.identity.resolveDid', params, undefined, opts) - .catch((e) => { - throw ComAtprotoIdentityResolveDid.toKnownErr(e) - }) - } - - resolveHandle( - params?: ComAtprotoIdentityResolveHandle.QueryParams, - opts?: ComAtprotoIdentityResolveHandle.CallOptions, - ): Promise { - return this._client - .call('com.atproto.identity.resolveHandle', params, undefined, opts) - .catch((e) => { - throw ComAtprotoIdentityResolveHandle.toKnownErr(e) - }) - } - - resolveIdentity( - params?: ComAtprotoIdentityResolveIdentity.QueryParams, - opts?: ComAtprotoIdentityResolveIdentity.CallOptions, - ): Promise { - return this._client - .call('com.atproto.identity.resolveIdentity', params, undefined, opts) - .catch((e) => { - throw ComAtprotoIdentityResolveIdentity.toKnownErr(e) - }) - } - - signPlcOperation( - data?: ComAtprotoIdentitySignPlcOperation.InputSchema, - opts?: ComAtprotoIdentitySignPlcOperation.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.identity.signPlcOperation', - opts?.qp, - data, - opts, - ) - } - - submitPlcOperation( - data?: ComAtprotoIdentitySubmitPlcOperation.InputSchema, - opts?: ComAtprotoIdentitySubmitPlcOperation.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.identity.submitPlcOperation', - opts?.qp, - data, - opts, - ) - } - - updateHandle( - data?: ComAtprotoIdentityUpdateHandle.InputSchema, - opts?: ComAtprotoIdentityUpdateHandle.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.identity.updateHandle', - opts?.qp, - data, - opts, - ) - } -} - -export class ComAtprotoLabelNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - queryLabels( - params?: ComAtprotoLabelQueryLabels.QueryParams, - opts?: ComAtprotoLabelQueryLabels.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.label.queryLabels', - params, - undefined, - opts, - ) - } -} - -export class ComAtprotoLexiconNS { - _client: XrpcClient - schema: ComAtprotoLexiconSchemaRecord - - constructor(client: XrpcClient) { - this._client = client - this.schema = new ComAtprotoLexiconSchemaRecord(client) - } - - resolveLexicon( - params?: ComAtprotoLexiconResolveLexicon.QueryParams, - opts?: ComAtprotoLexiconResolveLexicon.CallOptions, - ): Promise { - return this._client - .call('com.atproto.lexicon.resolveLexicon', params, undefined, opts) - .catch((e) => { - throw ComAtprotoLexiconResolveLexicon.toKnownErr(e) - }) - } -} - -export class ComAtprotoLexiconSchemaRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: ComAtprotoLexiconSchema.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'com.atproto.lexicon.schema', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: ComAtprotoLexiconSchema.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'com.atproto.lexicon.schema', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'com.atproto.lexicon.schema' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'com.atproto.lexicon.schema' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'com.atproto.lexicon.schema', ...params }, - { headers }, - ) - } -} - -export class ComAtprotoModerationNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - createReport( - data?: ComAtprotoModerationCreateReport.InputSchema, - opts?: ComAtprotoModerationCreateReport.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.moderation.createReport', - opts?.qp, - data, - opts, - ) - } -} - -export class ComAtprotoRepoNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - applyWrites( - data?: ComAtprotoRepoApplyWrites.InputSchema, - opts?: ComAtprotoRepoApplyWrites.CallOptions, - ): Promise { - return this._client - .call('com.atproto.repo.applyWrites', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoRepoApplyWrites.toKnownErr(e) - }) - } - - createRecord( - data?: ComAtprotoRepoCreateRecord.InputSchema, - opts?: ComAtprotoRepoCreateRecord.CallOptions, - ): Promise { - return this._client - .call('com.atproto.repo.createRecord', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoRepoCreateRecord.toKnownErr(e) - }) - } - - deleteRecord( - data?: ComAtprotoRepoDeleteRecord.InputSchema, - opts?: ComAtprotoRepoDeleteRecord.CallOptions, - ): Promise { - return this._client - .call('com.atproto.repo.deleteRecord', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoRepoDeleteRecord.toKnownErr(e) - }) - } - - describeRepo( - params?: ComAtprotoRepoDescribeRepo.QueryParams, - opts?: ComAtprotoRepoDescribeRepo.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.repo.describeRepo', - params, - undefined, - opts, - ) - } - - getRecord( - params?: ComAtprotoRepoGetRecord.QueryParams, - opts?: ComAtprotoRepoGetRecord.CallOptions, - ): Promise { - return this._client - .call('com.atproto.repo.getRecord', params, undefined, opts) - .catch((e) => { - throw ComAtprotoRepoGetRecord.toKnownErr(e) - }) - } - - importRepo( - data?: ComAtprotoRepoImportRepo.InputSchema, - opts?: ComAtprotoRepoImportRepo.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.repo.importRepo', - opts?.qp, - data, - opts, - ) - } - - listMissingBlobs( - params?: ComAtprotoRepoListMissingBlobs.QueryParams, - opts?: ComAtprotoRepoListMissingBlobs.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.repo.listMissingBlobs', - params, - undefined, - opts, - ) - } - - listRecords( - params?: ComAtprotoRepoListRecords.QueryParams, - opts?: ComAtprotoRepoListRecords.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.repo.listRecords', - params, - undefined, - opts, - ) - } - - putRecord( - data?: ComAtprotoRepoPutRecord.InputSchema, - opts?: ComAtprotoRepoPutRecord.CallOptions, - ): Promise { - return this._client - .call('com.atproto.repo.putRecord', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoRepoPutRecord.toKnownErr(e) - }) - } - - uploadBlob( - data?: ComAtprotoRepoUploadBlob.InputSchema, - opts?: ComAtprotoRepoUploadBlob.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.repo.uploadBlob', - opts?.qp, - data, - opts, - ) - } -} - -export class ComAtprotoServerNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - activateAccount( - data?: ComAtprotoServerActivateAccount.InputSchema, - opts?: ComAtprotoServerActivateAccount.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.activateAccount', - opts?.qp, - data, - opts, - ) - } - - checkAccountStatus( - params?: ComAtprotoServerCheckAccountStatus.QueryParams, - opts?: ComAtprotoServerCheckAccountStatus.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.checkAccountStatus', - params, - undefined, - opts, - ) - } - - confirmEmail( - data?: ComAtprotoServerConfirmEmail.InputSchema, - opts?: ComAtprotoServerConfirmEmail.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.confirmEmail', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerConfirmEmail.toKnownErr(e) - }) - } - - createAccount( - data?: ComAtprotoServerCreateAccount.InputSchema, - opts?: ComAtprotoServerCreateAccount.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.createAccount', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerCreateAccount.toKnownErr(e) - }) - } - - createAppPassword( - data?: ComAtprotoServerCreateAppPassword.InputSchema, - opts?: ComAtprotoServerCreateAppPassword.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.createAppPassword', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerCreateAppPassword.toKnownErr(e) - }) - } - - createInviteCode( - data?: ComAtprotoServerCreateInviteCode.InputSchema, - opts?: ComAtprotoServerCreateInviteCode.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.createInviteCode', - opts?.qp, - data, - opts, - ) - } - - createInviteCodes( - data?: ComAtprotoServerCreateInviteCodes.InputSchema, - opts?: ComAtprotoServerCreateInviteCodes.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.createInviteCodes', - opts?.qp, - data, - opts, - ) - } - - createSession( - data?: ComAtprotoServerCreateSession.InputSchema, - opts?: ComAtprotoServerCreateSession.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.createSession', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerCreateSession.toKnownErr(e) - }) - } - - deactivateAccount( - data?: ComAtprotoServerDeactivateAccount.InputSchema, - opts?: ComAtprotoServerDeactivateAccount.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.deactivateAccount', - opts?.qp, - data, - opts, - ) - } - - deleteAccount( - data?: ComAtprotoServerDeleteAccount.InputSchema, - opts?: ComAtprotoServerDeleteAccount.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.deleteAccount', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerDeleteAccount.toKnownErr(e) - }) - } - - deleteSession( - data?: ComAtprotoServerDeleteSession.InputSchema, - opts?: ComAtprotoServerDeleteSession.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.deleteSession', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerDeleteSession.toKnownErr(e) - }) - } - - describeServer( - params?: ComAtprotoServerDescribeServer.QueryParams, - opts?: ComAtprotoServerDescribeServer.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.describeServer', - params, - undefined, - opts, - ) - } - - getAccountInviteCodes( - params?: ComAtprotoServerGetAccountInviteCodes.QueryParams, - opts?: ComAtprotoServerGetAccountInviteCodes.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.getAccountInviteCodes', params, undefined, opts) - .catch((e) => { - throw ComAtprotoServerGetAccountInviteCodes.toKnownErr(e) - }) - } - - getServiceAuth( - params?: ComAtprotoServerGetServiceAuth.QueryParams, - opts?: ComAtprotoServerGetServiceAuth.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.getServiceAuth', params, undefined, opts) - .catch((e) => { - throw ComAtprotoServerGetServiceAuth.toKnownErr(e) - }) - } - - getSession( - params?: ComAtprotoServerGetSession.QueryParams, - opts?: ComAtprotoServerGetSession.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.getSession', - params, - undefined, - opts, - ) - } - - listAppPasswords( - params?: ComAtprotoServerListAppPasswords.QueryParams, - opts?: ComAtprotoServerListAppPasswords.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.listAppPasswords', params, undefined, opts) - .catch((e) => { - throw ComAtprotoServerListAppPasswords.toKnownErr(e) - }) - } - - refreshSession( - data?: ComAtprotoServerRefreshSession.InputSchema, - opts?: ComAtprotoServerRefreshSession.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.refreshSession', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerRefreshSession.toKnownErr(e) - }) - } - - requestAccountDelete( - data?: ComAtprotoServerRequestAccountDelete.InputSchema, - opts?: ComAtprotoServerRequestAccountDelete.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.requestAccountDelete', - opts?.qp, - data, - opts, - ) - } - - requestEmailConfirmation( - data?: ComAtprotoServerRequestEmailConfirmation.InputSchema, - opts?: ComAtprotoServerRequestEmailConfirmation.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.requestEmailConfirmation', - opts?.qp, - data, - opts, - ) - } - - requestEmailUpdate( - data?: ComAtprotoServerRequestEmailUpdate.InputSchema, - opts?: ComAtprotoServerRequestEmailUpdate.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.requestEmailUpdate', - opts?.qp, - data, - opts, - ) - } - - requestPasswordReset( - data?: ComAtprotoServerRequestPasswordReset.InputSchema, - opts?: ComAtprotoServerRequestPasswordReset.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.requestPasswordReset', - opts?.qp, - data, - opts, - ) - } - - reserveSigningKey( - data?: ComAtprotoServerReserveSigningKey.InputSchema, - opts?: ComAtprotoServerReserveSigningKey.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.reserveSigningKey', - opts?.qp, - data, - opts, - ) - } - - resetPassword( - data?: ComAtprotoServerResetPassword.InputSchema, - opts?: ComAtprotoServerResetPassword.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.resetPassword', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerResetPassword.toKnownErr(e) - }) - } - - revokeAppPassword( - data?: ComAtprotoServerRevokeAppPassword.InputSchema, - opts?: ComAtprotoServerRevokeAppPassword.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.server.revokeAppPassword', - opts?.qp, - data, - opts, - ) - } - - updateEmail( - data?: ComAtprotoServerUpdateEmail.InputSchema, - opts?: ComAtprotoServerUpdateEmail.CallOptions, - ): Promise { - return this._client - .call('com.atproto.server.updateEmail', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoServerUpdateEmail.toKnownErr(e) - }) - } -} - -export class ComAtprotoSyncNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getBlob( - params?: ComAtprotoSyncGetBlob.QueryParams, - opts?: ComAtprotoSyncGetBlob.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getBlob', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetBlob.toKnownErr(e) - }) - } - - getBlocks( - params?: ComAtprotoSyncGetBlocks.QueryParams, - opts?: ComAtprotoSyncGetBlocks.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getBlocks', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetBlocks.toKnownErr(e) - }) - } - - getCheckout( - params?: ComAtprotoSyncGetCheckout.QueryParams, - opts?: ComAtprotoSyncGetCheckout.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.sync.getCheckout', - params, - undefined, - opts, - ) - } - - getHead( - params?: ComAtprotoSyncGetHead.QueryParams, - opts?: ComAtprotoSyncGetHead.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getHead', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetHead.toKnownErr(e) - }) - } - - getHostStatus( - params?: ComAtprotoSyncGetHostStatus.QueryParams, - opts?: ComAtprotoSyncGetHostStatus.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getHostStatus', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetHostStatus.toKnownErr(e) - }) - } - - getLatestCommit( - params?: ComAtprotoSyncGetLatestCommit.QueryParams, - opts?: ComAtprotoSyncGetLatestCommit.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getLatestCommit', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetLatestCommit.toKnownErr(e) - }) - } - - getRecord( - params?: ComAtprotoSyncGetRecord.QueryParams, - opts?: ComAtprotoSyncGetRecord.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getRecord', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetRecord.toKnownErr(e) - }) - } - - getRepo( - params?: ComAtprotoSyncGetRepo.QueryParams, - opts?: ComAtprotoSyncGetRepo.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getRepo', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetRepo.toKnownErr(e) - }) - } - - getRepoStatus( - params?: ComAtprotoSyncGetRepoStatus.QueryParams, - opts?: ComAtprotoSyncGetRepoStatus.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.getRepoStatus', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncGetRepoStatus.toKnownErr(e) - }) - } - - listBlobs( - params?: ComAtprotoSyncListBlobs.QueryParams, - opts?: ComAtprotoSyncListBlobs.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.listBlobs', params, undefined, opts) - .catch((e) => { - throw ComAtprotoSyncListBlobs.toKnownErr(e) - }) - } - - listHosts( - params?: ComAtprotoSyncListHosts.QueryParams, - opts?: ComAtprotoSyncListHosts.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.sync.listHosts', - params, - undefined, - opts, - ) - } - - listRepos( - params?: ComAtprotoSyncListRepos.QueryParams, - opts?: ComAtprotoSyncListRepos.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.sync.listRepos', - params, - undefined, - opts, - ) - } - - listReposByCollection( - params?: ComAtprotoSyncListReposByCollection.QueryParams, - opts?: ComAtprotoSyncListReposByCollection.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.sync.listReposByCollection', - params, - undefined, - opts, - ) - } - - notifyOfUpdate( - data?: ComAtprotoSyncNotifyOfUpdate.InputSchema, - opts?: ComAtprotoSyncNotifyOfUpdate.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.sync.notifyOfUpdate', - opts?.qp, - data, - opts, - ) - } - - requestCrawl( - data?: ComAtprotoSyncRequestCrawl.InputSchema, - opts?: ComAtprotoSyncRequestCrawl.CallOptions, - ): Promise { - return this._client - .call('com.atproto.sync.requestCrawl', opts?.qp, data, opts) - .catch((e) => { - throw ComAtprotoSyncRequestCrawl.toKnownErr(e) - }) - } -} - -export class ComAtprotoTempNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - addReservedHandle( - data?: ComAtprotoTempAddReservedHandle.InputSchema, - opts?: ComAtprotoTempAddReservedHandle.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.temp.addReservedHandle', - opts?.qp, - data, - opts, - ) - } - - checkHandleAvailability( - params?: ComAtprotoTempCheckHandleAvailability.QueryParams, - opts?: ComAtprotoTempCheckHandleAvailability.CallOptions, - ): Promise { - return this._client - .call('com.atproto.temp.checkHandleAvailability', params, undefined, opts) - .catch((e) => { - throw ComAtprotoTempCheckHandleAvailability.toKnownErr(e) - }) - } - - checkSignupQueue( - params?: ComAtprotoTempCheckSignupQueue.QueryParams, - opts?: ComAtprotoTempCheckSignupQueue.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.temp.checkSignupQueue', - params, - undefined, - opts, - ) - } - - dereferenceScope( - params?: ComAtprotoTempDereferenceScope.QueryParams, - opts?: ComAtprotoTempDereferenceScope.CallOptions, - ): Promise { - return this._client - .call('com.atproto.temp.dereferenceScope', params, undefined, opts) - .catch((e) => { - throw ComAtprotoTempDereferenceScope.toKnownErr(e) - }) - } - - fetchLabels( - params?: ComAtprotoTempFetchLabels.QueryParams, - opts?: ComAtprotoTempFetchLabels.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.temp.fetchLabels', - params, - undefined, - opts, - ) - } - - requestPhoneVerification( - data?: ComAtprotoTempRequestPhoneVerification.InputSchema, - opts?: ComAtprotoTempRequestPhoneVerification.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.temp.requestPhoneVerification', - opts?.qp, - data, - opts, - ) - } - - revokeAccountCredentials( - data?: ComAtprotoTempRevokeAccountCredentials.InputSchema, - opts?: ComAtprotoTempRevokeAccountCredentials.CallOptions, - ): Promise { - return this._client.call( - 'com.atproto.temp.revokeAccountCredentials', - opts?.qp, - data, - opts, - ) - } -} - -export class ComGermnetworkNS { - _client: XrpcClient - declaration: ComGermnetworkDeclarationRecord - - constructor(client: XrpcClient) { - this._client = client - this.declaration = new ComGermnetworkDeclarationRecord(client) - } -} - -export class ComGermnetworkDeclarationRecord { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - async list( - params: OmitKey, - ): Promise<{ - cursor?: string - records: { uri: string; value: ComGermnetworkDeclaration.Record }[] - }> { - const res = await this._client.call('com.atproto.repo.listRecords', { - collection: 'com.germnetwork.declaration', - ...params, - }) - return res.data - } - - async get( - params: OmitKey, - ): Promise<{ - uri: string - cid: string - value: ComGermnetworkDeclaration.Record - }> { - const res = await this._client.call('com.atproto.repo.getRecord', { - collection: 'com.germnetwork.declaration', - ...params, - }) - return res.data - } - - async create( - params: OmitKey< - ComAtprotoRepoCreateRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'com.germnetwork.declaration' - const res = await this._client.call( - 'com.atproto.repo.createRecord', - undefined, - { - collection, - rkey: 'self', - ...params, - record: { ...record, $type: collection }, - }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async put( - params: OmitKey< - ComAtprotoRepoPutRecord.InputSchema, - 'collection' | 'record' - >, - record: Un$Typed, - headers?: Record, - ): Promise<{ uri: string; cid: string }> { - const collection = 'com.germnetwork.declaration' - const res = await this._client.call( - 'com.atproto.repo.putRecord', - undefined, - { collection, ...params, record: { ...record, $type: collection } }, - { encoding: 'application/json', headers }, - ) - return res.data - } - - async delete( - params: OmitKey, - headers?: Record, - ): Promise { - await this._client.call( - 'com.atproto.repo.deleteRecord', - undefined, - { collection: 'com.germnetwork.declaration', ...params }, - { headers }, - ) - } -} - -export class ToolsNS { - _client: XrpcClient - ozone: ToolsOzoneNS - - constructor(client: XrpcClient) { - this._client = client - this.ozone = new ToolsOzoneNS(client) - } -} - -export class ToolsOzoneNS { - _client: XrpcClient - communication: ToolsOzoneCommunicationNS - hosting: ToolsOzoneHostingNS - moderation: ToolsOzoneModerationNS - queue: ToolsOzoneQueueNS - report: ToolsOzoneReportNS - safelink: ToolsOzoneSafelinkNS - server: ToolsOzoneServerNS - set: ToolsOzoneSetNS - setting: ToolsOzoneSettingNS - signature: ToolsOzoneSignatureNS - team: ToolsOzoneTeamNS - verification: ToolsOzoneVerificationNS - - constructor(client: XrpcClient) { - this._client = client - this.communication = new ToolsOzoneCommunicationNS(client) - this.hosting = new ToolsOzoneHostingNS(client) - this.moderation = new ToolsOzoneModerationNS(client) - this.queue = new ToolsOzoneQueueNS(client) - this.report = new ToolsOzoneReportNS(client) - this.safelink = new ToolsOzoneSafelinkNS(client) - this.server = new ToolsOzoneServerNS(client) - this.set = new ToolsOzoneSetNS(client) - this.setting = new ToolsOzoneSettingNS(client) - this.signature = new ToolsOzoneSignatureNS(client) - this.team = new ToolsOzoneTeamNS(client) - this.verification = new ToolsOzoneVerificationNS(client) - } -} - -export class ToolsOzoneCommunicationNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - createTemplate( - data?: ToolsOzoneCommunicationCreateTemplate.InputSchema, - opts?: ToolsOzoneCommunicationCreateTemplate.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.communication.createTemplate', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneCommunicationCreateTemplate.toKnownErr(e) - }) - } - - deleteTemplate( - data?: ToolsOzoneCommunicationDeleteTemplate.InputSchema, - opts?: ToolsOzoneCommunicationDeleteTemplate.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.communication.deleteTemplate', - opts?.qp, - data, - opts, - ) - } - - listTemplates( - params?: ToolsOzoneCommunicationListTemplates.QueryParams, - opts?: ToolsOzoneCommunicationListTemplates.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.communication.listTemplates', - params, - undefined, - opts, - ) - } - - updateTemplate( - data?: ToolsOzoneCommunicationUpdateTemplate.InputSchema, - opts?: ToolsOzoneCommunicationUpdateTemplate.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.communication.updateTemplate', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneCommunicationUpdateTemplate.toKnownErr(e) - }) - } -} - -export class ToolsOzoneHostingNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getAccountHistory( - params?: ToolsOzoneHostingGetAccountHistory.QueryParams, - opts?: ToolsOzoneHostingGetAccountHistory.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.hosting.getAccountHistory', - params, - undefined, - opts, - ) - } -} - -export class ToolsOzoneModerationNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - cancelScheduledActions( - data?: ToolsOzoneModerationCancelScheduledActions.InputSchema, - opts?: ToolsOzoneModerationCancelScheduledActions.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.cancelScheduledActions', - opts?.qp, - data, - opts, - ) - } - - emitEvent( - data?: ToolsOzoneModerationEmitEvent.InputSchema, - opts?: ToolsOzoneModerationEmitEvent.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.moderation.emitEvent', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneModerationEmitEvent.toKnownErr(e) - }) - } - - getAccountTimeline( - params?: ToolsOzoneModerationGetAccountTimeline.QueryParams, - opts?: ToolsOzoneModerationGetAccountTimeline.CallOptions, - ): Promise { - return this._client - .call( - 'tools.ozone.moderation.getAccountTimeline', - params, - undefined, - opts, - ) - .catch((e) => { - throw ToolsOzoneModerationGetAccountTimeline.toKnownErr(e) - }) - } - - getEvent( - params?: ToolsOzoneModerationGetEvent.QueryParams, - opts?: ToolsOzoneModerationGetEvent.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.getEvent', - params, - undefined, - opts, - ) - } - - getRecord( - params?: ToolsOzoneModerationGetRecord.QueryParams, - opts?: ToolsOzoneModerationGetRecord.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.moderation.getRecord', params, undefined, opts) - .catch((e) => { - throw ToolsOzoneModerationGetRecord.toKnownErr(e) - }) - } - - getRecords( - params?: ToolsOzoneModerationGetRecords.QueryParams, - opts?: ToolsOzoneModerationGetRecords.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.getRecords', - params, - undefined, - opts, - ) - } - - getRepo( - params?: ToolsOzoneModerationGetRepo.QueryParams, - opts?: ToolsOzoneModerationGetRepo.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.moderation.getRepo', params, undefined, opts) - .catch((e) => { - throw ToolsOzoneModerationGetRepo.toKnownErr(e) - }) - } - - getReporterStats( - params?: ToolsOzoneModerationGetReporterStats.QueryParams, - opts?: ToolsOzoneModerationGetReporterStats.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.getReporterStats', - params, - undefined, - opts, - ) - } - - getRepos( - params?: ToolsOzoneModerationGetRepos.QueryParams, - opts?: ToolsOzoneModerationGetRepos.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.getRepos', - params, - undefined, - opts, - ) - } - - getSubjects( - params?: ToolsOzoneModerationGetSubjects.QueryParams, - opts?: ToolsOzoneModerationGetSubjects.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.getSubjects', - params, - undefined, - opts, - ) - } - - listScheduledActions( - data?: ToolsOzoneModerationListScheduledActions.InputSchema, - opts?: ToolsOzoneModerationListScheduledActions.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.listScheduledActions', - opts?.qp, - data, - opts, - ) - } - - queryEvents( - params?: ToolsOzoneModerationQueryEvents.QueryParams, - opts?: ToolsOzoneModerationQueryEvents.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.queryEvents', - params, - undefined, - opts, - ) - } - - queryStatuses( - params?: ToolsOzoneModerationQueryStatuses.QueryParams, - opts?: ToolsOzoneModerationQueryStatuses.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.queryStatuses', - params, - undefined, - opts, - ) - } - - scheduleAction( - data?: ToolsOzoneModerationScheduleAction.InputSchema, - opts?: ToolsOzoneModerationScheduleAction.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.scheduleAction', - opts?.qp, - data, - opts, - ) - } - - searchRepos( - params?: ToolsOzoneModerationSearchRepos.QueryParams, - opts?: ToolsOzoneModerationSearchRepos.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.moderation.searchRepos', - params, - undefined, - opts, - ) - } -} - -export class ToolsOzoneQueueNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - assignModerator( - data?: ToolsOzoneQueueAssignModerator.InputSchema, - opts?: ToolsOzoneQueueAssignModerator.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.queue.assignModerator', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneQueueAssignModerator.toKnownErr(e) - }) - } - - createQueue( - data?: ToolsOzoneQueueCreateQueue.InputSchema, - opts?: ToolsOzoneQueueCreateQueue.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.queue.createQueue', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneQueueCreateQueue.toKnownErr(e) - }) - } - - deleteQueue( - data?: ToolsOzoneQueueDeleteQueue.InputSchema, - opts?: ToolsOzoneQueueDeleteQueue.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.queue.deleteQueue', - opts?.qp, - data, - opts, - ) - } - - getAssignments( - params?: ToolsOzoneQueueGetAssignments.QueryParams, - opts?: ToolsOzoneQueueGetAssignments.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.queue.getAssignments', - params, - undefined, - opts, - ) - } - - listQueues( - params?: ToolsOzoneQueueListQueues.QueryParams, - opts?: ToolsOzoneQueueListQueues.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.queue.listQueues', - params, - undefined, - opts, - ) - } - - routeReports( - data?: ToolsOzoneQueueRouteReports.InputSchema, - opts?: ToolsOzoneQueueRouteReports.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.queue.routeReports', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneQueueRouteReports.toKnownErr(e) - }) - } - - unassignModerator( - data?: ToolsOzoneQueueUnassignModerator.InputSchema, - opts?: ToolsOzoneQueueUnassignModerator.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.queue.unassignModerator', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneQueueUnassignModerator.toKnownErr(e) - }) - } - - updateQueue( - data?: ToolsOzoneQueueUpdateQueue.InputSchema, - opts?: ToolsOzoneQueueUpdateQueue.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.queue.updateQueue', - opts?.qp, - data, - opts, - ) - } -} - -export class ToolsOzoneReportNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - assignModerator( - data?: ToolsOzoneReportAssignModerator.InputSchema, - opts?: ToolsOzoneReportAssignModerator.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.report.assignModerator', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneReportAssignModerator.toKnownErr(e) - }) - } - - createActivity( - data?: ToolsOzoneReportCreateActivity.InputSchema, - opts?: ToolsOzoneReportCreateActivity.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.report.createActivity', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneReportCreateActivity.toKnownErr(e) - }) - } - - getAssignments( - params?: ToolsOzoneReportGetAssignments.QueryParams, - opts?: ToolsOzoneReportGetAssignments.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.report.getAssignments', - params, - undefined, - opts, - ) - } - - getHistoricalStats( - params?: ToolsOzoneReportGetHistoricalStats.QueryParams, - opts?: ToolsOzoneReportGetHistoricalStats.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.report.getHistoricalStats', - params, - undefined, - opts, - ) - } - - getLatestReport( - params?: ToolsOzoneReportGetLatestReport.QueryParams, - opts?: ToolsOzoneReportGetLatestReport.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.report.getLatestReport', params, undefined, opts) - .catch((e) => { - throw ToolsOzoneReportGetLatestReport.toKnownErr(e) - }) - } - - getLiveStats( - params?: ToolsOzoneReportGetLiveStats.QueryParams, - opts?: ToolsOzoneReportGetLiveStats.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.report.getLiveStats', - params, - undefined, - opts, - ) - } - - getReport( - params?: ToolsOzoneReportGetReport.QueryParams, - opts?: ToolsOzoneReportGetReport.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.report.getReport', params, undefined, opts) - .catch((e) => { - throw ToolsOzoneReportGetReport.toKnownErr(e) - }) - } - - listActivities( - params?: ToolsOzoneReportListActivities.QueryParams, - opts?: ToolsOzoneReportListActivities.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.report.listActivities', - params, - undefined, - opts, - ) - } - - queryReports( - params?: ToolsOzoneReportQueryReports.QueryParams, - opts?: ToolsOzoneReportQueryReports.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.report.queryReports', - params, - undefined, - opts, - ) - } - - reassignQueue( - data?: ToolsOzoneReportReassignQueue.InputSchema, - opts?: ToolsOzoneReportReassignQueue.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.report.reassignQueue', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneReportReassignQueue.toKnownErr(e) - }) - } - - refreshStats( - data?: ToolsOzoneReportRefreshStats.InputSchema, - opts?: ToolsOzoneReportRefreshStats.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.report.refreshStats', - opts?.qp, - data, - opts, - ) - } - - unassignModerator( - data?: ToolsOzoneReportUnassignModerator.InputSchema, - opts?: ToolsOzoneReportUnassignModerator.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.report.unassignModerator', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneReportUnassignModerator.toKnownErr(e) - }) - } -} - -export class ToolsOzoneSafelinkNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - addRule( - data?: ToolsOzoneSafelinkAddRule.InputSchema, - opts?: ToolsOzoneSafelinkAddRule.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.safelink.addRule', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneSafelinkAddRule.toKnownErr(e) - }) - } - - queryEvents( - data?: ToolsOzoneSafelinkQueryEvents.InputSchema, - opts?: ToolsOzoneSafelinkQueryEvents.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.safelink.queryEvents', - opts?.qp, - data, - opts, - ) - } - - queryRules( - data?: ToolsOzoneSafelinkQueryRules.InputSchema, - opts?: ToolsOzoneSafelinkQueryRules.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.safelink.queryRules', - opts?.qp, - data, - opts, - ) - } - - removeRule( - data?: ToolsOzoneSafelinkRemoveRule.InputSchema, - opts?: ToolsOzoneSafelinkRemoveRule.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.safelink.removeRule', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneSafelinkRemoveRule.toKnownErr(e) - }) - } - - updateRule( - data?: ToolsOzoneSafelinkUpdateRule.InputSchema, - opts?: ToolsOzoneSafelinkUpdateRule.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.safelink.updateRule', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneSafelinkUpdateRule.toKnownErr(e) - }) - } -} - -export class ToolsOzoneServerNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - getConfig( - params?: ToolsOzoneServerGetConfig.QueryParams, - opts?: ToolsOzoneServerGetConfig.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.server.getConfig', - params, - undefined, - opts, - ) - } -} - -export class ToolsOzoneSetNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - addValues( - data?: ToolsOzoneSetAddValues.InputSchema, - opts?: ToolsOzoneSetAddValues.CallOptions, - ): Promise { - return this._client.call('tools.ozone.set.addValues', opts?.qp, data, opts) - } - - deleteSet( - data?: ToolsOzoneSetDeleteSet.InputSchema, - opts?: ToolsOzoneSetDeleteSet.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.set.deleteSet', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneSetDeleteSet.toKnownErr(e) - }) - } - - deleteValues( - data?: ToolsOzoneSetDeleteValues.InputSchema, - opts?: ToolsOzoneSetDeleteValues.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.set.deleteValues', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneSetDeleteValues.toKnownErr(e) - }) - } - - getValues( - params?: ToolsOzoneSetGetValues.QueryParams, - opts?: ToolsOzoneSetGetValues.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.set.getValues', params, undefined, opts) - .catch((e) => { - throw ToolsOzoneSetGetValues.toKnownErr(e) - }) - } - - querySets( - params?: ToolsOzoneSetQuerySets.QueryParams, - opts?: ToolsOzoneSetQuerySets.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.set.querySets', - params, - undefined, - opts, - ) - } - - upsertSet( - data?: ToolsOzoneSetUpsertSet.InputSchema, - opts?: ToolsOzoneSetUpsertSet.CallOptions, - ): Promise { - return this._client.call('tools.ozone.set.upsertSet', opts?.qp, data, opts) - } -} - -export class ToolsOzoneSettingNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - listOptions( - params?: ToolsOzoneSettingListOptions.QueryParams, - opts?: ToolsOzoneSettingListOptions.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.setting.listOptions', - params, - undefined, - opts, - ) - } - - removeOptions( - data?: ToolsOzoneSettingRemoveOptions.InputSchema, - opts?: ToolsOzoneSettingRemoveOptions.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.setting.removeOptions', - opts?.qp, - data, - opts, - ) - } - - upsertOption( - data?: ToolsOzoneSettingUpsertOption.InputSchema, - opts?: ToolsOzoneSettingUpsertOption.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.setting.upsertOption', - opts?.qp, - data, - opts, - ) - } -} - -export class ToolsOzoneSignatureNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - findCorrelation( - params?: ToolsOzoneSignatureFindCorrelation.QueryParams, - opts?: ToolsOzoneSignatureFindCorrelation.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.signature.findCorrelation', - params, - undefined, - opts, - ) - } - - findRelatedAccounts( - params?: ToolsOzoneSignatureFindRelatedAccounts.QueryParams, - opts?: ToolsOzoneSignatureFindRelatedAccounts.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.signature.findRelatedAccounts', - params, - undefined, - opts, - ) - } - - searchAccounts( - params?: ToolsOzoneSignatureSearchAccounts.QueryParams, - opts?: ToolsOzoneSignatureSearchAccounts.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.signature.searchAccounts', - params, - undefined, - opts, - ) - } -} - -export class ToolsOzoneTeamNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - addMember( - data?: ToolsOzoneTeamAddMember.InputSchema, - opts?: ToolsOzoneTeamAddMember.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.team.addMember', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneTeamAddMember.toKnownErr(e) - }) - } - - deleteMember( - data?: ToolsOzoneTeamDeleteMember.InputSchema, - opts?: ToolsOzoneTeamDeleteMember.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.team.deleteMember', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneTeamDeleteMember.toKnownErr(e) - }) - } - - listMembers( - params?: ToolsOzoneTeamListMembers.QueryParams, - opts?: ToolsOzoneTeamListMembers.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.team.listMembers', - params, - undefined, - opts, - ) - } - - updateMember( - data?: ToolsOzoneTeamUpdateMember.InputSchema, - opts?: ToolsOzoneTeamUpdateMember.CallOptions, - ): Promise { - return this._client - .call('tools.ozone.team.updateMember', opts?.qp, data, opts) - .catch((e) => { - throw ToolsOzoneTeamUpdateMember.toKnownErr(e) - }) - } -} - -export class ToolsOzoneVerificationNS { - _client: XrpcClient - - constructor(client: XrpcClient) { - this._client = client - } - - grantVerifications( - data?: ToolsOzoneVerificationGrantVerifications.InputSchema, - opts?: ToolsOzoneVerificationGrantVerifications.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.verification.grantVerifications', - opts?.qp, - data, - opts, - ) - } - - listVerifications( - params?: ToolsOzoneVerificationListVerifications.QueryParams, - opts?: ToolsOzoneVerificationListVerifications.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.verification.listVerifications', - params, - undefined, - opts, - ) - } - - revokeVerifications( - data?: ToolsOzoneVerificationRevokeVerifications.InputSchema, - opts?: ToolsOzoneVerificationRevokeVerifications.CallOptions, - ): Promise { - return this._client.call( - 'tools.ozone.verification.revokeVerifications', - opts?.qp, - data, - opts, - ) - } -} diff --git a/packages/api/src/client/lexicons.ts b/packages/api/src/client/lexicons.ts deleted file mode 100644 index d5740feeadd..00000000000 --- a/packages/api/src/client/lexicons.ts +++ /dev/null @@ -1,25832 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { - type LexiconDoc, - Lexicons, - ValidationError, - type ValidationResult, -} from '@atproto/lexicon' -import { type $Typed, is$typed, maybe$typed } from './util.js' - -export const schemaDict = { - AppBskyActorDefs: { - lexicon: 1, - id: 'app.bsky.actor.defs', - defs: { - profileViewBasic: { - type: 'object', - required: ['did', 'handle'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - displayName: { - type: 'string', - maxGraphemes: 64, - maxLength: 640, - }, - pronouns: { - type: 'string', - }, - avatar: { - type: 'string', - format: 'uri', - }, - associated: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociated', - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#viewerState', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - verification: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#verificationState', - }, - status: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#statusView', - }, - debug: { - type: 'unknown', - description: 'Debug information for internal development', - }, - }, - }, - profileView: { - type: 'object', - required: ['did', 'handle'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - displayName: { - type: 'string', - maxGraphemes: 64, - maxLength: 640, - }, - pronouns: { - type: 'string', - }, - description: { - type: 'string', - maxGraphemes: 256, - maxLength: 2560, - }, - avatar: { - type: 'string', - format: 'uri', - }, - associated: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociated', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#viewerState', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - verification: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#verificationState', - }, - status: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#statusView', - }, - debug: { - type: 'unknown', - description: 'Debug information for internal development', - }, - }, - }, - profileViewDetailed: { - type: 'object', - required: ['did', 'handle'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - displayName: { - type: 'string', - maxGraphemes: 64, - maxLength: 640, - }, - description: { - type: 'string', - maxGraphemes: 256, - maxLength: 2560, - }, - pronouns: { - type: 'string', - }, - website: { - type: 'string', - format: 'uri', - }, - avatar: { - type: 'string', - format: 'uri', - }, - banner: { - type: 'string', - format: 'uri', - }, - followersCount: { - type: 'integer', - }, - followsCount: { - type: 'integer', - }, - postsCount: { - type: 'integer', - }, - associated: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociated', - }, - joinedViaStarterPack: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackViewBasic', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#viewerState', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - pinnedPost: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - verification: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#verificationState', - }, - status: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#statusView', - }, - debug: { - type: 'unknown', - description: 'Debug information for internal development', - }, - }, - }, - profileAssociated: { - type: 'object', - properties: { - lists: { - type: 'integer', - }, - feedgens: { - type: 'integer', - }, - starterPacks: { - type: 'integer', - }, - labeler: { - type: 'boolean', - }, - chat: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociatedChat', - }, - activitySubscription: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociatedActivitySubscription', - }, - germ: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociatedGerm', - }, - }, - }, - profileAssociatedChat: { - type: 'object', - required: ['allowIncoming'], - properties: { - allowIncoming: { - type: 'string', - knownValues: ['all', 'none', 'following'], - }, - allowGroupInvites: { - type: 'string', - knownValues: ['all', 'none', 'following'], - }, - }, - }, - profileAssociatedGerm: { - type: 'object', - required: ['showButtonTo', 'messageMeUrl'], - properties: { - messageMeUrl: { - type: 'string', - format: 'uri', - }, - showButtonTo: { - type: 'string', - knownValues: ['usersIFollow', 'everyone'], - }, - }, - }, - profileAssociatedActivitySubscription: { - type: 'object', - required: ['allowSubscriptions'], - properties: { - allowSubscriptions: { - type: 'string', - knownValues: ['followers', 'mutuals', 'none'], - }, - }, - }, - viewerState: { - type: 'object', - description: - "Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests.", - properties: { - muted: { - type: 'boolean', - }, - mutedByList: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listViewBasic', - }, - blockedBy: { - type: 'boolean', - }, - blocking: { - type: 'string', - format: 'at-uri', - }, - blockingByList: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listViewBasic', - }, - following: { - type: 'string', - format: 'at-uri', - }, - followedBy: { - type: 'string', - format: 'at-uri', - }, - knownFollowers: { - description: - 'This property is present only in selected cases, as an optimization.', - type: 'ref', - ref: 'lex:app.bsky.actor.defs#knownFollowers', - }, - activitySubscription: { - description: - 'This property is present only in selected cases, as an optimization.', - type: 'ref', - ref: 'lex:app.bsky.notification.defs#activitySubscription', - }, - }, - }, - knownFollowers: { - type: 'object', - description: "The subject's followers whom you also follow", - required: ['count', 'followers'], - properties: { - count: { - type: 'integer', - }, - followers: { - type: 'array', - minLength: 0, - maxLength: 5, - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - verificationState: { - type: 'object', - description: - 'Represents the verification information about the user this object is attached to.', - required: ['verifications', 'verifiedStatus', 'trustedVerifierStatus'], - properties: { - verifications: { - type: 'array', - description: - 'All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included.', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#verificationView', - }, - }, - verifiedStatus: { - type: 'string', - description: "The user's status as a verified account.", - knownValues: ['valid', 'invalid', 'none'], - }, - trustedVerifierStatus: { - type: 'string', - description: "The user's status as a trusted verifier.", - knownValues: ['valid', 'invalid', 'none'], - }, - }, - }, - verificationView: { - type: 'object', - description: 'An individual verification for an associated subject.', - required: ['issuer', 'uri', 'isValid', 'createdAt'], - properties: { - issuer: { - type: 'string', - description: 'The user who issued this verification.', - format: 'did', - }, - uri: { - type: 'string', - description: 'The AT-URI of the verification record.', - format: 'at-uri', - }, - isValid: { - type: 'boolean', - description: - 'True if the verification passes validation, otherwise false.', - }, - createdAt: { - type: 'string', - description: 'Timestamp when the verification was created.', - format: 'datetime', - }, - }, - }, - preferences: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.actor.defs#adultContentPref', - 'lex:app.bsky.actor.defs#contentLabelPref', - 'lex:app.bsky.actor.defs#savedFeedsPref', - 'lex:app.bsky.actor.defs#savedFeedsPrefV2', - 'lex:app.bsky.actor.defs#personalDetailsPref', - 'lex:app.bsky.actor.defs#declaredAgePref', - 'lex:app.bsky.actor.defs#feedViewPref', - 'lex:app.bsky.actor.defs#threadViewPref', - 'lex:app.bsky.actor.defs#interestsPref', - 'lex:app.bsky.actor.defs#mutedWordsPref', - 'lex:app.bsky.actor.defs#hiddenPostsPref', - 'lex:app.bsky.actor.defs#bskyAppStatePref', - 'lex:app.bsky.actor.defs#labelersPref', - 'lex:app.bsky.actor.defs#postInteractionSettingsPref', - 'lex:app.bsky.actor.defs#verificationPrefs', - 'lex:app.bsky.actor.defs#liveEventPreferences', - ], - }, - }, - adultContentPref: { - type: 'object', - required: ['enabled'], - properties: { - enabled: { - type: 'boolean', - default: false, - }, - }, - }, - contentLabelPref: { - type: 'object', - required: ['label', 'visibility'], - properties: { - labelerDid: { - type: 'string', - description: - 'Which labeler does this preference apply to? If undefined, applies globally.', - format: 'did', - }, - label: { - type: 'string', - }, - visibility: { - type: 'string', - knownValues: ['ignore', 'show', 'warn', 'hide'], - }, - }, - }, - savedFeed: { - type: 'object', - required: ['id', 'type', 'value', 'pinned'], - properties: { - id: { - type: 'string', - }, - type: { - type: 'string', - knownValues: ['feed', 'list', 'timeline'], - }, - value: { - type: 'string', - }, - pinned: { - type: 'boolean', - }, - }, - }, - savedFeedsPrefV2: { - type: 'object', - required: ['items'], - properties: { - items: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#savedFeed', - }, - }, - }, - }, - savedFeedsPref: { - type: 'object', - required: ['pinned', 'saved'], - properties: { - pinned: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - }, - saved: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - }, - timelineIndex: { - type: 'integer', - }, - }, - }, - personalDetailsPref: { - type: 'object', - properties: { - birthDate: { - type: 'string', - format: 'datetime', - description: 'The birth date of account owner.', - }, - }, - }, - declaredAgePref: { - type: 'object', - description: - "Read-only preference containing value(s) inferred from the user's declared birthdate. Absence of this preference object in the response indicates that the user has not made a declaration.", - properties: { - isOverAge13: { - type: 'boolean', - description: - 'Indicates if the user has declared that they are over 13 years of age.', - }, - isOverAge16: { - type: 'boolean', - description: - 'Indicates if the user has declared that they are over 16 years of age.', - }, - isOverAge18: { - type: 'boolean', - description: - 'Indicates if the user has declared that they are over 18 years of age.', - }, - }, - }, - feedViewPref: { - type: 'object', - required: ['feed'], - properties: { - feed: { - type: 'string', - description: - 'The URI of the feed, or an identifier which describes the feed.', - }, - hideReplies: { - type: 'boolean', - description: 'Hide replies in the feed.', - }, - hideRepliesByUnfollowed: { - type: 'boolean', - description: - 'Hide replies in the feed if they are not by followed users.', - default: true, - }, - hideRepliesByLikeCount: { - type: 'integer', - description: - 'Hide replies in the feed if they do not have this number of likes.', - }, - hideReposts: { - type: 'boolean', - description: 'Hide reposts in the feed.', - }, - hideQuotePosts: { - type: 'boolean', - description: 'Hide quote posts in the feed.', - }, - }, - }, - threadViewPref: { - type: 'object', - properties: { - sort: { - type: 'string', - description: 'Sorting mode for threads.', - knownValues: [ - 'oldest', - 'newest', - 'most-likes', - 'random', - 'hotness', - ], - }, - }, - }, - interestsPref: { - type: 'object', - required: ['tags'], - properties: { - tags: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - maxLength: 640, - maxGraphemes: 64, - }, - description: - "A list of tags which describe the account owner's interests gathered during onboarding.", - }, - }, - }, - mutedWordTarget: { - type: 'string', - knownValues: ['content', 'tag'], - maxLength: 640, - maxGraphemes: 64, - }, - mutedWord: { - type: 'object', - description: 'A word that the account owner has muted.', - required: ['value', 'targets'], - properties: { - id: { - type: 'string', - }, - value: { - type: 'string', - description: 'The muted word itself.', - maxLength: 10000, - maxGraphemes: 1000, - }, - targets: { - type: 'array', - description: 'The intended targets of the muted word.', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#mutedWordTarget', - }, - }, - actorTarget: { - type: 'string', - description: - 'Groups of users to apply the muted word to. If undefined, applies to all users.', - knownValues: ['all', 'exclude-following'], - default: 'all', - }, - expiresAt: { - type: 'string', - format: 'datetime', - description: - 'The date and time at which the muted word will expire and no longer be applied.', - }, - }, - }, - mutedWordsPref: { - type: 'object', - required: ['items'], - properties: { - items: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#mutedWord', - }, - description: 'A list of words the account owner has muted.', - }, - }, - }, - hiddenPostsPref: { - type: 'object', - required: ['items'], - properties: { - items: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - description: - 'A list of URIs of posts the account owner has hidden.', - }, - }, - }, - labelersPref: { - type: 'object', - required: ['labelers'], - properties: { - labelers: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#labelerPrefItem', - }, - }, - }, - }, - labelerPrefItem: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - bskyAppStatePref: { - description: - "A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this.", - type: 'object', - properties: { - activeProgressGuide: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#bskyAppProgressGuide', - }, - queuedNudges: { - description: - 'An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user.', - type: 'array', - maxLength: 1000, - items: { - type: 'string', - maxLength: 100, - }, - }, - nuxs: { - description: 'Storage for NUXs the user has encountered.', - type: 'array', - maxLength: 100, - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#nux', - }, - }, - }, - }, - bskyAppProgressGuide: { - description: - 'If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress.', - type: 'object', - required: ['guide'], - properties: { - guide: { - type: 'string', - maxLength: 100, - }, - }, - }, - nux: { - type: 'object', - description: 'A new user experiences (NUX) storage object', - required: ['id', 'completed'], - properties: { - id: { - type: 'string', - maxLength: 100, - }, - completed: { - type: 'boolean', - default: false, - }, - data: { - description: - 'Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters.', - type: 'string', - maxLength: 3000, - maxGraphemes: 300, - }, - expiresAt: { - type: 'string', - format: 'datetime', - description: - 'The date and time at which the NUX will expire and should be considered completed.', - }, - }, - }, - verificationPrefs: { - type: 'object', - description: 'Preferences for how verified accounts appear in the app.', - required: [], - properties: { - hideBadges: { - description: - 'Hide the blue check badges for verified accounts and trusted verifiers.', - type: 'boolean', - default: false, - }, - }, - }, - liveEventPreferences: { - type: 'object', - description: 'Preferences for live events.', - properties: { - hiddenFeedIds: { - description: - 'A list of feed IDs that the user has hidden from live events.', - type: 'array', - items: { - type: 'string', - }, - }, - hideAllFeeds: { - description: 'Whether to hide all feeds from live events.', - type: 'boolean', - default: false, - }, - }, - }, - postInteractionSettingsPref: { - type: 'object', - description: - 'Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly.', - required: [], - properties: { - threadgateAllowRules: { - description: - 'Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply.', - type: 'array', - maxLength: 5, - items: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.threadgate#mentionRule', - 'lex:app.bsky.feed.threadgate#followerRule', - 'lex:app.bsky.feed.threadgate#followingRule', - 'lex:app.bsky.feed.threadgate#listRule', - ], - }, - }, - postgateEmbeddingRules: { - description: - 'Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed.', - type: 'array', - maxLength: 5, - items: { - type: 'union', - refs: ['lex:app.bsky.feed.postgate#disableRule'], - }, - }, - }, - }, - statusView: { - type: 'object', - required: ['status', 'record'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - status: { - type: 'string', - description: 'The status for the account.', - knownValues: ['app.bsky.actor.status#live'], - }, - record: { - type: 'unknown', - }, - embed: { - type: 'union', - description: 'An optional embed associated with the status.', - refs: ['lex:app.bsky.embed.external#view'], - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - expiresAt: { - type: 'string', - description: - 'The date when this status will expire. The application might choose to no longer return the status after expiration.', - format: 'datetime', - }, - isActive: { - type: 'boolean', - description: - 'True if the status is not expired, false if it is expired. Only present if expiration was set.', - }, - isDisabled: { - type: 'boolean', - description: - "True if the user's go-live access has been disabled by a moderator, false otherwise.", - }, - }, - }, - }, - }, - AppBskyActorGetPreferences: { - lexicon: 1, - id: 'app.bsky.actor.getPreferences', - defs: { - main: { - type: 'query', - description: - 'Get private preferences attached to the current account. Expected use is synchronization between multiple devices, and import/export during account migration. Requires auth.', - parameters: { - type: 'params', - properties: {}, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['preferences'], - properties: { - preferences: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#preferences', - }, - }, - }, - }, - }, - }, - }, - AppBskyActorGetProfile: { - lexicon: 1, - id: 'app.bsky.actor.getProfile', - defs: { - main: { - type: 'query', - description: - 'Get detailed profile view of an actor. Does not require auth, but contains relevant metadata with auth.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - description: 'Handle or DID of account to fetch profile of.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewDetailed', - }, - }, - }, - }, - }, - AppBskyActorGetProfiles: { - lexicon: 1, - id: 'app.bsky.actor.getProfiles', - defs: { - main: { - type: 'query', - description: 'Get detailed profile views of multiple actors.', - parameters: { - type: 'params', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'string', - format: 'at-identifier', - }, - maxLength: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['profiles'], - properties: { - profiles: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewDetailed', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyActorGetSuggestions: { - lexicon: 1, - id: 'app.bsky.actor.getSuggestions', - defs: { - main: { - type: 'query', - description: - 'Get a list of suggested actors. Expected use is discovery of accounts to follow during new account onboarding.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - cursor: { - type: 'string', - }, - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recId: { - type: 'integer', - description: 'DEPRECATED: use recIdStr instead.', - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyActorProfile: { - lexicon: 1, - id: 'app.bsky.actor.profile', - defs: { - main: { - type: 'record', - description: 'A declaration of a Bluesky account profile.', - key: 'literal:self', - record: { - type: 'object', - properties: { - displayName: { - type: 'string', - maxGraphemes: 64, - maxLength: 640, - }, - description: { - type: 'string', - description: 'Free-form profile description text.', - maxGraphemes: 256, - maxLength: 2560, - }, - pronouns: { - type: 'string', - description: 'Free-form pronouns text.', - maxGraphemes: 20, - maxLength: 200, - }, - website: { - type: 'string', - format: 'uri', - }, - avatar: { - type: 'blob', - description: - "Small image to be displayed next to posts from account. AKA, 'profile picture'", - accept: ['image/png', 'image/jpeg'], - maxSize: 1000000, - }, - banner: { - type: 'blob', - description: - 'Larger horizontal image to display behind profile view.', - accept: ['image/png', 'image/jpeg'], - maxSize: 1000000, - }, - labels: { - type: 'union', - description: - 'Self-label values, specific to the Bluesky application, on the overall account.', - refs: ['lex:com.atproto.label.defs#selfLabels'], - }, - joinedViaStarterPack: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - pinnedPost: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyActorPutPreferences: { - lexicon: 1, - id: 'app.bsky.actor.putPreferences', - defs: { - main: { - type: 'procedure', - description: 'Set the private preferences attached to the account.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['preferences'], - properties: { - preferences: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#preferences', - }, - }, - }, - }, - }, - }, - }, - AppBskyActorSearchActors: { - lexicon: 1, - id: 'app.bsky.actor.searchActors', - defs: { - main: { - type: 'query', - description: - 'Find actors (profiles) matching search criteria. Does not require auth.', - parameters: { - type: 'params', - properties: { - term: { - type: 'string', - description: "DEPRECATED: use 'q' instead.", - }, - q: { - type: 'string', - description: - 'Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 25, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - cursor: { - type: 'string', - }, - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyActorSearchActorsTypeahead: { - lexicon: 1, - id: 'app.bsky.actor.searchActorsTypeahead', - defs: { - main: { - type: 'query', - description: - 'Find actor suggestions for a prefix search term. Expected use is for auto-completion during text field entry. Does not require auth.', - parameters: { - type: 'params', - properties: { - term: { - type: 'string', - description: "DEPRECATED: use 'q' instead.", - }, - q: { - type: 'string', - description: 'Search query prefix; not a full query string.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyActorStatus: { - lexicon: 1, - id: 'app.bsky.actor.status', - defs: { - main: { - type: 'record', - description: 'A declaration of a Bluesky account status.', - key: 'literal:self', - record: { - type: 'object', - required: ['status', 'createdAt'], - properties: { - status: { - type: 'string', - description: 'The status for the account.', - knownValues: ['app.bsky.actor.status#live'], - }, - embed: { - type: 'union', - description: 'An optional embed associated with the status.', - refs: ['lex:app.bsky.embed.external'], - }, - durationMinutes: { - type: 'integer', - description: - 'The duration of the status in minutes. Applications can choose to impose minimum and maximum limits.', - minimum: 1, - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - live: { - type: 'token', - description: - 'Advertises an account as currently offering live content.', - }, - }, - }, - AppBskyAgeassuranceBegin: { - lexicon: 1, - id: 'app.bsky.ageassurance.begin', - defs: { - main: { - type: 'procedure', - description: 'Initiate Age Assurance for an account.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['email', 'language', 'countryCode'], - properties: { - email: { - type: 'string', - description: - "The user's email address to receive Age Assurance instructions.", - }, - language: { - type: 'string', - description: - "The user's preferred language for communication during the Age Assurance process.", - }, - countryCode: { - type: 'string', - description: - "An ISO 3166-1 alpha-2 code of the user's location.", - }, - regionCode: { - type: 'string', - description: - "An optional ISO 3166-2 code of the user's region or state within the country.", - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#state', - }, - }, - errors: [ - { - name: 'InvalidEmail', - }, - { - name: 'DidTooLong', - }, - { - name: 'InvalidInitiation', - }, - { - name: 'RegionNotSupported', - }, - ], - }, - }, - }, - AppBskyAgeassuranceDefs: { - lexicon: 1, - id: 'app.bsky.ageassurance.defs', - defs: { - access: { - description: - "The access level granted based on Age Assurance data we've processed.", - type: 'string', - knownValues: ['unknown', 'none', 'safe', 'full'], - }, - status: { - type: 'string', - description: 'The status of the Age Assurance process.', - knownValues: ['unknown', 'pending', 'assured', 'blocked'], - }, - state: { - type: 'object', - description: "The user's computed Age Assurance state.", - required: ['status', 'access'], - properties: { - lastInitiatedAt: { - type: 'string', - format: 'datetime', - description: 'The timestamp when this state was last updated.', - }, - status: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#status', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - stateMetadata: { - type: 'object', - description: - 'Additional metadata needed to compute Age Assurance state client-side.', - required: [], - properties: { - accountCreatedAt: { - type: 'string', - format: 'datetime', - description: 'The account creation timestamp.', - }, - }, - }, - config: { - type: 'object', - description: '', - required: ['regions'], - properties: { - regions: { - type: 'array', - description: 'The per-region Age Assurance configuration.', - items: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#configRegion', - }, - }, - }, - }, - configRegion: { - type: 'object', - description: 'The Age Assurance configuration for a specific region.', - required: ['countryCode', 'minAccessAge', 'rules'], - properties: { - countryCode: { - type: 'string', - description: - 'The ISO 3166-1 alpha-2 country code this configuration applies to.', - }, - regionCode: { - type: 'string', - description: - 'The ISO 3166-2 region code this configuration applies to. If omitted, the configuration applies to the entire country.', - }, - minAccessAge: { - type: 'integer', - description: - 'The minimum age (as a whole integer) required to use Bluesky in this region.', - }, - rules: { - type: 'array', - description: - 'The ordered list of Age Assurance rules that apply to this region. Rules should be applied in order, and the first matching rule determines the access level granted. The rules array should always include a default rule as the last item.', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.ageassurance.defs#configRegionRuleDefault', - 'lex:app.bsky.ageassurance.defs#configRegionRuleIfDeclaredOverAge', - 'lex:app.bsky.ageassurance.defs#configRegionRuleIfDeclaredUnderAge', - 'lex:app.bsky.ageassurance.defs#configRegionRuleIfAssuredOverAge', - 'lex:app.bsky.ageassurance.defs#configRegionRuleIfAssuredUnderAge', - 'lex:app.bsky.ageassurance.defs#configRegionRuleIfAccountNewerThan', - 'lex:app.bsky.ageassurance.defs#configRegionRuleIfAccountOlderThan', - ], - }, - }, - }, - }, - configRegionRuleDefault: { - type: 'object', - description: 'Age Assurance rule that applies by default.', - required: ['access'], - properties: { - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - configRegionRuleIfDeclaredOverAge: { - type: 'object', - description: - 'Age Assurance rule that applies if the user has declared themselves equal-to or over a certain age.', - required: ['age', 'access'], - properties: { - age: { - type: 'integer', - description: 'The age threshold as a whole integer.', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - configRegionRuleIfDeclaredUnderAge: { - type: 'object', - description: - 'Age Assurance rule that applies if the user has declared themselves under a certain age.', - required: ['age', 'access'], - properties: { - age: { - type: 'integer', - description: 'The age threshold as a whole integer.', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - configRegionRuleIfAssuredOverAge: { - type: 'object', - description: - 'Age Assurance rule that applies if the user has been assured to be equal-to or over a certain age.', - required: ['age', 'access'], - properties: { - age: { - type: 'integer', - description: 'The age threshold as a whole integer.', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - configRegionRuleIfAssuredUnderAge: { - type: 'object', - description: - 'Age Assurance rule that applies if the user has been assured to be under a certain age.', - required: ['age', 'access'], - properties: { - age: { - type: 'integer', - description: 'The age threshold as a whole integer.', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - configRegionRuleIfAccountNewerThan: { - type: 'object', - description: - 'Age Assurance rule that applies if the account is equal-to or newer than a certain date.', - required: ['date', 'access'], - properties: { - date: { - type: 'string', - format: 'datetime', - description: 'The date threshold as a datetime string.', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - configRegionRuleIfAccountOlderThan: { - type: 'object', - description: - 'Age Assurance rule that applies if the account is older than a certain date.', - required: ['date', 'access'], - properties: { - date: { - type: 'string', - format: 'datetime', - description: 'The date threshold as a datetime string.', - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - }, - }, - event: { - type: 'object', - description: 'Object used to store Age Assurance data in stash.', - required: ['createdAt', 'status', 'access', 'attemptId', 'countryCode'], - properties: { - createdAt: { - type: 'string', - format: 'datetime', - description: 'The date and time of this write operation.', - }, - attemptId: { - type: 'string', - description: - 'The unique identifier for this instance of the Age Assurance flow, in UUID format.', - }, - status: { - type: 'string', - description: 'The status of the Age Assurance process.', - knownValues: ['unknown', 'pending', 'assured', 'blocked'], - }, - access: { - description: - "The access level granted based on Age Assurance data we've processed.", - type: 'string', - knownValues: ['unknown', 'none', 'safe', 'full'], - }, - countryCode: { - type: 'string', - description: - 'The ISO 3166-1 alpha-2 country code provided when beginning the Age Assurance flow.', - }, - regionCode: { - type: 'string', - description: - 'The ISO 3166-2 region code provided when beginning the Age Assurance flow.', - }, - email: { - type: 'string', - description: 'The email used for Age Assurance.', - }, - initIp: { - type: 'string', - description: - 'The IP address used when initiating the Age Assurance flow.', - }, - initUa: { - type: 'string', - description: - 'The user agent used when initiating the Age Assurance flow.', - }, - completeIp: { - type: 'string', - description: - 'The IP address used when completing the Age Assurance flow.', - }, - completeUa: { - type: 'string', - description: - 'The user agent used when completing the Age Assurance flow.', - }, - }, - }, - }, - }, - AppBskyAgeassuranceGetConfig: { - lexicon: 1, - id: 'app.bsky.ageassurance.getConfig', - defs: { - main: { - type: 'query', - description: - 'Returns Age Assurance configuration for use on the client.', - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#config', - }, - }, - }, - }, - }, - AppBskyAgeassuranceGetState: { - lexicon: 1, - id: 'app.bsky.ageassurance.getState', - defs: { - main: { - type: 'query', - description: - 'Returns server-computed Age Assurance state, if available, and any additional metadata needed to compute Age Assurance state client-side.', - parameters: { - type: 'params', - required: ['countryCode'], - properties: { - countryCode: { - type: 'string', - }, - regionCode: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['state', 'metadata'], - properties: { - state: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#state', - }, - metadata: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#stateMetadata', - }, - }, - }, - }, - }, - }, - }, - AppBskyBookmarkCreateBookmark: { - lexicon: 1, - id: 'app.bsky.bookmark.createBookmark', - defs: { - main: { - type: 'procedure', - description: - 'Creates a private bookmark for the specified record. Currently, only `app.bsky.feed.post` records are supported. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'cid'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - }, - }, - }, - errors: [ - { - name: 'UnsupportedCollection', - description: - 'The URI to be bookmarked is for an unsupported collection.', - }, - ], - }, - }, - }, - AppBskyBookmarkDefs: { - lexicon: 1, - id: 'app.bsky.bookmark.defs', - defs: { - bookmark: { - description: 'Object used to store bookmark data in stash.', - type: 'object', - required: ['subject'], - properties: { - subject: { - description: - 'A strong ref to the record to be bookmarked. Currently, only `app.bsky.feed.post` records are supported.', - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - bookmarkView: { - type: 'object', - required: ['subject', 'item'], - properties: { - subject: { - description: 'A strong ref to the bookmarked record.', - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - item: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#blockedPost', - 'lex:app.bsky.feed.defs#notFoundPost', - 'lex:app.bsky.feed.defs#postView', - ], - }, - }, - }, - }, - }, - AppBskyBookmarkDeleteBookmark: { - lexicon: 1, - id: 'app.bsky.bookmark.deleteBookmark', - defs: { - main: { - type: 'procedure', - description: - 'Deletes a private bookmark for the specified record. Currently, only `app.bsky.feed.post` records are supported. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - errors: [ - { - name: 'UnsupportedCollection', - description: - 'The URI to be bookmarked is for an unsupported collection.', - }, - ], - }, - }, - }, - AppBskyBookmarkGetBookmarks: { - lexicon: 1, - id: 'app.bsky.bookmark.getBookmarks', - defs: { - main: { - type: 'query', - description: - 'Gets views of records bookmarked by the authenticated user. Requires authentication.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['bookmarks'], - properties: { - cursor: { - type: 'string', - }, - bookmarks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.bookmark.defs#bookmarkView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyContactDefs: { - lexicon: 1, - id: 'app.bsky.contact.defs', - defs: { - matchAndContactIndex: { - description: - 'Associates a profile with the positional index of the contact import input in the call to `app.bsky.contact.importContacts`, so clients can know which phone caused a particular match.', - type: 'object', - required: ['match', 'contactIndex'], - properties: { - match: { - description: 'Profile of the matched user.', - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - contactIndex: { - description: 'The index of this match in the import contact input.', - type: 'integer', - minimum: 0, - maximum: 999, - }, - }, - }, - syncStatus: { - type: 'object', - required: ['syncedAt', 'matchesCount'], - properties: { - syncedAt: { - description: 'Last date when contacts where imported.', - type: 'string', - format: 'datetime', - }, - matchesCount: { - description: - 'Number of existing contact matches resulting of the user imports and of their imported contacts having imported the user. Matches stop being counted when the user either follows the matched contact or dismisses the match.', - type: 'integer', - minimum: 0, - }, - }, - }, - notification: { - description: - 'A stash object to be sent via bsync representing a notification to be created.', - type: 'object', - required: ['from', 'to'], - properties: { - from: { - description: 'The DID of who this notification comes from.', - type: 'string', - format: 'did', - }, - to: { - description: 'The DID of who this notification should go to.', - type: 'string', - format: 'did', - }, - }, - }, - }, - }, - AppBskyContactDismissMatch: { - lexicon: 1, - id: 'app.bsky.contact.dismissMatch', - defs: { - main: { - type: 'procedure', - description: - "Removes a match that was found via contact import. It shouldn't appear again if the same contact is re-imported. Requires authentication.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject'], - properties: { - subject: { - description: "The subject's DID to dismiss the match with.", - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - errors: [ - { - name: 'InvalidDid', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyContactGetMatches: { - lexicon: 1, - id: 'app.bsky.contact.getMatches', - defs: { - main: { - type: 'query', - description: - 'Returns the matched contacts (contacts that were mutually imported). Excludes dismissed matches. Requires authentication.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['matches'], - properties: { - cursor: { - type: 'string', - }, - matches: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - errors: [ - { - name: 'InvalidDid', - }, - { - name: 'InvalidLimit', - }, - { - name: 'InvalidCursor', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyContactGetSyncStatus: { - lexicon: 1, - id: 'app.bsky.contact.getSyncStatus', - defs: { - main: { - type: 'query', - description: - "Gets the user's current contact import status. Requires authentication.", - parameters: { - type: 'params', - properties: {}, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - syncStatus: { - description: - "If present, indicates the user has imported their contacts. If not present, indicates the user never used the feature or called `app.bsky.contact.removeData` and didn't import again since.", - type: 'ref', - ref: 'lex:app.bsky.contact.defs#syncStatus', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidDid', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyContactImportContacts: { - lexicon: 1, - id: 'app.bsky.contact.importContacts', - defs: { - main: { - type: 'procedure', - description: - 'Import contacts for securely matching with other users. This follows the protocol explained in https://docs.bsky.app/blog/contact-import-rfc. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['token', 'contacts'], - properties: { - token: { - description: - 'JWT to authenticate the call. Use the JWT received as a response to the call to `app.bsky.contact.verifyPhone`.', - type: 'string', - }, - contacts: { - description: - "List of phone numbers in global E.164 format (e.g., '+12125550123'). Phone numbers that cannot be normalized into a valid phone number will be discarded. Should not repeat the 'phone' input used in `app.bsky.contact.verifyPhone`.", - type: 'array', - items: { - type: 'string', - }, - minLength: 1, - maxLength: 1000, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['matchesAndContactIndexes'], - properties: { - matchesAndContactIndexes: { - description: - 'The users that matched during import and their indexes on the input contacts, so the client can correlate with its local list.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.contact.defs#matchAndContactIndex', - }, - }, - }, - }, - }, - errors: [ - { - name: 'InvalidDid', - }, - { - name: 'InvalidContacts', - }, - { - name: 'TooManyContacts', - }, - { - name: 'InvalidToken', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyContactRemoveData: { - lexicon: 1, - id: 'app.bsky.contact.removeData', - defs: { - main: { - type: 'procedure', - description: - 'Removes all stored hashes used for contact matching, existing matches, and sync status. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - errors: [ - { - name: 'InvalidDid', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyContactSendNotification: { - lexicon: 1, - id: 'app.bsky.contact.sendNotification', - defs: { - main: { - type: 'procedure', - description: - 'System endpoint to send notifications related to contact imports. Requires role authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['from', 'to'], - properties: { - from: { - description: 'The DID of who this notification comes from.', - type: 'string', - format: 'did', - }, - to: { - description: 'The DID of who this notification should go to.', - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - }, - }, - }, - AppBskyContactStartPhoneVerification: { - lexicon: 1, - id: 'app.bsky.contact.startPhoneVerification', - defs: { - main: { - type: 'procedure', - description: - 'Starts a phone verification flow. The phone passed will receive a code via SMS that should be passed to `app.bsky.contact.verifyPhone`. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['phone'], - properties: { - phone: { - description: 'The phone number to receive the code via SMS.', - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - errors: [ - { - name: 'RateLimitExceeded', - }, - { - name: 'InvalidDid', - }, - { - name: 'InvalidPhone', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyContactVerifyPhone: { - lexicon: 1, - id: 'app.bsky.contact.verifyPhone', - defs: { - main: { - type: 'procedure', - description: - 'Verifies control over a phone number with a code received via SMS and starts a contact import session. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['phone', 'code'], - properties: { - phone: { - description: - 'The phone number to verify. Should be the same as the one passed to `app.bsky.contact.startPhoneVerification`.', - type: 'string', - }, - code: { - description: - 'The code received via SMS as a result of the call to `app.bsky.contact.startPhoneVerification`.', - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['token'], - properties: { - token: { - description: - 'JWT to be used in a call to `app.bsky.contact.importContacts`. It is only valid for a single call.', - type: 'string', - }, - }, - }, - }, - errors: [ - { - name: 'RateLimitExceeded', - }, - { - name: 'InvalidDid', - }, - { - name: 'InvalidPhone', - }, - { - name: 'InvalidCode', - }, - { - name: 'InternalError', - }, - ], - }, - }, - }, - AppBskyDraftCreateDraft: { - lexicon: 1, - id: 'app.bsky.draft.createDraft', - defs: { - main: { - type: 'procedure', - description: - 'Inserts a draft using private storage (stash). An upper limit of drafts might be enforced. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['draft'], - properties: { - draft: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draft', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['id'], - properties: { - id: { - type: 'string', - description: 'The ID of the created draft.', - }, - }, - }, - }, - errors: [ - { - name: 'DraftLimitReached', - description: - 'Trying to insert a new draft when the limit was already reached.', - }, - ], - }, - }, - }, - AppBskyDraftDefs: { - lexicon: 1, - id: 'app.bsky.draft.defs', - defs: { - draftWithId: { - description: - 'A draft with an identifier, used to store drafts in private storage (stash).', - type: 'object', - required: ['id', 'draft'], - properties: { - id: { - description: 'A TID to be used as a draft identifier.', - type: 'string', - format: 'tid', - }, - draft: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draft', - }, - }, - }, - draft: { - description: 'A draft containing an array of draft posts.', - type: 'object', - required: ['posts'], - properties: { - deviceId: { - type: 'string', - description: - 'UUIDv4 identifier of the device that created this draft.', - maxLength: 100, - }, - deviceName: { - type: 'string', - description: - 'The device and/or platform on which the draft was created.', - maxLength: 100, - }, - posts: { - description: 'Array of draft posts that compose this draft.', - type: 'array', - minLength: 1, - maxLength: 100, - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftPost', - }, - }, - langs: { - type: 'array', - description: - 'Indicates human language of posts primary text content.', - maxLength: 3, - items: { - type: 'string', - format: 'language', - }, - }, - postgateEmbeddingRules: { - description: - 'Embedding rules for the postgates to be created when this draft is published.', - type: 'array', - maxLength: 5, - items: { - type: 'union', - refs: ['lex:app.bsky.feed.postgate#disableRule'], - }, - }, - threadgateAllow: { - description: - 'Allow-rules for the threadgate to be created when this draft is published.', - type: 'array', - maxLength: 5, - items: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.threadgate#mentionRule', - 'lex:app.bsky.feed.threadgate#followerRule', - 'lex:app.bsky.feed.threadgate#followingRule', - 'lex:app.bsky.feed.threadgate#listRule', - ], - }, - }, - }, - }, - draftPost: { - description: 'One of the posts that compose a draft.', - type: 'object', - required: ['text'], - properties: { - text: { - type: 'string', - maxLength: 10000, - maxGraphemes: 1000, - description: - 'The primary post content. It has a higher limit than post contents to allow storing a larger text that can later be refined into smaller posts.', - }, - labels: { - type: 'union', - description: - 'Self-label values for this post. Effectively content warnings.', - refs: ['lex:com.atproto.label.defs#selfLabels'], - }, - embedImages: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedImage', - }, - maxLength: 4, - }, - embedVideos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedVideo', - }, - maxLength: 1, - }, - embedExternals: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedExternal', - }, - maxLength: 1, - }, - embedRecords: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedRecord', - }, - maxLength: 1, - }, - }, - }, - draftView: { - description: 'View to present drafts data to users.', - type: 'object', - required: ['id', 'draft', 'createdAt', 'updatedAt'], - properties: { - id: { - description: 'A TID to be used as a draft identifier.', - type: 'string', - format: 'tid', - }, - draft: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draft', - }, - createdAt: { - description: 'The time the draft was created.', - type: 'string', - format: 'datetime', - }, - updatedAt: { - description: 'The time the draft was last updated.', - type: 'string', - format: 'datetime', - }, - }, - }, - draftEmbedLocalRef: { - type: 'object', - required: ['path'], - properties: { - path: { - type: 'string', - description: - 'Local, on-device ref to file to be embedded. Embeds are currently device-bound for drafts.', - minLength: 1, - maxLength: 1024, - }, - }, - }, - draftEmbedCaption: { - type: 'object', - required: ['lang', 'content'], - properties: { - lang: { - type: 'string', - format: 'language', - }, - content: { - type: 'string', - maxLength: 10000, - }, - }, - }, - draftEmbedImage: { - type: 'object', - required: ['localRef'], - properties: { - localRef: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedLocalRef', - }, - alt: { - type: 'string', - maxGraphemes: 2000, - }, - }, - }, - draftEmbedVideo: { - type: 'object', - required: ['localRef'], - properties: { - localRef: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedLocalRef', - }, - alt: { - type: 'string', - maxGraphemes: 2000, - }, - captions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftEmbedCaption', - }, - maxLength: 20, - }, - }, - }, - draftEmbedExternal: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'uri', - }, - }, - }, - draftEmbedRecord: { - type: 'object', - required: ['record'], - properties: { - record: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - }, - }, - AppBskyDraftDeleteDraft: { - lexicon: 1, - id: 'app.bsky.draft.deleteDraft', - defs: { - main: { - type: 'procedure', - description: 'Deletes a draft by ID. Requires authentication.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['id'], - properties: { - id: { - type: 'string', - format: 'tid', - }, - }, - }, - }, - }, - }, - }, - AppBskyDraftGetDrafts: { - lexicon: 1, - id: 'app.bsky.draft.getDrafts', - defs: { - main: { - type: 'query', - description: 'Gets views of user drafts. Requires authentication.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['drafts'], - properties: { - cursor: { - type: 'string', - }, - drafts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyDraftUpdateDraft: { - lexicon: 1, - id: 'app.bsky.draft.updateDraft', - defs: { - main: { - type: 'procedure', - description: - "Updates a draft using private storage (stash). If the draft ID points to a non-existing ID, the update will be silently ignored. This is done because updates don't enforce draft limit, so it accepts all writes, but will ignore invalid ones. Requires authentication.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['draft'], - properties: { - draft: { - type: 'ref', - ref: 'lex:app.bsky.draft.defs#draftWithId', - }, - }, - }, - }, - }, - }, - }, - AppBskyEmbedDefs: { - lexicon: 1, - id: 'app.bsky.embed.defs', - defs: { - aspectRatio: { - type: 'object', - description: - 'width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit.', - required: ['width', 'height'], - properties: { - width: { - type: 'integer', - minimum: 1, - }, - height: { - type: 'integer', - minimum: 1, - }, - }, - }, - }, - }, - AppBskyEmbedExternal: { - lexicon: 1, - id: 'app.bsky.embed.external', - defs: { - main: { - type: 'object', - description: - "A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post).", - required: ['external'], - properties: { - external: { - type: 'ref', - ref: 'lex:app.bsky.embed.external#external', - }, - }, - }, - external: { - type: 'object', - required: ['uri', 'title', 'description'], - properties: { - uri: { - type: 'string', - format: 'uri', - }, - title: { - type: 'string', - }, - description: { - type: 'string', - }, - thumb: { - type: 'blob', - accept: ['image/*'], - maxSize: 1000000, - }, - associatedRecords: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - description: - 'The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record.', - }, - }, - }, - view: { - type: 'object', - required: ['external'], - properties: { - external: { - type: 'ref', - ref: 'lex:app.bsky.embed.external#viewExternal', - }, - }, - }, - viewExternal: { - type: 'object', - required: ['uri', 'title', 'description'], - properties: { - uri: { - type: 'string', - format: 'uri', - }, - title: { - type: 'string', - }, - description: { - type: 'string', - }, - thumb: { - type: 'string', - format: 'uri', - }, - }, - }, - }, - }, - AppBskyEmbedImages: { - lexicon: 1, - id: 'app.bsky.embed.images', - description: 'A set of images embedded in a Bluesky record (eg, a post).', - defs: { - main: { - type: 'object', - required: ['images'], - properties: { - images: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.embed.images#image', - }, - maxLength: 4, - }, - }, - }, - image: { - type: 'object', - required: ['image', 'alt'], - properties: { - image: { - type: 'blob', - description: - 'The raw image file. May be up to 2 MB, formerly limited to 1 MB.', - accept: ['image/*'], - maxSize: 2000000, - }, - alt: { - type: 'string', - description: - 'Alt text description of the image, for accessibility.', - }, - aspectRatio: { - type: 'ref', - ref: 'lex:app.bsky.embed.defs#aspectRatio', - }, - }, - }, - view: { - type: 'object', - required: ['images'], - properties: { - images: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.embed.images#viewImage', - }, - maxLength: 4, - }, - }, - }, - viewImage: { - type: 'object', - required: ['thumb', 'fullsize', 'alt'], - properties: { - thumb: { - type: 'string', - format: 'uri', - description: - 'Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View.', - }, - fullsize: { - type: 'string', - format: 'uri', - description: - 'Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View.', - }, - alt: { - type: 'string', - description: - 'Alt text description of the image, for accessibility.', - }, - aspectRatio: { - type: 'ref', - ref: 'lex:app.bsky.embed.defs#aspectRatio', - }, - }, - }, - }, - }, - AppBskyEmbedRecord: { - lexicon: 1, - id: 'app.bsky.embed.record', - description: - 'A representation of a record embedded in a Bluesky record (eg, a post). For example, a quote-post, or sharing a feed generator record.', - defs: { - main: { - type: 'object', - required: ['record'], - properties: { - record: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - view: { - type: 'object', - required: ['record'], - properties: { - record: { - type: 'union', - refs: [ - 'lex:app.bsky.embed.record#viewRecord', - 'lex:app.bsky.embed.record#viewNotFound', - 'lex:app.bsky.embed.record#viewBlocked', - 'lex:app.bsky.embed.record#viewDetached', - 'lex:app.bsky.feed.defs#generatorView', - 'lex:app.bsky.graph.defs#listView', - 'lex:app.bsky.labeler.defs#labelerView', - 'lex:app.bsky.graph.defs#starterPackViewBasic', - ], - }, - }, - }, - viewRecord: { - type: 'object', - required: ['uri', 'cid', 'author', 'value', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - author: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - value: { - type: 'unknown', - description: 'The record data itself.', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - replyCount: { - type: 'integer', - }, - repostCount: { - type: 'integer', - }, - likeCount: { - type: 'integer', - }, - quoteCount: { - type: 'integer', - }, - embeds: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.embed.images#view', - 'lex:app.bsky.embed.video#view', - 'lex:app.bsky.embed.external#view', - 'lex:app.bsky.embed.record#view', - 'lex:app.bsky.embed.recordWithMedia#view', - ], - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - viewNotFound: { - type: 'object', - required: ['uri', 'notFound'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - notFound: { - type: 'boolean', - const: true, - }, - }, - }, - viewBlocked: { - type: 'object', - required: ['uri', 'blocked', 'author'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - blocked: { - type: 'boolean', - const: true, - }, - author: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#blockedAuthor', - }, - }, - }, - viewDetached: { - type: 'object', - required: ['uri', 'detached'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - detached: { - type: 'boolean', - const: true, - }, - }, - }, - }, - }, - AppBskyEmbedRecordWithMedia: { - lexicon: 1, - id: 'app.bsky.embed.recordWithMedia', - description: - 'A representation of a record embedded in a Bluesky record (eg, a post), alongside other compatible embeds. For example, a quote post and image, or a quote post and external URL card.', - defs: { - main: { - type: 'object', - required: ['record', 'media'], - properties: { - record: { - type: 'ref', - ref: 'lex:app.bsky.embed.record', - }, - media: { - type: 'union', - refs: [ - 'lex:app.bsky.embed.images', - 'lex:app.bsky.embed.video', - 'lex:app.bsky.embed.external', - ], - }, - }, - }, - view: { - type: 'object', - required: ['record', 'media'], - properties: { - record: { - type: 'ref', - ref: 'lex:app.bsky.embed.record#view', - }, - media: { - type: 'union', - refs: [ - 'lex:app.bsky.embed.images#view', - 'lex:app.bsky.embed.video#view', - 'lex:app.bsky.embed.external#view', - ], - }, - }, - }, - }, - }, - AppBskyEmbedVideo: { - lexicon: 1, - id: 'app.bsky.embed.video', - description: 'A video embedded in a Bluesky record (eg, a post).', - defs: { - main: { - type: 'object', - required: ['video'], - properties: { - video: { - type: 'blob', - description: - 'The mp4 video file. May be up to 100mb, formerly limited to 50mb.', - accept: ['video/mp4'], - maxSize: 100000000, - }, - captions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.embed.video#caption', - }, - maxLength: 20, - }, - alt: { - type: 'string', - description: - 'Alt text description of the video, for accessibility.', - maxGraphemes: 1000, - maxLength: 10000, - }, - aspectRatio: { - type: 'ref', - ref: 'lex:app.bsky.embed.defs#aspectRatio', - }, - presentation: { - type: 'string', - description: 'A hint to the client about how to present the video.', - knownValues: ['default', 'gif'], - }, - }, - }, - caption: { - type: 'object', - required: ['lang', 'file'], - properties: { - lang: { - type: 'string', - format: 'language', - }, - file: { - type: 'blob', - accept: ['text/vtt'], - maxSize: 20000, - }, - }, - }, - view: { - type: 'object', - required: ['cid', 'playlist'], - properties: { - cid: { - type: 'string', - format: 'cid', - }, - playlist: { - type: 'string', - format: 'uri', - }, - thumbnail: { - type: 'string', - format: 'uri', - }, - alt: { - type: 'string', - maxGraphemes: 1000, - maxLength: 10000, - }, - aspectRatio: { - type: 'ref', - ref: 'lex:app.bsky.embed.defs#aspectRatio', - }, - presentation: { - type: 'string', - description: 'A hint to the client about how to present the video.', - knownValues: ['default', 'gif'], - }, - }, - }, - }, - }, - AppBskyFeedDefs: { - lexicon: 1, - id: 'app.bsky.feed.defs', - defs: { - postView: { - type: 'object', - required: ['uri', 'cid', 'author', 'record', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - author: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - record: { - type: 'unknown', - }, - embed: { - type: 'union', - refs: [ - 'lex:app.bsky.embed.images#view', - 'lex:app.bsky.embed.video#view', - 'lex:app.bsky.embed.external#view', - 'lex:app.bsky.embed.record#view', - 'lex:app.bsky.embed.recordWithMedia#view', - ], - }, - bookmarkCount: { - type: 'integer', - }, - replyCount: { - type: 'integer', - }, - repostCount: { - type: 'integer', - }, - likeCount: { - type: 'integer', - }, - quoteCount: { - type: 'integer', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#viewerState', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - threadgate: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#threadgateView', - }, - debug: { - type: 'unknown', - description: 'Debug information for internal development', - }, - }, - }, - viewerState: { - type: 'object', - description: - "Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests.", - properties: { - repost: { - type: 'string', - format: 'at-uri', - }, - like: { - type: 'string', - format: 'at-uri', - }, - bookmarked: { - type: 'boolean', - }, - threadMuted: { - type: 'boolean', - }, - replyDisabled: { - type: 'boolean', - }, - embeddingDisabled: { - type: 'boolean', - }, - pinned: { - type: 'boolean', - }, - }, - }, - threadContext: { - type: 'object', - description: - 'Metadata about this post within the context of the thread it is in.', - properties: { - rootAuthorLike: { - type: 'string', - format: 'at-uri', - }, - }, - }, - feedViewPost: { - type: 'object', - required: ['post'], - properties: { - post: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#postView', - }, - reply: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#replyRef', - }, - reason: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#reasonRepost', - 'lex:app.bsky.feed.defs#reasonPin', - ], - }, - feedContext: { - type: 'string', - description: - 'Context provided by feed generator that may be passed back alongside interactions.', - maxLength: 2000, - }, - reqId: { - type: 'string', - description: - 'Unique identifier per request that may be passed back alongside interactions.', - maxLength: 100, - }, - }, - }, - replyRef: { - type: 'object', - required: ['root', 'parent'], - properties: { - root: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#postView', - 'lex:app.bsky.feed.defs#notFoundPost', - 'lex:app.bsky.feed.defs#blockedPost', - ], - }, - parent: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#postView', - 'lex:app.bsky.feed.defs#notFoundPost', - 'lex:app.bsky.feed.defs#blockedPost', - ], - }, - grandparentAuthor: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - description: - 'When parent is a reply to another post, this is the author of that post.', - }, - }, - }, - reasonRepost: { - type: 'object', - required: ['by', 'indexedAt'], - properties: { - by: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - reasonPin: { - type: 'object', - properties: {}, - }, - threadViewPost: { - type: 'object', - required: ['post'], - properties: { - post: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#postView', - }, - parent: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#threadViewPost', - 'lex:app.bsky.feed.defs#notFoundPost', - 'lex:app.bsky.feed.defs#blockedPost', - ], - }, - replies: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#threadViewPost', - 'lex:app.bsky.feed.defs#notFoundPost', - 'lex:app.bsky.feed.defs#blockedPost', - ], - }, - }, - threadContext: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#threadContext', - }, - }, - }, - notFoundPost: { - type: 'object', - required: ['uri', 'notFound'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - notFound: { - type: 'boolean', - const: true, - }, - }, - }, - blockedPost: { - type: 'object', - required: ['uri', 'blocked', 'author'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - blocked: { - type: 'boolean', - const: true, - }, - author: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#blockedAuthor', - }, - }, - }, - blockedAuthor: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#viewerState', - }, - }, - }, - generatorView: { - type: 'object', - required: ['uri', 'cid', 'did', 'creator', 'displayName', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - did: { - type: 'string', - format: 'did', - }, - creator: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - displayName: { - type: 'string', - }, - description: { - type: 'string', - maxGraphemes: 300, - maxLength: 3000, - }, - descriptionFacets: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - avatar: { - type: 'string', - format: 'uri', - }, - likeCount: { - type: 'integer', - minimum: 0, - }, - acceptsInteractions: { - type: 'boolean', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorViewerState', - }, - contentMode: { - type: 'string', - knownValues: [ - 'app.bsky.feed.defs#contentModeUnspecified', - 'app.bsky.feed.defs#contentModeVideo', - ], - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - generatorViewerState: { - type: 'object', - properties: { - like: { - type: 'string', - format: 'at-uri', - }, - }, - }, - skeletonFeedPost: { - type: 'object', - required: ['post'], - properties: { - post: { - type: 'string', - format: 'at-uri', - }, - reason: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#skeletonReasonRepost', - 'lex:app.bsky.feed.defs#skeletonReasonPin', - ], - }, - feedContext: { - type: 'string', - description: - 'Context that will be passed through to client and may be passed to feed generator back alongside interactions.', - maxLength: 2000, - }, - }, - }, - skeletonReasonRepost: { - type: 'object', - required: ['repost'], - properties: { - repost: { - type: 'string', - format: 'at-uri', - }, - }, - }, - skeletonReasonPin: { - type: 'object', - properties: {}, - }, - threadgateView: { - type: 'object', - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - record: { - type: 'unknown', - }, - lists: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listViewBasic', - }, - }, - }, - }, - interaction: { - type: 'object', - properties: { - item: { - type: 'string', - format: 'at-uri', - }, - event: { - type: 'string', - knownValues: [ - 'app.bsky.feed.defs#requestLess', - 'app.bsky.feed.defs#requestMore', - 'app.bsky.feed.defs#clickthroughItem', - 'app.bsky.feed.defs#clickthroughAuthor', - 'app.bsky.feed.defs#clickthroughReposter', - 'app.bsky.feed.defs#clickthroughEmbed', - 'app.bsky.feed.defs#interactionSeen', - 'app.bsky.feed.defs#interactionLike', - 'app.bsky.feed.defs#interactionRepost', - 'app.bsky.feed.defs#interactionReply', - 'app.bsky.feed.defs#interactionQuote', - 'app.bsky.feed.defs#interactionShare', - ], - }, - feedContext: { - type: 'string', - description: - 'Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton.', - maxLength: 2000, - }, - reqId: { - type: 'string', - description: - 'Unique identifier per request that may be passed back alongside interactions.', - maxLength: 100, - }, - }, - }, - requestLess: { - type: 'token', - description: - 'Request that less content like the given feed item be shown in the feed', - }, - requestMore: { - type: 'token', - description: - 'Request that more content like the given feed item be shown in the feed', - }, - clickthroughItem: { - type: 'token', - description: 'User clicked through to the feed item', - }, - clickthroughAuthor: { - type: 'token', - description: 'User clicked through to the author of the feed item', - }, - clickthroughReposter: { - type: 'token', - description: 'User clicked through to the reposter of the feed item', - }, - clickthroughEmbed: { - type: 'token', - description: - 'User clicked through to the embedded content of the feed item', - }, - contentModeUnspecified: { - type: 'token', - description: 'Declares the feed generator returns any types of posts.', - }, - contentModeVideo: { - type: 'token', - description: - 'Declares the feed generator returns posts containing app.bsky.embed.video embeds.', - }, - interactionSeen: { - type: 'token', - description: 'Feed item was seen by user', - }, - interactionLike: { - type: 'token', - description: 'User liked the feed item', - }, - interactionRepost: { - type: 'token', - description: 'User reposted the feed item', - }, - interactionReply: { - type: 'token', - description: 'User replied to the feed item', - }, - interactionQuote: { - type: 'token', - description: 'User quoted the feed item', - }, - interactionShare: { - type: 'token', - description: 'User shared the feed item', - }, - }, - }, - AppBskyFeedDescribeFeedGenerator: { - lexicon: 1, - id: 'app.bsky.feed.describeFeedGenerator', - defs: { - main: { - type: 'query', - description: - 'Get information about a feed generator, including policies and offered feed URIs. Does not require auth; implemented by Feed Generator services (not App View).', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'feeds'], - properties: { - did: { - type: 'string', - format: 'did', - }, - feeds: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.describeFeedGenerator#feed', - }, - }, - links: { - type: 'ref', - ref: 'lex:app.bsky.feed.describeFeedGenerator#links', - }, - }, - }, - }, - }, - feed: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - links: { - type: 'object', - properties: { - privacyPolicy: { - type: 'string', - }, - termsOfService: { - type: 'string', - }, - }, - }, - }, - }, - AppBskyFeedGenerator: { - lexicon: 1, - id: 'app.bsky.feed.generator', - defs: { - main: { - type: 'record', - description: - 'Record declaring of the existence of a feed generator, and containing metadata about it. The record can exist in any repository.', - key: 'any', - record: { - type: 'object', - required: ['did', 'displayName', 'createdAt'], - properties: { - did: { - type: 'string', - format: 'did', - }, - displayName: { - type: 'string', - maxGraphemes: 24, - maxLength: 240, - }, - description: { - type: 'string', - maxGraphemes: 300, - maxLength: 3000, - }, - descriptionFacets: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - avatar: { - type: 'blob', - accept: ['image/png', 'image/jpeg'], - maxSize: 1000000, - }, - acceptsInteractions: { - type: 'boolean', - description: - 'Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions', - }, - labels: { - type: 'union', - description: 'Self-label values', - refs: ['lex:com.atproto.label.defs#selfLabels'], - }, - contentMode: { - type: 'string', - knownValues: [ - 'app.bsky.feed.defs#contentModeUnspecified', - 'app.bsky.feed.defs#contentModeVideo', - ], - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyFeedGetActorFeeds: { - lexicon: 1, - id: 'app.bsky.feed.getActorFeeds', - defs: { - main: { - type: 'query', - description: - "Get a list of feeds (feed generator records) created by the actor (in the actor's repo).", - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feeds'], - properties: { - cursor: { - type: 'string', - }, - feeds: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetActorLikes: { - lexicon: 1, - id: 'app.bsky.feed.getActorLikes', - defs: { - main: { - type: 'query', - description: - 'Get a list of posts liked by an actor. Requires auth, actor must be the requesting account.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feed'], - properties: { - cursor: { - type: 'string', - }, - feed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#feedViewPost', - }, - }, - }, - }, - }, - errors: [ - { - name: 'BlockedActor', - }, - { - name: 'BlockedByActor', - }, - ], - }, - }, - }, - AppBskyFeedGetAuthorFeed: { - lexicon: 1, - id: 'app.bsky.feed.getAuthorFeed', - defs: { - main: { - type: 'query', - description: - "Get a view of an actor's 'author feed' (post and reposts by the author). Does not require auth.", - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - filter: { - type: 'string', - description: - 'Combinations of post/repost types to include in response.', - knownValues: [ - 'posts_with_replies', - 'posts_no_replies', - 'posts_with_media', - 'posts_and_author_threads', - 'posts_with_video', - ], - default: 'posts_with_replies', - }, - includePins: { - type: 'boolean', - default: false, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feed'], - properties: { - cursor: { - type: 'string', - }, - feed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#feedViewPost', - }, - }, - }, - }, - }, - errors: [ - { - name: 'BlockedActor', - }, - { - name: 'BlockedByActor', - }, - ], - }, - }, - }, - AppBskyFeedGetFeed: { - lexicon: 1, - id: 'app.bsky.feed.getFeed', - defs: { - main: { - type: 'query', - description: - "Get a hydrated feed from an actor's selected feed generator. Implemented by App View.", - parameters: { - type: 'params', - required: ['feed'], - properties: { - feed: { - type: 'string', - format: 'at-uri', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feed'], - properties: { - cursor: { - type: 'string', - }, - feed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#feedViewPost', - }, - }, - }, - }, - }, - errors: [ - { - name: 'UnknownFeed', - }, - ], - }, - }, - }, - AppBskyFeedGetFeedGenerator: { - lexicon: 1, - id: 'app.bsky.feed.getFeedGenerator', - defs: { - main: { - type: 'query', - description: - 'Get information about a feed generator. Implemented by AppView.', - parameters: { - type: 'params', - required: ['feed'], - properties: { - feed: { - type: 'string', - format: 'at-uri', - description: 'AT-URI of the feed generator record.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['view', 'isOnline', 'isValid'], - properties: { - view: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - isOnline: { - type: 'boolean', - description: - 'Indicates whether the feed generator service has been online recently, or else seems to be inactive.', - }, - isValid: { - type: 'boolean', - description: - 'Indicates whether the feed generator service is compatible with the record declaration.', - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetFeedGenerators: { - lexicon: 1, - id: 'app.bsky.feed.getFeedGenerators', - defs: { - main: { - type: 'query', - description: 'Get information about a list of feed generators.', - parameters: { - type: 'params', - required: ['feeds'], - properties: { - feeds: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feeds'], - properties: { - feeds: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetFeedSkeleton: { - lexicon: 1, - id: 'app.bsky.feed.getFeedSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of a feed provided by a feed generator. Auth is optional, depending on provider requirements, and provides the DID of the requester. Implemented by Feed Generator Service.', - parameters: { - type: 'params', - required: ['feed'], - properties: { - feed: { - type: 'string', - format: 'at-uri', - description: - 'Reference to feed generator record describing the specific feed being requested.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feed'], - properties: { - cursor: { - type: 'string', - }, - feed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#skeletonFeedPost', - }, - }, - reqId: { - type: 'string', - description: - 'Unique identifier per request that may be passed back alongside interactions.', - maxLength: 100, - }, - }, - }, - }, - errors: [ - { - name: 'UnknownFeed', - }, - ], - }, - }, - }, - AppBskyFeedGetLikes: { - lexicon: 1, - id: 'app.bsky.feed.getLikes', - defs: { - main: { - type: 'query', - description: - 'Get like records which reference a subject (by AT-URI and CID).', - parameters: { - type: 'params', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - description: 'AT-URI of the subject (eg, a post record).', - }, - cid: { - type: 'string', - format: 'cid', - description: - 'CID of the subject record (aka, specific version of record), to filter likes.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'likes'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - cursor: { - type: 'string', - }, - likes: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.getLikes#like', - }, - }, - }, - }, - }, - }, - like: { - type: 'object', - required: ['indexedAt', 'createdAt', 'actor'], - properties: { - indexedAt: { - type: 'string', - format: 'datetime', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - actor: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - AppBskyFeedGetListFeed: { - lexicon: 1, - id: 'app.bsky.feed.getListFeed', - defs: { - main: { - type: 'query', - description: - 'Get a feed of recent posts from a list (posts and reposts from any actors on the list). Does not require auth.', - parameters: { - type: 'params', - required: ['list'], - properties: { - list: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) to the list record.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feed'], - properties: { - cursor: { - type: 'string', - }, - feed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#feedViewPost', - }, - }, - }, - }, - }, - errors: [ - { - name: 'UnknownList', - }, - ], - }, - }, - }, - AppBskyFeedGetPostThread: { - lexicon: 1, - id: 'app.bsky.feed.getPostThread', - defs: { - main: { - type: 'query', - description: - 'Get posts in a thread. Does not require auth, but additional metadata and filtering will be applied for authed requests.', - parameters: { - type: 'params', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) to post record.', - }, - depth: { - type: 'integer', - description: - 'How many levels of reply depth should be included in response.', - default: 6, - minimum: 0, - maximum: 1000, - }, - parentHeight: { - type: 'integer', - description: - 'How many levels of parent (and grandparent, etc) post to include.', - default: 80, - minimum: 0, - maximum: 1000, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['thread'], - properties: { - thread: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.defs#threadViewPost', - 'lex:app.bsky.feed.defs#notFoundPost', - 'lex:app.bsky.feed.defs#blockedPost', - ], - }, - threadgate: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#threadgateView', - }, - }, - }, - }, - errors: [ - { - name: 'NotFound', - }, - ], - }, - }, - }, - AppBskyFeedGetPosts: { - lexicon: 1, - id: 'app.bsky.feed.getPosts', - defs: { - main: { - type: 'query', - description: - "Gets post views for a specified list of posts (by AT-URI). This is sometimes referred to as 'hydrating' a 'feed skeleton'.", - parameters: { - type: 'params', - required: ['uris'], - properties: { - uris: { - type: 'array', - description: 'List of post AT-URIs to return hydrated views for.', - items: { - type: 'string', - format: 'at-uri', - }, - maxLength: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['posts'], - properties: { - posts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#postView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetQuotes: { - lexicon: 1, - id: 'app.bsky.feed.getQuotes', - defs: { - main: { - type: 'query', - description: 'Get a list of quotes for a given post.', - parameters: { - type: 'params', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) of post record', - }, - cid: { - type: 'string', - format: 'cid', - description: - 'If supplied, filters to quotes of specific version (by CID) of the post record.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'posts'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - cursor: { - type: 'string', - }, - posts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#postView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetRepostedBy: { - lexicon: 1, - id: 'app.bsky.feed.getRepostedBy', - defs: { - main: { - type: 'query', - description: 'Get a list of reposts for a given post.', - parameters: { - type: 'params', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) of post record', - }, - cid: { - type: 'string', - format: 'cid', - description: - 'If supplied, filters to reposts of specific version (by CID) of the post record.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'repostedBy'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - cursor: { - type: 'string', - }, - repostedBy: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetSuggestedFeeds: { - lexicon: 1, - id: 'app.bsky.feed.getSuggestedFeeds', - defs: { - main: { - type: 'query', - description: - 'Get a list of suggested feeds (feed generators) for the requesting account.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feeds'], - properties: { - cursor: { - type: 'string', - }, - feeds: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedGetTimeline: { - lexicon: 1, - id: 'app.bsky.feed.getTimeline', - defs: { - main: { - type: 'query', - description: - "Get a view of the requesting account's home timeline. This is expected to be some form of reverse-chronological feed.", - parameters: { - type: 'params', - properties: { - algorithm: { - type: 'string', - description: - "Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism.", - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feed'], - properties: { - cursor: { - type: 'string', - }, - feed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#feedViewPost', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyFeedLike: { - lexicon: 1, - id: 'app.bsky.feed.like', - defs: { - main: { - type: 'record', - description: "Record declaring a 'like' of a piece of subject content.", - key: 'tid', - record: { - type: 'object', - required: ['subject', 'createdAt'], - properties: { - subject: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - via: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - }, - }, - }, - AppBskyFeedPost: { - lexicon: 1, - id: 'app.bsky.feed.post', - defs: { - main: { - type: 'record', - description: 'Record containing a Bluesky post.', - key: 'tid', - record: { - type: 'object', - required: ['text', 'createdAt'], - properties: { - text: { - type: 'string', - maxLength: 3000, - maxGraphemes: 300, - description: - 'The primary post content. May be an empty string, if there are embeds.', - }, - entities: { - type: 'array', - description: 'DEPRECATED: replaced by app.bsky.richtext.facet.', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.post#entity', - }, - }, - facets: { - type: 'array', - description: - 'Annotations of text (mentions, URLs, hashtags, etc)', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - reply: { - type: 'ref', - ref: 'lex:app.bsky.feed.post#replyRef', - }, - embed: { - type: 'union', - refs: [ - 'lex:app.bsky.embed.images', - 'lex:app.bsky.embed.video', - 'lex:app.bsky.embed.external', - 'lex:app.bsky.embed.record', - 'lex:app.bsky.embed.recordWithMedia', - ], - }, - langs: { - type: 'array', - description: - 'Indicates human language of post primary text content.', - maxLength: 3, - items: { - type: 'string', - format: 'language', - }, - }, - labels: { - type: 'union', - description: - 'Self-label values for this post. Effectively content warnings.', - refs: ['lex:com.atproto.label.defs#selfLabels'], - }, - tags: { - type: 'array', - description: - 'Additional hashtags, in addition to any included in post text and facets.', - maxLength: 8, - items: { - type: 'string', - maxLength: 640, - maxGraphemes: 64, - }, - }, - createdAt: { - type: 'string', - format: 'datetime', - description: - 'Client-declared timestamp when this post was originally created.', - }, - }, - }, - }, - replyRef: { - type: 'object', - required: ['root', 'parent'], - properties: { - root: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - parent: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - entity: { - type: 'object', - description: 'Deprecated: use facets instead.', - required: ['index', 'type', 'value'], - properties: { - index: { - type: 'ref', - ref: 'lex:app.bsky.feed.post#textSlice', - }, - type: { - type: 'string', - description: "Expected values are 'mention' and 'link'.", - }, - value: { - type: 'string', - }, - }, - }, - textSlice: { - type: 'object', - description: - 'Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings.', - required: ['start', 'end'], - properties: { - start: { - type: 'integer', - minimum: 0, - }, - end: { - type: 'integer', - minimum: 0, - }, - }, - }, - }, - }, - AppBskyFeedPostgate: { - lexicon: 1, - id: 'app.bsky.feed.postgate', - defs: { - main: { - type: 'record', - key: 'tid', - description: - 'Record defining interaction rules for a post. The record key (rkey) of the postgate record must match the record key of the post, and that record must be in the same repository.', - record: { - type: 'object', - required: ['post', 'createdAt'], - properties: { - createdAt: { - type: 'string', - format: 'datetime', - }, - post: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) to the post record.', - }, - detachedEmbeddingUris: { - type: 'array', - maxLength: 50, - items: { - type: 'string', - format: 'at-uri', - }, - description: - 'List of AT-URIs embedding this post that the author has detached from.', - }, - embeddingRules: { - description: - 'List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed.', - type: 'array', - maxLength: 5, - items: { - type: 'union', - refs: ['lex:app.bsky.feed.postgate#disableRule'], - }, - }, - }, - }, - }, - disableRule: { - type: 'object', - description: 'Disables embedding of this post.', - properties: {}, - }, - }, - }, - AppBskyFeedRepost: { - lexicon: 1, - id: 'app.bsky.feed.repost', - defs: { - main: { - description: - "Record representing a 'repost' of an existing Bluesky post.", - type: 'record', - key: 'tid', - record: { - type: 'object', - required: ['subject', 'createdAt'], - properties: { - subject: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - via: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - }, - }, - }, - AppBskyFeedSearchPosts: { - lexicon: 1, - id: 'app.bsky.feed.searchPosts', - defs: { - main: { - type: 'query', - description: - 'Find posts matching search criteria, returning views of those posts. Note that this API endpoint may require authentication (eg, not public) for some service providers and implementations.', - parameters: { - type: 'params', - required: ['q'], - properties: { - q: { - type: 'string', - description: - 'Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.', - }, - sort: { - type: 'string', - knownValues: ['top', 'latest'], - default: 'latest', - description: 'Specifies the ranking order of results.', - }, - since: { - type: 'string', - description: - "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD).", - }, - until: { - type: 'string', - description: - "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD).", - }, - mentions: { - type: 'string', - format: 'at-identifier', - description: - 'Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions.', - }, - author: { - type: 'string', - format: 'at-identifier', - description: - 'Filter to posts by the given account. Handles are resolved to DID before query-time.', - }, - lang: { - type: 'string', - format: 'language', - description: - 'Filter to posts in the given language. Expected to be based on post language field, though server may override language detection.', - }, - domain: { - type: 'string', - description: - 'Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization.', - }, - url: { - type: 'string', - format: 'uri', - description: - 'Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching.', - }, - tag: { - type: 'array', - items: { - type: 'string', - maxLength: 640, - maxGraphemes: 64, - }, - description: - "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 25, - }, - cursor: { - type: 'string', - description: - 'Optional pagination mechanism; may not necessarily allow scrolling through entire result set.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['posts'], - properties: { - cursor: { - type: 'string', - }, - hitsTotal: { - type: 'integer', - description: - 'Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.', - }, - posts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#postView', - }, - }, - }, - }, - }, - errors: [ - { - name: 'BadQueryString', - }, - ], - }, - }, - }, - AppBskyFeedSendInteractions: { - lexicon: 1, - id: 'app.bsky.feed.sendInteractions', - defs: { - main: { - type: 'procedure', - description: - 'Send information about interactions with feed items back to the feed generator that served them.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['interactions'], - properties: { - feed: { - type: 'string', - format: 'at-uri', - }, - interactions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#interaction', - }, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - }, - }, - }, - AppBskyFeedThreadgate: { - lexicon: 1, - id: 'app.bsky.feed.threadgate', - defs: { - main: { - type: 'record', - key: 'tid', - description: - "Record defining interaction gating rules for a thread (aka, reply controls). The record key (rkey) of the threadgate record must match the record key of the thread's root post, and that record must be in the same repository.", - record: { - type: 'object', - required: ['post', 'createdAt'], - properties: { - post: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) to the post record.', - }, - allow: { - description: - 'List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply.', - type: 'array', - maxLength: 5, - items: { - type: 'union', - refs: [ - 'lex:app.bsky.feed.threadgate#mentionRule', - 'lex:app.bsky.feed.threadgate#followerRule', - 'lex:app.bsky.feed.threadgate#followingRule', - 'lex:app.bsky.feed.threadgate#listRule', - ], - }, - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - hiddenReplies: { - type: 'array', - maxLength: 300, - items: { - type: 'string', - format: 'at-uri', - }, - description: 'List of hidden reply URIs.', - }, - }, - }, - }, - mentionRule: { - type: 'object', - description: 'Allow replies from actors mentioned in your post.', - properties: {}, - }, - followerRule: { - type: 'object', - description: 'Allow replies from actors who follow you.', - properties: {}, - }, - followingRule: { - type: 'object', - description: 'Allow replies from actors you follow.', - properties: {}, - }, - listRule: { - type: 'object', - description: 'Allow replies from actors on a list.', - required: ['list'], - properties: { - list: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - AppBskyGraphBlock: { - lexicon: 1, - id: 'app.bsky.graph.block', - defs: { - main: { - type: 'record', - description: - "Record declaring a 'block' relationship against another account. NOTE: blocks are public in Bluesky; see blog posts for details.", - key: 'tid', - record: { - type: 'object', - required: ['subject', 'createdAt'], - properties: { - subject: { - type: 'string', - format: 'did', - description: 'DID of the account to be blocked.', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyGraphDefs: { - lexicon: 1, - id: 'app.bsky.graph.defs', - defs: { - listViewBasic: { - type: 'object', - required: ['uri', 'cid', 'name', 'purpose'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - name: { - type: 'string', - maxLength: 64, - minLength: 1, - }, - purpose: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listPurpose', - }, - avatar: { - type: 'string', - format: 'uri', - }, - listItemCount: { - type: 'integer', - minimum: 0, - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listViewerState', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - listView: { - type: 'object', - required: ['uri', 'cid', 'creator', 'name', 'purpose', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - creator: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - name: { - type: 'string', - maxLength: 64, - minLength: 1, - }, - purpose: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listPurpose', - }, - description: { - type: 'string', - maxGraphemes: 300, - maxLength: 3000, - }, - descriptionFacets: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - avatar: { - type: 'string', - format: 'uri', - }, - listItemCount: { - type: 'integer', - minimum: 0, - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listViewerState', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - listItemView: { - type: 'object', - required: ['uri', 'subject'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - subject: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - starterPackView: { - type: 'object', - required: ['uri', 'cid', 'record', 'creator', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - record: { - type: 'unknown', - }, - creator: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - list: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listViewBasic', - }, - listItemsSample: { - type: 'array', - maxLength: 12, - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listItemView', - }, - }, - feeds: { - type: 'array', - maxLength: 3, - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - }, - joinedWeekCount: { - type: 'integer', - minimum: 0, - }, - joinedAllTimeCount: { - type: 'integer', - minimum: 0, - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - starterPackViewBasic: { - type: 'object', - required: ['uri', 'cid', 'record', 'creator', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - record: { - type: 'unknown', - }, - creator: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - listItemCount: { - type: 'integer', - minimum: 0, - }, - joinedWeekCount: { - type: 'integer', - minimum: 0, - }, - joinedAllTimeCount: { - type: 'integer', - minimum: 0, - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - listPurpose: { - type: 'string', - knownValues: [ - 'app.bsky.graph.defs#modlist', - 'app.bsky.graph.defs#curatelist', - 'app.bsky.graph.defs#referencelist', - ], - }, - modlist: { - type: 'token', - description: - 'A list of actors to apply an aggregate moderation action (mute/block) on.', - }, - curatelist: { - type: 'token', - description: - 'A list of actors used for curation purposes such as list feeds or interaction gating.', - }, - referencelist: { - type: 'token', - description: - 'A list of actors used for only for reference purposes such as within a starter pack.', - }, - listViewerState: { - type: 'object', - properties: { - muted: { - type: 'boolean', - }, - blocked: { - type: 'string', - format: 'at-uri', - }, - }, - }, - notFoundActor: { - type: 'object', - description: 'indicates that a handle or DID could not be resolved', - required: ['actor', 'notFound'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - notFound: { - type: 'boolean', - const: true, - }, - }, - }, - relationship: { - type: 'object', - description: - 'lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object)', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - following: { - type: 'string', - format: 'at-uri', - description: - 'if the actor follows this DID, this is the AT-URI of the follow record', - }, - followedBy: { - type: 'string', - format: 'at-uri', - description: - 'if the actor is followed by this DID, contains the AT-URI of the follow record', - }, - blocking: { - type: 'string', - format: 'at-uri', - description: - 'if the actor blocks this DID, this is the AT-URI of the block record', - }, - blockedBy: { - type: 'string', - format: 'at-uri', - description: - 'if the actor is blocked by this DID, contains the AT-URI of the block record', - }, - blockingByList: { - type: 'string', - format: 'at-uri', - description: - 'if the actor blocks this DID via a block list, this is the AT-URI of the listblock record', - }, - blockedByList: { - type: 'string', - format: 'at-uri', - description: - 'if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record', - }, - }, - }, - }, - }, - AppBskyGraphFollow: { - lexicon: 1, - id: 'app.bsky.graph.follow', - defs: { - main: { - type: 'record', - description: - "Record declaring a social 'follow' relationship of another account. Duplicate follows will be ignored by the AppView.", - key: 'tid', - record: { - type: 'object', - required: ['subject', 'createdAt'], - properties: { - subject: { - type: 'string', - format: 'did', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - via: { - type: 'ref', - ref: 'lex:com.atproto.repo.strongRef', - }, - }, - }, - }, - }, - }, - AppBskyGraphGetActorStarterPacks: { - lexicon: 1, - id: 'app.bsky.graph.getActorStarterPacks', - defs: { - main: { - type: 'query', - description: 'Get a list of starter packs created by the actor.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - cursor: { - type: 'string', - }, - starterPacks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetBlocks: { - lexicon: 1, - id: 'app.bsky.graph.getBlocks', - defs: { - main: { - type: 'query', - description: - 'Enumerates which accounts the requesting account is currently blocking. Requires auth.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['blocks'], - properties: { - cursor: { - type: 'string', - }, - blocks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetFollowers: { - lexicon: 1, - id: 'app.bsky.graph.getFollowers', - defs: { - main: { - type: 'query', - description: - 'Enumerates accounts which follow a specified account (actor).', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject', 'followers'], - properties: { - subject: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - cursor: { - type: 'string', - }, - followers: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetFollows: { - lexicon: 1, - id: 'app.bsky.graph.getFollows', - defs: { - main: { - type: 'query', - description: - 'Enumerates accounts which a specified account (actor) follows.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject', 'follows'], - properties: { - subject: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - cursor: { - type: 'string', - }, - follows: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetKnownFollowers: { - lexicon: 1, - id: 'app.bsky.graph.getKnownFollowers', - defs: { - main: { - type: 'query', - description: - 'Enumerates accounts which follow a specified account (actor) and are followed by the viewer.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject', 'followers'], - properties: { - subject: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - cursor: { - type: 'string', - }, - followers: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetList: { - lexicon: 1, - id: 'app.bsky.graph.getList', - defs: { - main: { - type: 'query', - description: - "Gets a 'view' (with additional context) of a specified list.", - parameters: { - type: 'params', - required: ['list'], - properties: { - list: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) of the list record to hydrate.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['list', 'items'], - properties: { - cursor: { - type: 'string', - }, - list: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listView', - }, - items: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listItemView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetListBlocks: { - lexicon: 1, - id: 'app.bsky.graph.getListBlocks', - defs: { - main: { - type: 'query', - description: - 'Get mod lists that the requesting account (actor) is blocking. Requires auth.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['lists'], - properties: { - cursor: { - type: 'string', - }, - lists: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetListMutes: { - lexicon: 1, - id: 'app.bsky.graph.getListMutes', - defs: { - main: { - type: 'query', - description: - 'Enumerates mod lists that the requesting account (actor) currently has muted. Requires auth.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['lists'], - properties: { - cursor: { - type: 'string', - }, - lists: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetLists: { - lexicon: 1, - id: 'app.bsky.graph.getLists', - defs: { - main: { - type: 'query', - description: - 'Enumerates the lists created by a specified account (actor).', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - description: 'The account (actor) to enumerate lists from.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - purposes: { - type: 'array', - description: - 'Optional filter by list purpose. If not specified, all supported types are returned.', - items: { - type: 'string', - knownValues: ['modlist', 'curatelist'], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['lists'], - properties: { - cursor: { - type: 'string', - }, - lists: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetListsWithMembership: { - lexicon: 1, - id: 'app.bsky.graph.getListsWithMembership', - defs: { - main: { - type: 'query', - description: - 'Enumerates the lists created by the session user, and includes membership information about `actor` in those lists. Only supports curation and moderation lists (no reference lists, used in starter packs). Requires auth.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - description: 'The account (actor) to check for membership.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - purposes: { - type: 'array', - description: - 'Optional filter by list purpose. If not specified, all supported types are returned.', - items: { - type: 'string', - knownValues: ['modlist', 'curatelist'], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['listsWithMembership'], - properties: { - cursor: { - type: 'string', - }, - listsWithMembership: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.getListsWithMembership#listWithMembership', - }, - }, - }, - }, - }, - }, - listWithMembership: { - description: - 'A list and an optional list item indicating membership of a target user to that list.', - type: 'object', - required: ['list'], - properties: { - list: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listView', - }, - listItem: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listItemView', - }, - }, - }, - }, - }, - AppBskyGraphGetMutes: { - lexicon: 1, - id: 'app.bsky.graph.getMutes', - defs: { - main: { - type: 'query', - description: - 'Enumerates accounts that the requesting account (actor) currently has muted. Requires auth.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['mutes'], - properties: { - cursor: { - type: 'string', - }, - mutes: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetRelationships: { - lexicon: 1, - id: 'app.bsky.graph.getRelationships', - defs: { - main: { - type: 'query', - description: - 'Enumerates public relationships between one account, and a list of other accounts. Does not require auth.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - description: 'Primary account requesting relationships for.', - }, - others: { - type: 'array', - description: - "List of 'other' accounts to be related back to the primary.", - maxLength: 30, - items: { - type: 'string', - format: 'at-identifier', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['relationships'], - properties: { - actor: { - type: 'string', - format: 'did', - }, - relationships: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.graph.defs#relationship', - 'lex:app.bsky.graph.defs#notFoundActor', - ], - }, - }, - }, - }, - }, - errors: [ - { - name: 'ActorNotFound', - description: - 'the primary actor at-identifier could not be resolved', - }, - ], - }, - }, - }, - AppBskyGraphGetStarterPack: { - lexicon: 1, - id: 'app.bsky.graph.getStarterPack', - defs: { - main: { - type: 'query', - description: 'Gets a view of a starter pack.', - parameters: { - type: 'params', - required: ['starterPack'], - properties: { - starterPack: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) of the starter pack record.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPack'], - properties: { - starterPack: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackView', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetStarterPacks: { - lexicon: 1, - id: 'app.bsky.graph.getStarterPacks', - defs: { - main: { - type: 'query', - description: 'Get views for a list of starter packs.', - parameters: { - type: 'params', - required: ['uris'], - properties: { - uris: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - maxLength: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - starterPacks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphGetStarterPacksWithMembership: { - lexicon: 1, - id: 'app.bsky.graph.getStarterPacksWithMembership', - defs: { - main: { - type: 'query', - description: - 'Enumerates the starter packs created by the session user, and includes membership information about `actor` in those starter packs. Requires auth.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - description: 'The account (actor) to check for membership.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacksWithMembership'], - properties: { - cursor: { - type: 'string', - }, - starterPacksWithMembership: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.getStarterPacksWithMembership#starterPackWithMembership', - }, - }, - }, - }, - }, - }, - starterPackWithMembership: { - description: - 'A starter pack and an optional list item indicating membership of a target user to that starter pack.', - type: 'object', - required: ['starterPack'], - properties: { - starterPack: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackView', - }, - listItem: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#listItemView', - }, - }, - }, - }, - }, - AppBskyGraphGetSuggestedFollowsByActor: { - lexicon: 1, - id: 'app.bsky.graph.getSuggestedFollowsByActor', - defs: { - main: { - type: 'query', - description: - 'Enumerates follows similar to a given account (actor). Expected use is to recommend additional accounts immediately after following one account.', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['suggestions'], - properties: { - suggestions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - isFallback: { - type: 'boolean', - description: - 'DEPRECATED, unused. Previously: if true, response has fallen-back to generic results, and is not scoped using relativeToDid', - default: false, - }, - recId: { - type: 'integer', - description: 'DEPRECATED: use recIdStr instead.', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphList: { - lexicon: 1, - id: 'app.bsky.graph.list', - defs: { - main: { - type: 'record', - description: - 'Record representing a list of accounts (actors). Scope includes both moderation-oriented lists and curration-oriented lists.', - key: 'tid', - record: { - type: 'object', - required: ['name', 'purpose', 'createdAt'], - properties: { - purpose: { - type: 'ref', - description: - 'Defines the purpose of the list (aka, moderation-oriented or curration-oriented)', - ref: 'lex:app.bsky.graph.defs#listPurpose', - }, - name: { - type: 'string', - maxLength: 64, - minLength: 1, - description: 'Display name for list; can not be empty.', - }, - description: { - type: 'string', - maxGraphemes: 300, - maxLength: 3000, - }, - descriptionFacets: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - avatar: { - type: 'blob', - accept: ['image/png', 'image/jpeg'], - maxSize: 1000000, - }, - labels: { - type: 'union', - refs: ['lex:com.atproto.label.defs#selfLabels'], - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyGraphListblock: { - lexicon: 1, - id: 'app.bsky.graph.listblock', - defs: { - main: { - type: 'record', - description: - 'Record representing a block relationship against an entire an entire list of accounts (actors).', - key: 'tid', - record: { - type: 'object', - required: ['subject', 'createdAt'], - properties: { - subject: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) to the mod list record.', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyGraphListitem: { - lexicon: 1, - id: 'app.bsky.graph.listitem', - defs: { - main: { - type: 'record', - description: - "Record representing an account's inclusion on a specific list. The AppView will ignore duplicate listitem records.", - key: 'tid', - record: { - type: 'object', - required: ['subject', 'list', 'createdAt'], - properties: { - subject: { - type: 'string', - format: 'did', - description: 'The account which is included on the list.', - }, - list: { - type: 'string', - format: 'at-uri', - description: - 'Reference (AT-URI) to the list record (app.bsky.graph.list).', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyGraphMuteActor: { - lexicon: 1, - id: 'app.bsky.graph.muteActor', - defs: { - main: { - type: 'procedure', - description: - 'Creates a mute relationship for the specified account. Mutes are private in Bluesky. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphMuteActorList: { - lexicon: 1, - id: 'app.bsky.graph.muteActorList', - defs: { - main: { - type: 'procedure', - description: - 'Creates a mute relationship for the specified list of accounts. Mutes are private in Bluesky. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['list'], - properties: { - list: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphMuteThread: { - lexicon: 1, - id: 'app.bsky.graph.muteThread', - defs: { - main: { - type: 'procedure', - description: - 'Mutes a thread preventing notifications from the thread and any of its children. Mutes are private in Bluesky. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['root'], - properties: { - root: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphSearchStarterPacks: { - lexicon: 1, - id: 'app.bsky.graph.searchStarterPacks', - defs: { - main: { - type: 'query', - description: - 'Find starter packs matching search criteria. Does not require auth.', - parameters: { - type: 'params', - required: ['q'], - properties: { - q: { - type: 'string', - description: - 'Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 25, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - cursor: { - type: 'string', - }, - starterPacks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphStarterpack: { - lexicon: 1, - id: 'app.bsky.graph.starterpack', - defs: { - main: { - type: 'record', - description: - 'Record defining a starter pack of actors and feeds for new users.', - key: 'tid', - record: { - type: 'object', - required: ['name', 'list', 'createdAt'], - properties: { - name: { - type: 'string', - maxGraphemes: 50, - maxLength: 500, - minLength: 1, - description: 'Display name for starter pack; can not be empty.', - }, - description: { - type: 'string', - maxGraphemes: 300, - maxLength: 3000, - }, - descriptionFacets: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - list: { - type: 'string', - format: 'at-uri', - description: 'Reference (AT-URI) to the list record.', - }, - feeds: { - type: 'array', - maxLength: 3, - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.starterpack#feedItem', - }, - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - feedItem: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - AppBskyGraphUnmuteActor: { - lexicon: 1, - id: 'app.bsky.graph.unmuteActor', - defs: { - main: { - type: 'procedure', - description: 'Unmutes the specified account. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'at-identifier', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphUnmuteActorList: { - lexicon: 1, - id: 'app.bsky.graph.unmuteActorList', - defs: { - main: { - type: 'procedure', - description: 'Unmutes the specified list of accounts. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['list'], - properties: { - list: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphUnmuteThread: { - lexicon: 1, - id: 'app.bsky.graph.unmuteThread', - defs: { - main: { - type: 'procedure', - description: 'Unmutes the specified thread. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['root'], - properties: { - root: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - AppBskyGraphVerification: { - lexicon: 1, - id: 'app.bsky.graph.verification', - defs: { - main: { - type: 'record', - description: - 'Record declaring a verification relationship between two accounts. Verifications are only considered valid by an app if issued by an account the app considers trusted.', - key: 'tid', - record: { - type: 'object', - required: ['subject', 'handle', 'displayName', 'createdAt'], - properties: { - subject: { - description: 'DID of the subject the verification applies to.', - type: 'string', - format: 'did', - }, - handle: { - description: - 'Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying.', - type: 'string', - format: 'handle', - }, - displayName: { - description: - 'Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying.', - type: 'string', - }, - createdAt: { - description: 'Date of when the verification was created.', - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - AppBskyLabelerDefs: { - lexicon: 1, - id: 'app.bsky.labeler.defs', - defs: { - labelerView: { - type: 'object', - required: ['uri', 'cid', 'creator', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - creator: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - likeCount: { - type: 'integer', - minimum: 0, - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.labeler.defs#labelerViewerState', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - }, - }, - labelerViewDetailed: { - type: 'object', - required: ['uri', 'cid', 'creator', 'policies', 'indexedAt'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - creator: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - policies: { - type: 'ref', - ref: 'lex:app.bsky.labeler.defs#labelerPolicies', - }, - likeCount: { - type: 'integer', - minimum: 0, - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.labeler.defs#labelerViewerState', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - reasonTypes: { - description: - "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#reasonType', - }, - }, - subjectTypes: { - description: - 'The set of subject types (account, record, etc) this service accepts reports on.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#subjectType', - }, - }, - subjectCollections: { - type: 'array', - description: - 'Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.', - items: { - type: 'string', - format: 'nsid', - }, - }, - }, - }, - labelerViewerState: { - type: 'object', - properties: { - like: { - type: 'string', - format: 'at-uri', - }, - }, - }, - labelerPolicies: { - type: 'object', - required: ['labelValues'], - properties: { - labelValues: { - type: 'array', - description: - 'The label values which this labeler publishes. May include global or custom labels.', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#labelValue', - }, - }, - labelValueDefinitions: { - type: 'array', - description: - 'Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler.', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#labelValueDefinition', - }, - }, - }, - }, - }, - }, - AppBskyLabelerGetServices: { - lexicon: 1, - id: 'app.bsky.labeler.getServices', - defs: { - main: { - type: 'query', - description: 'Get information about a list of labeler services.', - parameters: { - type: 'params', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - detailed: { - type: 'boolean', - default: false, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['views'], - properties: { - views: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.labeler.defs#labelerView', - 'lex:app.bsky.labeler.defs#labelerViewDetailed', - ], - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyLabelerService: { - lexicon: 1, - id: 'app.bsky.labeler.service', - defs: { - main: { - type: 'record', - description: 'A declaration of the existence of labeler service.', - key: 'literal:self', - record: { - type: 'object', - required: ['policies', 'createdAt'], - properties: { - policies: { - type: 'ref', - ref: 'lex:app.bsky.labeler.defs#labelerPolicies', - }, - labels: { - type: 'union', - refs: ['lex:com.atproto.label.defs#selfLabels'], - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - reasonTypes: { - description: - "The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed.", - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#reasonType', - }, - }, - subjectTypes: { - description: - 'The set of subject types (account, record, etc) this service accepts reports on.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#subjectType', - }, - }, - subjectCollections: { - type: 'array', - description: - 'Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type.', - items: { - type: 'string', - format: 'nsid', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationDeclaration: { - lexicon: 1, - id: 'app.bsky.notification.declaration', - defs: { - main: { - type: 'record', - description: - "A declaration of the user's choices related to notifications that can be produced by them.", - key: 'literal:self', - record: { - type: 'object', - required: ['allowSubscriptions'], - properties: { - allowSubscriptions: { - type: 'string', - description: - "A declaration of the user's preference for allowing activity subscriptions from other users. Absence of a record implies 'followers'.", - knownValues: ['followers', 'mutuals', 'none'], - }, - }, - }, - }, - }, - }, - AppBskyNotificationDefs: { - lexicon: 1, - id: 'app.bsky.notification.defs', - defs: { - recordDeleted: { - type: 'object', - properties: {}, - }, - chatPreference: { - type: 'object', - required: ['include', 'push'], - properties: { - include: { - type: 'string', - knownValues: ['all', 'accepted'], - }, - push: { - type: 'boolean', - }, - }, - }, - filterablePreference: { - type: 'object', - required: ['include', 'list', 'push'], - properties: { - include: { - type: 'string', - knownValues: ['all', 'follows'], - }, - list: { - type: 'boolean', - }, - push: { - type: 'boolean', - }, - }, - }, - preference: { - type: 'object', - required: ['list', 'push'], - properties: { - list: { - type: 'boolean', - }, - push: { - type: 'boolean', - }, - }, - }, - preferences: { - type: 'object', - required: [ - 'chat', - 'follow', - 'like', - 'likeViaRepost', - 'mention', - 'quote', - 'reply', - 'repost', - 'repostViaRepost', - 'starterpackJoined', - 'subscribedPost', - 'unverified', - 'verified', - ], - properties: { - chat: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#chatPreference', - }, - follow: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - like: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - likeViaRepost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - mention: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - quote: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - reply: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - repost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - repostViaRepost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - starterpackJoined: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - subscribedPost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - unverified: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - verified: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - }, - }, - activitySubscription: { - type: 'object', - required: ['post', 'reply'], - properties: { - post: { - type: 'boolean', - }, - reply: { - type: 'boolean', - }, - }, - }, - subjectActivitySubscription: { - description: - 'Object used to store activity subscription data in stash.', - type: 'object', - required: ['subject', 'activitySubscription'], - properties: { - subject: { - type: 'string', - format: 'did', - }, - activitySubscription: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#activitySubscription', - }, - }, - }, - }, - }, - AppBskyNotificationGetPreferences: { - lexicon: 1, - id: 'app.bsky.notification.getPreferences', - defs: { - main: { - type: 'query', - description: - 'Get notification-related preferences for an account. Requires auth.', - parameters: { - type: 'params', - properties: {}, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['preferences'], - properties: { - preferences: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preferences', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationGetUnreadCount: { - lexicon: 1, - id: 'app.bsky.notification.getUnreadCount', - defs: { - main: { - type: 'query', - description: - 'Count the number of unread notifications for the requesting account. Requires auth.', - parameters: { - type: 'params', - properties: { - priority: { - type: 'boolean', - }, - seenAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['count'], - properties: { - count: { - type: 'integer', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationListActivitySubscriptions: { - lexicon: 1, - id: 'app.bsky.notification.listActivitySubscriptions', - defs: { - main: { - type: 'query', - description: - 'Enumerate all accounts to which the requesting account is subscribed to receive notifications for. Requires auth.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subscriptions'], - properties: { - cursor: { - type: 'string', - }, - subscriptions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationListNotifications: { - lexicon: 1, - id: 'app.bsky.notification.listNotifications', - defs: { - main: { - type: 'query', - description: - 'Enumerate notifications for the requesting account. Requires auth.', - parameters: { - type: 'params', - properties: { - reasons: { - description: 'Notification reasons to include in response.', - type: 'array', - items: { - type: 'string', - description: - 'A reason that matches the reason property of #notification.', - }, - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - priority: { - type: 'boolean', - }, - cursor: { - type: 'string', - }, - seenAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['notifications'], - properties: { - cursor: { - type: 'string', - }, - notifications: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.notification.listNotifications#notification', - }, - }, - priority: { - type: 'boolean', - }, - seenAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - notification: { - type: 'object', - required: [ - 'uri', - 'cid', - 'author', - 'reason', - 'record', - 'isRead', - 'indexedAt', - ], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - author: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - reason: { - type: 'string', - description: - 'The reason why this notification was delivered - e.g. your post was liked, or you received a new follower.', - knownValues: [ - 'like', - 'repost', - 'follow', - 'mention', - 'reply', - 'quote', - 'starterpack-joined', - 'verified', - 'unverified', - 'like-via-repost', - 'repost-via-repost', - 'subscribed-post', - 'contact-match', - ], - }, - reasonSubject: { - type: 'string', - format: 'at-uri', - }, - record: { - type: 'unknown', - }, - isRead: { - type: 'boolean', - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - }, - }, - }, - }, - AppBskyNotificationPutActivitySubscription: { - lexicon: 1, - id: 'app.bsky.notification.putActivitySubscription', - defs: { - main: { - type: 'procedure', - description: - 'Puts an activity subscription entry. The key should be omitted for creation and provided for updates. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject', 'activitySubscription'], - properties: { - subject: { - type: 'string', - format: 'did', - }, - activitySubscription: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#activitySubscription', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject'], - properties: { - subject: { - type: 'string', - format: 'did', - }, - activitySubscription: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#activitySubscription', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationPutPreferences: { - lexicon: 1, - id: 'app.bsky.notification.putPreferences', - defs: { - main: { - type: 'procedure', - description: - 'Set notification-related preferences for an account. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['priority'], - properties: { - priority: { - type: 'boolean', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationPutPreferencesV2: { - lexicon: 1, - id: 'app.bsky.notification.putPreferencesV2', - defs: { - main: { - type: 'procedure', - description: - 'Set notification-related preferences for an account. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - chat: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#chatPreference', - }, - follow: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - like: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - likeViaRepost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - mention: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - quote: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - reply: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - repost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - repostViaRepost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#filterablePreference', - }, - starterpackJoined: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - subscribedPost: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - unverified: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - verified: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preference', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['preferences'], - properties: { - preferences: { - type: 'ref', - ref: 'lex:app.bsky.notification.defs#preferences', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationRegisterPush: { - lexicon: 1, - id: 'app.bsky.notification.registerPush', - defs: { - main: { - type: 'procedure', - description: - 'Register to receive push notifications, via a specified service, for the requesting account. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['serviceDid', 'token', 'platform', 'appId'], - properties: { - serviceDid: { - type: 'string', - format: 'did', - }, - token: { - type: 'string', - }, - platform: { - type: 'string', - knownValues: ['ios', 'android', 'web'], - }, - appId: { - type: 'string', - }, - ageRestricted: { - type: 'boolean', - description: 'Set to true when the actor is age restricted', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationUnregisterPush: { - lexicon: 1, - id: 'app.bsky.notification.unregisterPush', - defs: { - main: { - type: 'procedure', - description: - 'The inverse of registerPush - inform a specified service that push notifications should no longer be sent to the given token for the requesting account. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['serviceDid', 'token', 'platform', 'appId'], - properties: { - serviceDid: { - type: 'string', - format: 'did', - }, - token: { - type: 'string', - }, - platform: { - type: 'string', - knownValues: ['ios', 'android', 'web'], - }, - appId: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - AppBskyNotificationUpdateSeen: { - lexicon: 1, - id: 'app.bsky.notification.updateSeen', - defs: { - main: { - type: 'procedure', - description: - 'Notify server that the requesting account has seen notifications. Requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['seenAt'], - properties: { - seenAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - }, - }, - AppBskyRichtextFacet: { - lexicon: 1, - id: 'app.bsky.richtext.facet', - defs: { - main: { - type: 'object', - description: 'Annotation of a sub-string within rich text.', - required: ['index', 'features'], - properties: { - index: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet#byteSlice', - }, - features: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:app.bsky.richtext.facet#mention', - 'lex:app.bsky.richtext.facet#link', - 'lex:app.bsky.richtext.facet#tag', - ], - }, - }, - }, - }, - mention: { - type: 'object', - description: - "Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID.", - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - link: { - type: 'object', - description: - 'Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'uri', - }, - }, - }, - tag: { - type: 'object', - description: - "Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags').", - required: ['tag'], - properties: { - tag: { - type: 'string', - maxLength: 640, - maxGraphemes: 64, - }, - }, - }, - byteSlice: { - type: 'object', - description: - 'Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.', - required: ['byteStart', 'byteEnd'], - properties: { - byteStart: { - type: 'integer', - minimum: 0, - }, - byteEnd: { - type: 'integer', - minimum: 0, - }, - }, - }, - }, - }, - AppBskyUnspeccedDefs: { - lexicon: 1, - id: 'app.bsky.unspecced.defs', - defs: { - skeletonSearchPost: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - skeletonSearchActor: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - skeletonSearchStarterPack: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - trendingTopic: { - type: 'object', - required: ['topic', 'link'], - properties: { - topic: { - type: 'string', - }, - displayName: { - type: 'string', - }, - description: { - type: 'string', - }, - link: { - type: 'string', - }, - }, - }, - skeletonTrend: { - type: 'object', - required: [ - 'topic', - 'displayName', - 'link', - 'startedAt', - 'postCount', - 'dids', - ], - properties: { - topic: { - type: 'string', - }, - displayName: { - type: 'string', - }, - link: { - type: 'string', - }, - startedAt: { - type: 'string', - format: 'datetime', - }, - postCount: { - type: 'integer', - }, - status: { - type: 'string', - knownValues: ['hot'], - }, - category: { - type: 'string', - }, - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - trendView: { - type: 'object', - required: [ - 'topic', - 'displayName', - 'link', - 'startedAt', - 'postCount', - 'actors', - ], - properties: { - topic: { - type: 'string', - }, - displayName: { - type: 'string', - }, - link: { - type: 'string', - }, - startedAt: { - type: 'string', - format: 'datetime', - }, - postCount: { - type: 'integer', - }, - status: { - type: 'string', - knownValues: ['hot'], - }, - category: { - type: 'string', - }, - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - threadItemPost: { - type: 'object', - required: [ - 'post', - 'moreParents', - 'moreReplies', - 'opThread', - 'hiddenByThreadgate', - 'mutedByViewer', - ], - properties: { - post: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#postView', - }, - moreParents: { - type: 'boolean', - description: - 'This post has more parents that were not present in the response. This is just a boolean, without the number of parents.', - }, - moreReplies: { - type: 'integer', - description: - 'This post has more replies that were not present in the response. This is a numeric value, which is best-effort and might not be accurate.', - }, - opThread: { - type: 'boolean', - description: - 'This post is part of a contiguous thread by the OP from the thread root. Many different OP threads can happen in the same thread.', - }, - hiddenByThreadgate: { - type: 'boolean', - description: - 'The threadgate created by the author indicates this post as a reply to be hidden for everyone consuming the thread.', - }, - mutedByViewer: { - type: 'boolean', - description: - 'This is by an account muted by the viewer requesting it.', - }, - }, - }, - threadItemNoUnauthenticated: { - type: 'object', - properties: {}, - }, - threadItemNotFound: { - type: 'object', - properties: {}, - }, - threadItemBlocked: { - type: 'object', - required: ['author'], - properties: { - author: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#blockedAuthor', - }, - }, - }, - ageAssuranceState: { - type: 'object', - description: - 'The computed state of the age assurance process, returned to the user in question on certain authenticated requests.', - required: ['status'], - properties: { - lastInitiatedAt: { - type: 'string', - format: 'datetime', - description: 'The timestamp when this state was last updated.', - }, - status: { - type: 'string', - description: 'The status of the age assurance process.', - knownValues: ['unknown', 'pending', 'assured', 'blocked'], - }, - }, - }, - ageAssuranceEvent: { - type: 'object', - description: 'Object used to store age assurance data in stash.', - required: ['createdAt', 'status', 'attemptId'], - properties: { - createdAt: { - type: 'string', - format: 'datetime', - description: 'The date and time of this write operation.', - }, - status: { - type: 'string', - description: 'The status of the age assurance process.', - knownValues: ['unknown', 'pending', 'assured'], - }, - attemptId: { - type: 'string', - description: - 'The unique identifier for this instance of the age assurance flow, in UUID format.', - }, - email: { - type: 'string', - description: 'The email used for AA.', - }, - initIp: { - type: 'string', - description: 'The IP address used when initiating the AA flow.', - }, - initUa: { - type: 'string', - description: 'The user agent used when initiating the AA flow.', - }, - completeIp: { - type: 'string', - description: 'The IP address used when completing the AA flow.', - }, - completeUa: { - type: 'string', - description: 'The user agent used when completing the AA flow.', - }, - }, - }, - }, - }, - AppBskyUnspeccedGetAgeAssuranceState: { - lexicon: 1, - id: 'app.bsky.unspecced.getAgeAssuranceState', - defs: { - main: { - type: 'query', - description: - 'Returns the current state of the age assurance process for an account. This is used to check if the user has completed age assurance or if further action is required.', - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#ageAssuranceState', - }, - }, - }, - }, - }, - AppBskyUnspeccedGetConfig: { - lexicon: 1, - id: 'app.bsky.unspecced.getConfig', - defs: { - main: { - type: 'query', - description: 'Get miscellaneous runtime configuration.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: [], - properties: { - checkEmailConfirmed: { - type: 'boolean', - }, - liveNow: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.getConfig#liveNowConfig', - }, - }, - }, - }, - }, - }, - liveNowConfig: { - type: 'object', - required: ['did', 'domains'], - properties: { - did: { - type: 'string', - format: 'did', - }, - domains: { - type: 'array', - items: { - type: 'string', - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetOnboardingSuggestedStarterPacks: { - lexicon: 1, - id: 'app.bsky.unspecced.getOnboardingSuggestedStarterPacks', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested starterpacks for onboarding', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - starterPacks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetOnboardingSuggestedStarterPacksSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested starterpacks for onboarding. Intended to be called and hydrated by app.bsky.unspecced.getOnboardingSuggestedStarterPacks', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - starterPacks: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetOnboardingSuggestedUsersSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested users for onboarding. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedOnboardingUsers', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - recId: { - type: 'string', - description: 'DEPRECATED: use recIdStr instead.', - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetPopularFeedGenerators: { - lexicon: 1, - id: 'app.bsky.unspecced.getPopularFeedGenerators', - defs: { - main: { - type: 'query', - description: 'An unspecced view of globally popular feed generators.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - query: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feeds'], - properties: { - cursor: { - type: 'string', - }, - feeds: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetPostThreadOtherV2: { - lexicon: 1, - id: 'app.bsky.unspecced.getPostThreadOtherV2', - defs: { - main: { - type: 'query', - description: - "(NOTE: this endpoint is under development and WILL change without notice. Don't use it until it is moved out of `unspecced` or your application WILL break) Get additional posts under a thread e.g. replies hidden by threadgate. Based on an anchor post at any depth of the tree, returns top-level replies below that anchor. It does not include ancestors nor the anchor itself. This should be called after exhausting `app.bsky.unspecced.getPostThreadV2`. Does not require auth, but additional metadata and filtering will be applied for authed requests.", - parameters: { - type: 'params', - required: ['anchor'], - properties: { - anchor: { - type: 'string', - format: 'at-uri', - description: - 'Reference (AT-URI) to post record. This is the anchor post.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['thread'], - properties: { - thread: { - type: 'array', - description: - 'A flat list of other thread items. The depth of each item is indicated by the depth property inside the item.', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.getPostThreadOtherV2#threadItem', - }, - }, - }, - }, - }, - }, - threadItem: { - type: 'object', - required: ['uri', 'depth', 'value'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - depth: { - type: 'integer', - description: - 'The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths.', - }, - value: { - type: 'union', - refs: ['lex:app.bsky.unspecced.defs#threadItemPost'], - }, - }, - }, - }, - }, - AppBskyUnspeccedGetPostThreadV2: { - lexicon: 1, - id: 'app.bsky.unspecced.getPostThreadV2', - defs: { - main: { - type: 'query', - description: - "(NOTE: this endpoint is under development and WILL change without notice. Don't use it until it is moved out of `unspecced` or your application WILL break) Get posts in a thread. It is based in an anchor post at any depth of the tree, and returns posts above it (recursively resolving the parent, without further branching to their replies) and below it (recursive replies, with branching to their replies). Does not require auth, but additional metadata and filtering will be applied for authed requests.", - parameters: { - type: 'params', - required: ['anchor'], - properties: { - anchor: { - type: 'string', - format: 'at-uri', - description: - 'Reference (AT-URI) to post record. This is the anchor post, and the thread will be built around it. It can be any post in the tree, not necessarily a root post.', - }, - above: { - type: 'boolean', - description: 'Whether to include parents above the anchor.', - default: true, - }, - below: { - type: 'integer', - description: - 'How many levels of replies to include below the anchor.', - default: 6, - minimum: 0, - maximum: 20, - }, - branchingFactor: { - type: 'integer', - description: - 'Maximum of replies to include at each level of the thread, except for the direct replies to the anchor, which are (NOTE: currently, during unspecced phase) all returned (NOTE: later they might be paginated).', - default: 10, - minimum: 0, - maximum: 100, - }, - sort: { - type: 'string', - description: 'Sorting for the thread replies.', - knownValues: ['newest', 'oldest', 'top'], - default: 'oldest', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['thread', 'hasOtherReplies'], - properties: { - thread: { - type: 'array', - description: - 'A flat list of thread items. The depth of each item is indicated by the depth property inside the item.', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.getPostThreadV2#threadItem', - }, - }, - threadgate: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#threadgateView', - }, - hasOtherReplies: { - type: 'boolean', - description: - 'Whether this thread has additional replies. If true, a call can be made to the `getPostThreadOtherV2` endpoint to retrieve them.', - }, - }, - }, - }, - }, - threadItem: { - type: 'object', - required: ['uri', 'depth', 'value'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - depth: { - type: 'integer', - description: - 'The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths.', - }, - value: { - type: 'union', - refs: [ - 'lex:app.bsky.unspecced.defs#threadItemPost', - 'lex:app.bsky.unspecced.defs#threadItemNoUnauthenticated', - 'lex:app.bsky.unspecced.defs#threadItemNotFound', - 'lex:app.bsky.unspecced.defs#threadItemBlocked', - ], - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedFeeds: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedFeeds', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested feeds', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feeds'], - properties: { - feeds: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.feed.defs#generatorView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedFeedsSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedFeedsSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested feeds. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedFeeds', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['feeds'], - properties: { - feeds: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedOnboardingUsers: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedOnboardingUsers', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested users for onboarding', - parameters: { - type: 'params', - properties: { - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recId: { - type: 'string', - description: 'DEPRECATED: use recIdStr instead.', - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedStarterPacks: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedStarterPacks', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested starterpacks', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - starterPacks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.graph.defs#starterPackView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedStarterPacksSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedStarterPacksSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested starterpacks. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedStarterpacks', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - starterPacks: { - type: 'array', - items: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsers: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsers', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested users', - parameters: { - type: 'params', - properties: { - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recId: { - type: 'string', - description: 'DEPRECATED: use recIdStr instead.', - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersForDiscover: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersForDiscover', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested users for the Discover page', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersForDiscoverSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested users for the Discover page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForDiscover', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersForExplore: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersForExplore', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested users for the Explore page', - parameters: { - type: 'params', - properties: { - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersForExploreSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersForExploreSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested users for the Explore page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForExplore', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersForSeeMore: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersForSeeMore', - defs: { - main: { - type: 'query', - description: 'Get a list of suggested users for the See More page', - parameters: { - type: 'params', - properties: { - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileView', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersForSeeMoreSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested users for the See More page. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsersForSeeMore', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestedUsersSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestedUsersSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested users. Intended to be called and hydrated by app.bsky.unspecced.getSuggestedUsers', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - category: { - type: 'string', - description: 'Category of users to get suggestions for.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 50, - default: 25, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - recId: { - type: 'string', - description: 'DEPRECATED: use recIdStr instead.', - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetSuggestionsSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getSuggestionsSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get a skeleton of suggested actors. Intended to be called and then hydrated through app.bsky.actor.getSuggestions', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - relativeToDid: { - type: 'string', - format: 'did', - description: - 'DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - cursor: { - type: 'string', - }, - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#skeletonSearchActor', - }, - }, - relativeToDid: { - type: 'string', - format: 'did', - description: - 'DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer.', - }, - recId: { - type: 'integer', - description: 'DEPRECATED: use recIdStr instead.', - }, - recIdStr: { - type: 'string', - description: - 'Snowflake for this recommendation, use when submitting recommendation events.', - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetTaggedSuggestions: { - lexicon: 1, - id: 'app.bsky.unspecced.getTaggedSuggestions', - defs: { - main: { - type: 'query', - description: - 'Get a list of suggestions (feeds and users) tagged with categories', - parameters: { - type: 'params', - properties: {}, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['suggestions'], - properties: { - suggestions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.getTaggedSuggestions#suggestion', - }, - }, - }, - }, - }, - }, - suggestion: { - type: 'object', - required: ['tag', 'subjectType', 'subject'], - properties: { - tag: { - type: 'string', - }, - subjectType: { - type: 'string', - knownValues: ['actor', 'feed'], - }, - subject: { - type: 'string', - format: 'uri', - }, - }, - }, - }, - }, - AppBskyUnspeccedGetTrendingTopics: { - lexicon: 1, - id: 'app.bsky.unspecced.getTrendingTopics', - defs: { - main: { - type: 'query', - description: 'Get a list of trending topics', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['topics', 'suggested'], - properties: { - topics: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#trendingTopic', - }, - }, - suggested: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#trendingTopic', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetTrends: { - lexicon: 1, - id: 'app.bsky.unspecced.getTrends', - defs: { - main: { - type: 'query', - description: 'Get the current trends on the network', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['trends'], - properties: { - trends: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#trendView', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedGetTrendsSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.getTrendsSkeleton', - defs: { - main: { - type: 'query', - description: - 'Get the skeleton of trends on the network. Intended to be called and then hydrated through app.bsky.unspecced.getTrends', - parameters: { - type: 'params', - properties: { - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 25, - default: 10, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['trends'], - properties: { - trends: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#skeletonTrend', - }, - }, - }, - }, - }, - }, - }, - }, - AppBskyUnspeccedInitAgeAssurance: { - lexicon: 1, - id: 'app.bsky.unspecced.initAgeAssurance', - defs: { - main: { - type: 'procedure', - description: - "Initiate age assurance for an account. This is a one-time action that will start the process of verifying the user's age.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['email', 'language', 'countryCode'], - properties: { - email: { - type: 'string', - description: - "The user's email address to receive assurance instructions.", - }, - language: { - type: 'string', - description: - "The user's preferred language for communication during the assurance process.", - }, - countryCode: { - type: 'string', - description: - "An ISO 3166-1 alpha-2 code of the user's location.", - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#ageAssuranceState', - }, - }, - errors: [ - { - name: 'InvalidEmail', - }, - { - name: 'DidTooLong', - }, - { - name: 'InvalidInitiation', - }, - ], - }, - }, - }, - AppBskyUnspeccedSearchActorsSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.searchActorsSkeleton', - defs: { - main: { - type: 'query', - description: 'Backend Actors (profile) search, returns only skeleton.', - parameters: { - type: 'params', - required: ['q'], - properties: { - q: { - type: 'string', - description: - 'Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax.', - }, - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking.', - }, - typeahead: { - type: 'boolean', - description: "If true, acts as fast/simple 'typeahead' query.", - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 25, - }, - cursor: { - type: 'string', - description: - 'Optional pagination mechanism; may not necessarily allow scrolling through entire result set.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actors'], - properties: { - cursor: { - type: 'string', - }, - hitsTotal: { - type: 'integer', - description: - 'Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.', - }, - actors: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#skeletonSearchActor', - }, - }, - }, - }, - }, - errors: [ - { - name: 'BadQueryString', - }, - ], - }, - }, - }, - AppBskyUnspeccedSearchPostsSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.searchPostsSkeleton', - defs: { - main: { - type: 'query', - description: 'Backend Posts search, returns only skeleton', - parameters: { - type: 'params', - required: ['q'], - properties: { - q: { - type: 'string', - description: - 'Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.', - }, - sort: { - type: 'string', - knownValues: ['top', 'latest'], - default: 'latest', - description: 'Specifies the ranking order of results.', - }, - since: { - type: 'string', - description: - "Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD).", - }, - until: { - type: 'string', - description: - "Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD).", - }, - mentions: { - type: 'string', - format: 'at-identifier', - description: - 'Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions.', - }, - author: { - type: 'string', - format: 'at-identifier', - description: - 'Filter to posts by the given account. Handles are resolved to DID before query-time.', - }, - lang: { - type: 'string', - format: 'language', - description: - 'Filter to posts in the given language. Expected to be based on post language field, though server may override language detection.', - }, - domain: { - type: 'string', - description: - 'Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization.', - }, - url: { - type: 'string', - format: 'uri', - description: - 'Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching.', - }, - tag: { - type: 'array', - items: { - type: 'string', - maxLength: 640, - maxGraphemes: 64, - }, - description: - "Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching.", - }, - viewer: { - type: 'string', - format: 'did', - description: - "DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries.", - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 25, - }, - cursor: { - type: 'string', - description: - 'Optional pagination mechanism; may not necessarily allow scrolling through entire result set.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['posts'], - properties: { - cursor: { - type: 'string', - }, - hitsTotal: { - type: 'integer', - description: - 'Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.', - }, - posts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#skeletonSearchPost', - }, - }, - }, - }, - }, - errors: [ - { - name: 'BadQueryString', - }, - ], - }, - }, - }, - AppBskyUnspeccedSearchStarterPacksSkeleton: { - lexicon: 1, - id: 'app.bsky.unspecced.searchStarterPacksSkeleton', - defs: { - main: { - type: 'query', - description: 'Backend Starter Pack search, returns only skeleton.', - parameters: { - type: 'params', - required: ['q'], - properties: { - q: { - type: 'string', - description: - 'Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended.', - }, - viewer: { - type: 'string', - format: 'did', - description: - 'DID of the account making the request (not included for public/unauthenticated queries).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 25, - }, - cursor: { - type: 'string', - description: - 'Optional pagination mechanism; may not necessarily allow scrolling through entire result set.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['starterPacks'], - properties: { - cursor: { - type: 'string', - }, - hitsTotal: { - type: 'integer', - description: - 'Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits.', - }, - starterPacks: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:app.bsky.unspecced.defs#skeletonSearchStarterPack', - }, - }, - }, - }, - }, - errors: [ - { - name: 'BadQueryString', - }, - ], - }, - }, - }, - AppBskyVideoDefs: { - lexicon: 1, - id: 'app.bsky.video.defs', - defs: { - jobStatus: { - type: 'object', - required: ['jobId', 'did', 'state'], - properties: { - jobId: { - type: 'string', - }, - did: { - type: 'string', - format: 'did', - }, - state: { - type: 'string', - description: - 'The state of the video processing job. All values not listed as a known value indicate that the job is in process.', - knownValues: ['JOB_STATE_COMPLETED', 'JOB_STATE_FAILED'], - }, - progress: { - type: 'integer', - minimum: 0, - maximum: 100, - description: 'Progress within the current processing state.', - }, - blob: { - type: 'blob', - }, - error: { - type: 'string', - }, - message: { - type: 'string', - }, - }, - }, - }, - }, - AppBskyVideoGetJobStatus: { - lexicon: 1, - id: 'app.bsky.video.getJobStatus', - defs: { - main: { - type: 'query', - description: 'Get status details for a video processing job.', - parameters: { - type: 'params', - required: ['jobId'], - properties: { - jobId: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['jobStatus'], - properties: { - jobStatus: { - type: 'ref', - ref: 'lex:app.bsky.video.defs#jobStatus', - }, - }, - }, - }, - }, - }, - }, - AppBskyVideoGetUploadLimits: { - lexicon: 1, - id: 'app.bsky.video.getUploadLimits', - defs: { - main: { - type: 'query', - description: 'Get video upload limits for the authenticated user.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['canUpload'], - properties: { - canUpload: { - type: 'boolean', - }, - remainingDailyVideos: { - type: 'integer', - }, - remainingDailyBytes: { - type: 'integer', - }, - message: { - type: 'string', - }, - error: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - AppBskyVideoUploadVideo: { - lexicon: 1, - id: 'app.bsky.video.uploadVideo', - defs: { - main: { - type: 'procedure', - description: 'Upload a video to be processed then stored on the PDS.', - input: { - encoding: 'video/mp4', - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['jobStatus'], - properties: { - jobStatus: { - type: 'ref', - ref: 'lex:app.bsky.video.defs#jobStatus', - }, - }, - }, - }, - }, - }, - }, - ChatBskyActorDeclaration: { - lexicon: 1, - id: 'chat.bsky.actor.declaration', - defs: { - main: { - type: 'record', - description: 'A declaration of a Bluesky chat account.', - key: 'literal:self', - record: { - type: 'object', - required: ['allowIncoming'], - properties: { - allowIncoming: { - type: 'string', - knownValues: ['all', 'none', 'following'], - }, - allowGroupInvites: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Declaration about group chat invitation preferences for the record owner.', - type: 'string', - knownValues: ['all', 'none', 'following'], - }, - }, - }, - }, - }, - }, - ChatBskyActorDefs: { - lexicon: 1, - id: 'chat.bsky.actor.defs', - defs: { - memberRole: { - type: 'string', - knownValues: ['owner', 'standard'], - }, - profileViewBasic: { - type: 'object', - required: ['did', 'handle'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - displayName: { - type: 'string', - maxGraphemes: 64, - maxLength: 640, - }, - avatar: { - type: 'string', - format: 'uri', - }, - associated: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileAssociated', - }, - viewer: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#viewerState', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - chatDisabled: { - type: 'boolean', - description: - 'Set to true when the actor cannot actively participate in conversations', - }, - verification: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#verificationState', - }, - kind: { - description: - 'Union field that has data specific to different kinds of convos.', - type: 'union', - refs: [ - 'lex:chat.bsky.actor.defs#directConvoMember', - 'lex:chat.bsky.actor.defs#groupConvoMember', - 'lex:chat.bsky.actor.defs#pastGroupConvoMember', - ], - }, - }, - }, - directConvoMember: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', - type: 'object', - properties: {}, - }, - groupConvoMember: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member.', - type: 'object', - required: ['role'], - properties: { - addedBy: { - description: - 'Who added this member. Only present if the member was added (instead of joining via link).', - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - role: { - description: - "The member's role within this conversation. Only present in group conversation member lists.", - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#memberRole', - }, - }, - }, - pastGroupConvoMember: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member.', - type: 'object', - required: [], - properties: {}, - }, - }, - }, - ChatBskyActorDeleteAccount: { - lexicon: 1, - id: 'chat.bsky.actor.deleteAccount', - defs: { - main: { - type: 'procedure', - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - }, - }, - }, - ChatBskyActorExportAccountData: { - lexicon: 1, - id: 'chat.bsky.actor.exportAccountData', - defs: { - main: { - type: 'query', - output: { - encoding: 'application/jsonl', - }, - }, - }, - }, - ChatBskyConvoAcceptConvo: { - lexicon: 1, - id: 'chat.bsky.convo.acceptConvo', - defs: { - main: { - type: 'procedure', - description: - 'Marks a conversation as accepted, so it is shown in the list of accepted convos instead on the request convos.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - rev: { - description: - 'Rev when the convo was accepted. If not present, the convo was already accepted.', - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoAddReaction: { - lexicon: 1, - id: 'chat.bsky.convo.addReaction', - defs: { - main: { - type: 'procedure', - description: - 'Adds an emoji reaction to a message. Requires authentication. It is idempotent, so multiple calls from the same user with the same emoji result in a single reaction.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'messageId', 'value'], - properties: { - convoId: { - type: 'string', - }, - messageId: { - type: 'string', - }, - value: { - type: 'string', - minLength: 1, - maxLength: 64, - minGraphemes: 1, - maxGraphemes: 1, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['message'], - properties: { - message: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageView', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'ReactionNotAllowed', - description: - 'Indicates that reactions are not allowed on this message, e.g. because it is a system message.', - }, - { - name: 'ReactionMessageDeleted', - description: - 'Indicates that the message has been deleted and reactions can no longer be added/removed.', - }, - { - name: 'ReactionLimitReached', - description: - "Indicates that the message has the maximum number of reactions allowed for a single user, and the requested reaction wasn't yet present. If it was already present, the request will not fail since it is idempotent.", - }, - { - name: 'ReactionInvalidValue', - description: - 'Indicates the value for the reaction is not acceptable. In general, this means it is not an emoji.', - }, - ], - }, - }, - }, - ChatBskyConvoDefs: { - lexicon: 1, - id: 'chat.bsky.convo.defs', - defs: { - convoKind: { - type: 'string', - knownValues: ['direct', 'group'], - }, - convoLockStatus: { - type: 'string', - knownValues: ['unlocked', 'locked', 'locked-permanently'], - }, - convoStatus: { - type: 'string', - knownValues: ['request', 'accepted'], - }, - convoRef: { - type: 'object', - required: ['did', 'convoId'], - properties: { - did: { - type: 'string', - format: 'did', - }, - convoId: { - type: 'string', - }, - }, - }, - messageRef: { - type: 'object', - required: ['did', 'messageId', 'convoId'], - properties: { - did: { - type: 'string', - format: 'did', - }, - convoId: { - type: 'string', - }, - messageId: { - type: 'string', - }, - }, - }, - messageInput: { - type: 'object', - required: ['text'], - properties: { - text: { - type: 'string', - maxLength: 10000, - maxGraphemes: 1000, - }, - facets: { - type: 'array', - description: 'Annotations of text (mentions, URLs, hashtags, etc)', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - embed: { - type: 'union', - refs: ['lex:app.bsky.embed.record'], - }, - }, - }, - messageView: { - type: 'object', - required: ['id', 'rev', 'text', 'sender', 'sentAt'], - properties: { - id: { - type: 'string', - }, - rev: { - type: 'string', - }, - text: { - type: 'string', - maxLength: 10000, - maxGraphemes: 1000, - }, - facets: { - type: 'array', - description: 'Annotations of text (mentions, URLs, hashtags, etc)', - items: { - type: 'ref', - ref: 'lex:app.bsky.richtext.facet', - }, - }, - embed: { - type: 'union', - refs: ['lex:app.bsky.embed.record#view'], - }, - reactions: { - type: 'array', - description: - 'Reactions to this message, in ascending order of creation time.', - items: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#reactionView', - }, - }, - sender: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageViewSender', - }, - sentAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - systemMessageReferredUser: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - systemMessageView: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', - type: 'object', - required: ['id', 'rev', 'sentAt', 'data'], - properties: { - id: { - type: 'string', - }, - rev: { - type: 'string', - }, - sentAt: { - type: 'string', - format: 'datetime', - }, - data: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#systemMessageDataAddMember', - 'lex:chat.bsky.convo.defs#systemMessageDataRemoveMember', - 'lex:chat.bsky.convo.defs#systemMessageDataMemberJoin', - 'lex:chat.bsky.convo.defs#systemMessageDataMemberLeave', - 'lex:chat.bsky.convo.defs#systemMessageDataLockConvo', - 'lex:chat.bsky.convo.defs#systemMessageDataUnlockConvo', - 'lex:chat.bsky.convo.defs#systemMessageDataLockConvoPermanently', - 'lex:chat.bsky.convo.defs#systemMessageDataEditGroup', - 'lex:chat.bsky.convo.defs#systemMessageDataCreateJoinLink', - 'lex:chat.bsky.convo.defs#systemMessageDataEditJoinLink', - 'lex:chat.bsky.convo.defs#systemMessageDataEnableJoinLink', - 'lex:chat.bsky.convo.defs#systemMessageDataDisableJoinLink', - ], - }, - }, - }, - systemMessageDataAddMember: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was added to the group convo.', - type: 'object', - required: ['member', 'role', 'addedBy'], - properties: { - member: { - description: 'Current view of the member who was added.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - role: { - description: - "Role the user was added to the group with. The role from 'member' will reflect the current data, not historical.", - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#memberRole', - }, - addedBy: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataRemoveMember: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was removed from the group convo.', - type: 'object', - required: ['member', 'removedBy'], - properties: { - member: { - description: 'Current view of the member who was removed.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - removedBy: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataMemberJoin: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user joined the group convo via join link.', - type: 'object', - required: ['member', 'role'], - properties: { - member: { - description: 'Current view of the member who joined.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - role: { - description: - "Role the user was added to the group with. The role from 'member' will reflect the current data, not historical.", - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#memberRole', - }, - approvedBy: { - description: - 'If join link was configured to require approval, this will be set to who approved the request. Undefined if approval was not required.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataMemberLeave: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user voluntarily left the group convo.', - type: 'object', - required: ['member'], - properties: { - member: { - description: 'Current view of the member who left the group.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataLockConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked.', - type: 'object', - required: ['lockedBy'], - properties: { - lockedBy: { - description: 'Current view of the member who locked the group.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataUnlockConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was unlocked.', - type: 'object', - required: ['unlockedBy'], - properties: { - unlockedBy: { - description: 'Current view of the member who unlocked the group.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataLockConvoPermanently: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked permanently.', - type: 'object', - required: ['lockedBy'], - properties: { - lockedBy: { - description: 'Current view of the member who locked the group.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageReferredUser', - }, - }, - }, - systemMessageDataEditGroup: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group info was edited.', - type: 'object', - properties: { - oldName: { - description: 'Group name that was replaced.', - type: 'string', - }, - newName: { - description: 'Group name that replaced the old.', - type: 'string', - }, - }, - }, - systemMessageDataCreateJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was created.', - type: 'object', - properties: {}, - }, - systemMessageDataEditJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was edited.', - type: 'object', - properties: {}, - }, - systemMessageDataEnableJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was enabled.', - type: 'object', - properties: {}, - }, - systemMessageDataDisableJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was disabled.', - type: 'object', - properties: {}, - }, - deletedMessageView: { - type: 'object', - required: ['id', 'rev', 'sender', 'sentAt'], - properties: { - id: { - type: 'string', - }, - rev: { - type: 'string', - }, - sender: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageViewSender', - }, - sentAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - messageViewSender: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - reactionView: { - type: 'object', - required: ['value', 'sender', 'createdAt'], - properties: { - value: { - type: 'string', - }, - sender: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#reactionViewSender', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - reactionViewSender: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - messageAndReactionView: { - type: 'object', - required: ['message', 'reaction'], - properties: { - message: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageView', - }, - reaction: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#reactionView', - }, - }, - }, - convoView: { - type: 'object', - required: ['id', 'rev', 'members', 'muted', 'unreadCount'], - properties: { - id: { - type: 'string', - }, - rev: { - type: 'string', - }, - members: { - description: - 'Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - lastMessage: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - 'lex:chat.bsky.convo.defs#systemMessageView', - ], - }, - lastReaction: { - type: 'union', - refs: ['lex:chat.bsky.convo.defs#messageAndReactionView'], - }, - muted: { - type: 'boolean', - }, - status: { - description: - 'Convo status for the viewer member (not the convo itself).', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoStatus', - }, - unreadCount: { - type: 'integer', - }, - kind: { - description: - 'Union field that has data specific to different kinds of convos.', - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#directConvo', - 'lex:chat.bsky.convo.defs#groupConvo', - ], - }, - }, - }, - directConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', - type: 'object', - properties: {}, - }, - groupConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', - type: 'object', - required: ['name', 'lockStatus', 'memberCount', 'createdAt'], - properties: { - name: { - type: 'string', - description: 'The display name of the group conversation.', - maxGraphemes: 128, - maxLength: 1280, - }, - memberCount: { - type: 'integer', - description: - 'The total number of members in the group conversation.', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - joinLink: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinLinkView', - }, - lockStatus: { - description: 'The lock status of the conversation.', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoLockStatus', - }, - }, - }, - logBeginConvo: { - description: - 'Event indicating a convo containing the viewer was started. Can be direct or group. When a member is added to a group convo, they also get this event.', - type: 'object', - required: ['rev', 'convoId'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - }, - }, - logAcceptConvo: { - description: - 'Event indicating the viewer accepted a convo, and it can be moved out of the request inbox. Can be direct or group.', - type: 'object', - required: ['rev', 'convoId'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - }, - }, - logLeaveConvo: { - description: - 'Event indicating the viewer left a convo. Can be direct or group.', - type: 'object', - required: ['rev', 'convoId'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - }, - }, - logMuteConvo: { - description: - 'Event indicating the viewer muted a convo. Can be direct or group.', - type: 'object', - required: ['rev', 'convoId'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - }, - }, - logUnmuteConvo: { - description: - 'Event indicating the viewer unmuted a convo. Can be direct or group.', - type: 'object', - required: ['rev', 'convoId'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - }, - }, - logCreateMessage: { - description: - 'Event indicating a user-originated message was created. Is not emitted for system messages.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - ], - }, - relatedProfiles: { - description: - "Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present.", - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logDeleteMessage: { - description: - 'Event indicating a user-originated message was deleted. Is not emitted for system messages.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - ], - }, - }, - }, - logReadMessage: { - description: - 'DEPRECATED: use logReadConvo instead. Event indicating a convo was read up to a certain message.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - 'lex:chat.bsky.convo.defs#systemMessageView', - ], - }, - }, - }, - logAddReaction: { - description: 'Event indicating a reaction was added to a message.', - type: 'object', - required: ['rev', 'convoId', 'message', 'reaction'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - ], - }, - reaction: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#reactionView', - }, - relatedProfiles: { - description: - "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logRemoveReaction: { - description: 'Event indicating a reaction was removed from a message.', - type: 'object', - required: ['rev', 'convoId', 'message', 'reaction'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - ], - }, - reaction: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#reactionView', - }, - relatedProfiles: { - description: - "Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present.", - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logReadConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a convo was read up to a certain message.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - 'lex:chat.bsky.convo.defs#systemMessageView', - ], - }, - }, - }, - logAddMember: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was added to a group convo. The member who was added gets a logBeginConvo (to create the convo) but also a logAddMember (to show the system message as the first message the user sees).', - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataAddMember', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logRemoveMember: { - description: - "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was removed from a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logRemoveMember (because they already left, so can't see the system message).", - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataRemoveMember', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logMemberJoin: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member joined a group convo via join link. The member who was added gets a logBeginConvo (to create the convo) but also a logMemberJoin (to show the system message as the first message the user sees).', - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataMemberJoin', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logMemberLeave: { - description: - "[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member voluntarily left a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logMemberLeave (because they already left, so can't see the system message).", - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataMemberLeave', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logLockConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked.', - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataLockConvo', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logUnlockConvo: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was unlocked.', - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataUnlockConvo', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logLockConvoPermanently: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked permanently.', - type: 'object', - required: ['rev', 'convoId', 'message', 'relatedProfiles'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataLockConvoPermanently', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - relatedProfiles: { - description: 'Profiles referred in the system message.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - logEditGroup: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating info about group convo was edited.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataEditGroup', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - }, - }, - logCreateJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join link was created for a group convo.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataCreateJoinLink', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - }, - }, - logEditJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a settings about a join link for a group convo were edited.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataEditJoinLink', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - }, - }, - logEnableJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join link was enabled for a group convo.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataEnableJoinLink', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - }, - }, - logDisableJoinLink: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join link was disabled for a group convo.', - type: 'object', - required: ['rev', 'convoId', 'message'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - message: { - description: - 'A system message with data of type #systemMessageDataDisableJoinLink', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#systemMessageView', - }, - }, - }, - logIncomingJoinRequest: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was made to a group the viewer owns. Only the owner gets this.', - type: 'object', - required: ['rev', 'convoId', 'member'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - member: { - description: 'Prospective member who requested to join.', - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - logApproveJoinRequest: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was approved by the viewer. Only the owner gets this. The approved member gets a logBeginConvo.', - type: 'object', - required: ['rev', 'convoId', 'member'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - member: { - description: 'Prospective member who requested to join.', - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - logRejectJoinRequest: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was rejected by the viewer. Only the owner gets this.', - type: 'object', - required: ['rev', 'convoId', 'member'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - member: { - description: 'Prospective member who requested to join.', - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - logOutgoingJoinRequest: { - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was made by the viewer.', - type: 'object', - required: ['rev', 'convoId'], - properties: { - rev: { - type: 'string', - }, - convoId: { - type: 'string', - }, - }, - }, - }, - }, - ChatBskyConvoDeleteMessageForSelf: { - lexicon: 1, - id: 'chat.bsky.convo.deleteMessageForSelf', - defs: { - main: { - type: 'procedure', - description: - "Marks a message as deleted for the viewer, so they won't see that message in future enumerations.", - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'MessageDeleteNotAllowed', - description: - 'Indicates that this message cannot be deleted, e.g. because it is a system message.', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'messageId'], - properties: { - convoId: { - type: 'string', - }, - messageId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#deletedMessageView', - }, - }, - }, - }, - }, - ChatBskyConvoGetConvo: { - lexicon: 1, - id: 'chat.bsky.convo.getConvo', - defs: { - main: { - type: 'query', - description: 'Gets an existing conversation by its ID.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - parameters: { - type: 'params', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoGetConvoAvailability: { - lexicon: 1, - id: 'chat.bsky.convo.getConvoAvailability', - defs: { - main: { - type: 'query', - description: - "Check whether the requester and the other members can start a 1-1 chat. Only applicable to direct (non-group) conversations. If an existing convo is found for these members, it is returned. Does not create a new convo if it doesn't exist.", - parameters: { - type: 'params', - required: ['members'], - properties: { - members: { - type: 'array', - minLength: 1, - maxLength: 10, - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['canChat'], - properties: { - canChat: { - type: 'boolean', - }, - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoGetConvoForMembers: { - lexicon: 1, - id: 'chat.bsky.convo.getConvoForMembers', - defs: { - main: { - type: 'query', - description: - 'Get or create a 1-1 conversation for the given members. Always returns the same direct (non-group) conversation. To create a group conversation, use createGroup.', - errors: [ - { - name: 'AccountSuspended', - }, - { - name: 'BlockedActor', - }, - { - name: 'MessagesDisabled', - }, - { - name: 'NotFollowedBySender', - }, - { - name: 'RecipientNotFound', - }, - ], - parameters: { - type: 'params', - required: ['members'], - properties: { - members: { - type: 'array', - minLength: 1, - maxLength: 10, - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoGetConvoMembers: { - lexicon: 1, - id: 'chat.bsky.convo.getConvoMembers', - defs: { - main: { - type: 'query', - description: 'Returns a paginated list of members from a conversation.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - parameters: { - type: 'params', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['members'], - properties: { - cursor: { - type: 'string', - }, - members: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoGetLog: { - lexicon: 1, - id: 'chat.bsky.convo.getLog', - defs: { - main: { - type: 'query', - parameters: { - type: 'params', - required: [], - properties: { - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['logs'], - properties: { - cursor: { - type: 'string', - }, - logs: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#logBeginConvo', - 'lex:chat.bsky.convo.defs#logAcceptConvo', - 'lex:chat.bsky.convo.defs#logLeaveConvo', - 'lex:chat.bsky.convo.defs#logMuteConvo', - 'lex:chat.bsky.convo.defs#logUnmuteConvo', - 'lex:chat.bsky.convo.defs#logCreateMessage', - 'lex:chat.bsky.convo.defs#logDeleteMessage', - 'lex:chat.bsky.convo.defs#logReadMessage', - 'lex:chat.bsky.convo.defs#logAddReaction', - 'lex:chat.bsky.convo.defs#logRemoveReaction', - 'lex:chat.bsky.convo.defs#logReadConvo', - 'lex:chat.bsky.convo.defs#logAddMember', - 'lex:chat.bsky.convo.defs#logRemoveMember', - 'lex:chat.bsky.convo.defs#logMemberJoin', - 'lex:chat.bsky.convo.defs#logMemberLeave', - 'lex:chat.bsky.convo.defs#logLockConvo', - 'lex:chat.bsky.convo.defs#logUnlockConvo', - 'lex:chat.bsky.convo.defs#logLockConvoPermanently', - 'lex:chat.bsky.convo.defs#logEditGroup', - 'lex:chat.bsky.convo.defs#logCreateJoinLink', - 'lex:chat.bsky.convo.defs#logEditJoinLink', - 'lex:chat.bsky.convo.defs#logEnableJoinLink', - 'lex:chat.bsky.convo.defs#logDisableJoinLink', - 'lex:chat.bsky.convo.defs#logIncomingJoinRequest', - 'lex:chat.bsky.convo.defs#logApproveJoinRequest', - 'lex:chat.bsky.convo.defs#logRejectJoinRequest', - 'lex:chat.bsky.convo.defs#logOutgoingJoinRequest', - ], - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoGetMessages: { - lexicon: 1, - id: 'chat.bsky.convo.getMessages', - defs: { - main: { - type: 'query', - description: 'Returns a page of messages from a conversation.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - parameters: { - type: 'params', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['messages'], - properties: { - cursor: { - type: 'string', - }, - messages: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#deletedMessageView', - 'lex:chat.bsky.convo.defs#systemMessageView', - ], - }, - }, - relatedProfiles: { - description: - 'Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included.', - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoLeaveConvo: { - lexicon: 1, - id: 'chat.bsky.convo.leaveConvo', - defs: { - main: { - type: 'procedure', - description: - 'Leaves a conversation (direct or group). For group, this effectively removes membership. For direct, membership is never removed, only changed to remove from enumerations by the user who left.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'OwnerCannotLeave', - description: - 'The owner of a group conversation cannot leave before locking the group.', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'rev'], - properties: { - convoId: { - type: 'string', - }, - rev: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoListConvoRequests: { - lexicon: 1, - id: 'chat.bsky.convo.listConvoRequests', - defs: { - main: { - type: 'query', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Returns a page of incoming conversation requests for the user. Direct convo requests are returned as convoView; group join requests are returned as joinRequestView.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['requests'], - properties: { - cursor: { - type: 'string', - }, - requests: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#convoView', - 'lex:chat.bsky.group.defs#joinRequestView', - ], - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoListConvos: { - lexicon: 1, - id: 'chat.bsky.convo.listConvos', - defs: { - main: { - type: 'query', - description: - 'Returns a page of conversations (direct or group) for the user.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - readState: { - type: 'string', - knownValues: ['unread'], - }, - status: { - description: - 'Filter convos by their status. It is discouraged to call with "request" and preferred to call chat.bsky.convo.listConvoRequests, which also includes group join requests made by the user.', - type: 'string', - knownValues: ['request', 'accepted'], - }, - kind: { - type: 'string', - description: 'Filter by conversation kind.', - knownValues: ['direct', 'group'], - }, - lockStatus: { - type: 'string', - description: - 'Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus.', - knownValues: ['unlocked', 'locked', 'locked-permanently'], - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convos'], - properties: { - cursor: { - type: 'string', - }, - convos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoLockConvo: { - lexicon: 1, - id: 'chat.bsky.convo.lockConvo', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Locks a group convo so no more content (messages, reactions) can be added to it.', - errors: [ - { - name: 'ConvoLocked', - }, - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoMuteConvo: { - lexicon: 1, - id: 'chat.bsky.convo.muteConvo', - defs: { - main: { - type: 'procedure', - description: - 'Mutes a conversation, preventing notifications related to it.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoRemoveReaction: { - lexicon: 1, - id: 'chat.bsky.convo.removeReaction', - defs: { - main: { - type: 'procedure', - description: - "Removes an emoji reaction from a message. Requires authentication. It is idempotent, so multiple calls from the same user with the same emoji result in that reaction not being present, even if it already wasn't.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'messageId', 'value'], - properties: { - convoId: { - type: 'string', - }, - messageId: { - type: 'string', - }, - value: { - type: 'string', - minLength: 1, - maxLength: 64, - minGraphemes: 1, - maxGraphemes: 1, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['message'], - properties: { - message: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageView', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'ReactionNotAllowed', - description: - 'Indicates that reactions are not allowed on this message, e.g. because it is a system message.', - }, - { - name: 'ReactionMessageDeleted', - description: - 'Indicates that the message has been deleted and reactions can no longer be added/removed.', - }, - { - name: 'ReactionInvalidValue', - description: - 'Indicates the value for the reaction is not acceptable. In general, this means it is not an emoji.', - }, - ], - }, - }, - }, - ChatBskyConvoSendMessage: { - lexicon: 1, - id: 'chat.bsky.convo.sendMessage', - defs: { - main: { - type: 'procedure', - description: 'Sends a message to a conversation.', - errors: [ - { - name: 'ConvoLocked', - }, - { - name: 'InvalidConvo', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'message'], - properties: { - convoId: { - type: 'string', - }, - message: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageInput', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageView', - }, - }, - }, - }, - }, - ChatBskyConvoSendMessageBatch: { - lexicon: 1, - id: 'chat.bsky.convo.sendMessageBatch', - defs: { - main: { - type: 'procedure', - description: 'Sends a batch of messages to a conversation.', - errors: [ - { - name: 'ConvoLocked', - }, - { - name: 'InvalidConvo', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['items'], - properties: { - items: { - type: 'array', - maxLength: 100, - items: { - type: 'ref', - ref: 'lex:chat.bsky.convo.sendMessageBatch#batchItem', - }, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['items'], - properties: { - items: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageView', - }, - }, - }, - }, - }, - }, - batchItem: { - type: 'object', - required: ['convoId', 'message'], - properties: { - convoId: { - type: 'string', - }, - message: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#messageInput', - }, - }, - }, - }, - }, - ChatBskyConvoUnlockConvo: { - lexicon: 1, - id: 'chat.bsky.convo.unlockConvo', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Unlocks a group convo so it is able to receive new content.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoUnmuteConvo: { - lexicon: 1, - id: 'chat.bsky.convo.unmuteConvo', - defs: { - main: { - type: 'procedure', - description: - 'Unmutes a conversation, allowing notifications related to it.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoUpdateAllRead: { - lexicon: 1, - id: 'chat.bsky.convo.updateAllRead', - defs: { - main: { - type: 'procedure', - description: - 'Sets conversations from a user as read to the latest message, with filters.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - status: { - type: 'string', - knownValues: ['request', 'accepted'], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['updatedCount'], - properties: { - updatedCount: { - description: 'The count of updated convos.', - type: 'integer', - }, - }, - }, - }, - }, - }, - }, - ChatBskyConvoUpdateRead: { - lexicon: 1, - id: 'chat.bsky.convo.updateRead', - defs: { - main: { - type: 'procedure', - description: - 'Updates the read state of a conversation from, optionally specifying the last read message.', - errors: [ - { - name: 'InvalidConvo', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - messageId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupAddMembers: { - lexicon: 1, - id: 'chat.bsky.group.addMembers', - defs: { - main: { - type: 'procedure', - description: - "[NOTE: This is under active development and should be considered unstable while this note is here]. Adds members to a group. The members are added in 'request' status, so they have to accept it. This creates convo memberships.", - errors: [ - { - name: 'AccountSuspended', - }, - { - name: 'BlockedActor', - }, - { - name: 'UserForbidsGroups', - }, - { - name: 'ConvoLocked', - }, - { - name: 'InsufficientRole', - }, - { - name: 'InvalidConvo', - }, - { - name: 'MemberLimitReached', - }, - { - name: 'NotFollowedBySender', - }, - { - name: 'RecipientNotFound', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'members'], - properties: { - convoId: { - type: 'string', - }, - members: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - minLength: 1, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - addedMembers: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupApproveJoinRequest: { - lexicon: 1, - id: 'chat.bsky.group.approveJoinRequest', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Approves a request to join a group (via join link) the user owns. Action taken by the group owner.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - { - name: 'MemberLimitReached', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'member'], - properties: { - convoId: { - type: 'string', - }, - member: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupCreateGroup: { - lexicon: 1, - id: 'chat.bsky.group.createGroup', - defs: { - main: { - type: 'procedure', - description: - "[NOTE: This is under active development and should be considered unstable while this note is here]. Creates a group convo, specifying the members to be added to it. Unlike getConvoForMembers, this isn't idempotent. It will create new groups even if the membership is identical to pre-existing groups. Will create 'pending' membership for all members, except the owner who is 'accepted'.", - errors: [ - { - name: 'AccountSuspended', - }, - { - name: 'BlockedActor', - }, - { - name: 'UserForbidsGroups', - }, - { - name: 'NotFollowedBySender', - }, - { - name: 'RecipientNotFound', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['members', 'name'], - properties: { - members: { - type: 'array', - maxLength: 49, - items: { - type: 'string', - format: 'did', - }, - }, - name: { - type: 'string', - minLength: 1, - maxGraphemes: 128, - maxLength: 1280, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupCreateJoinLink: { - lexicon: 1, - id: 'chat.bsky.group.createJoinLink', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Creates a join link for the group convo.', - errors: [ - { - name: 'EnabledJoinLinkAlreadyExists', - }, - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'joinRule'], - properties: { - convoId: { - type: 'string', - }, - requireApproval: { - type: 'boolean', - default: false, - }, - joinRule: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinRule', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['joinLink'], - properties: { - joinLink: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinLinkView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupDefs: { - lexicon: 1, - id: 'chat.bsky.group.defs', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here].', - defs: { - linkEnabledStatus: { - type: 'string', - knownValues: ['enabled', 'disabled'], - }, - joinRule: { - type: 'string', - knownValues: ['anyone', 'followedByOwner'], - }, - joinLinkView: { - type: 'object', - required: [ - 'code', - 'enabledStatus', - 'requireApproval', - 'joinRule', - 'createdAt', - ], - properties: { - code: { - type: 'string', - }, - enabledStatus: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#linkEnabledStatus', - }, - requireApproval: { - type: 'boolean', - }, - joinRule: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinRule', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - joinLinkPreviewView: { - type: 'object', - required: ['name', 'owner', 'memberCount', 'requireApproval'], - properties: { - name: { - type: 'string', - }, - owner: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - memberCount: { - type: 'integer', - }, - requireApproval: { - type: 'boolean', - }, - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - description: - 'Present only if the request is authenticated and the user is a member of the group.', - }, - }, - }, - joinRequestView: { - type: 'object', - required: ['convoId', 'requestedBy', 'requestedAt'], - properties: { - convoId: { - type: 'string', - }, - requestedBy: { - type: 'ref', - ref: 'lex:chat.bsky.actor.defs#profileViewBasic', - }, - requestedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - ChatBskyGroupDisableJoinLink: { - lexicon: 1, - id: 'chat.bsky.group.disableJoinLink', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Disables the active join link for the group convo.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - { - name: 'NoJoinLink', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['joinLink'], - properties: { - joinLink: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinLinkView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupEditGroup: { - lexicon: 1, - id: 'chat.bsky.group.editGroup', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Edits group settings.', - errors: [ - { - name: 'ConvoLocked', - }, - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'name'], - properties: { - convoId: { - type: 'string', - }, - name: { - type: 'string', - minLength: 1, - maxGraphemes: 128, - maxLength: 1280, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupEditJoinLink: { - lexicon: 1, - id: 'chat.bsky.group.editJoinLink', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Edits the existing join link settings for the group convo.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - { - name: 'NoJoinLink', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - requireApproval: { - type: 'boolean', - }, - joinRule: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinRule', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['joinLink'], - properties: { - joinLink: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinLinkView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupEnableJoinLink: { - lexicon: 1, - id: 'chat.bsky.group.enableJoinLink', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Re-enables a previously disabled join link for the group convo.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - { - name: 'NoJoinLink', - }, - { - name: 'LinkAlreadyEnabled', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['joinLink'], - properties: { - joinLink: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinLinkView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupGetJoinLinkPreview: { - lexicon: 1, - id: 'chat.bsky.group.getJoinLinkPreview', - defs: { - main: { - type: 'query', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Get public information about a group from an join link.', - errors: [ - { - name: 'InvalidCode', - }, - ], - parameters: { - type: 'params', - required: ['code'], - properties: { - code: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['joinLinkPreview'], - properties: { - joinLinkPreview: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinLinkPreviewView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupListJoinRequests: { - lexicon: 1, - id: 'chat.bsky.group.listJoinRequests', - defs: { - main: { - type: 'query', - description: - "[NOTE: This is under active development and should be considered unstable while this note is here]. Lists a page of request to join a group (via join link) the user owns. Shows the data from the owner's point of view.", - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - parameters: { - type: 'params', - required: ['convoId'], - properties: { - convoId: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['requests'], - properties: { - cursor: { - type: 'string', - }, - requests: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.group.defs#joinRequestView', - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupListMutualGroups: { - lexicon: 1, - id: 'chat.bsky.group.listMutualGroups', - defs: { - main: { - type: 'query', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Returns a page of group conversations that both the requester and the specified actor are members of.', - parameters: { - type: 'params', - required: ['subject'], - properties: { - subject: { - type: 'string', - format: 'did', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convos'], - properties: { - cursor: { - type: 'string', - }, - convos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupRejectJoinRequest: { - lexicon: 1, - id: 'chat.bsky.group.rejectJoinRequest', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Rejects a request to join a group (via join link) the user owns. Action taken by the group owner.', - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'member'], - properties: { - convoId: { - type: 'string', - }, - member: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: [], - properties: {}, - }, - }, - }, - }, - }, - ChatBskyGroupRemoveMembers: { - lexicon: 1, - id: 'chat.bsky.group.removeMembers', - defs: { - main: { - type: 'procedure', - description: - "[NOTE: This is under active development and should be considered unstable while this note is here]. Removes members from a group. This deletes convo memberships, doesn't just set a status.", - errors: [ - { - name: 'InvalidConvo', - }, - { - name: 'InsufficientRole', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convoId', 'members'], - properties: { - convoId: { - type: 'string', - }, - members: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - minLength: 1, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['convo'], - properties: { - convo: { - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyGroupRequestJoin: { - lexicon: 1, - id: 'chat.bsky.group.requestJoin', - defs: { - main: { - type: 'procedure', - description: - '[NOTE: This is under active development and should be considered unstable while this note is here]. Sends a request to join a group (via join link) to the group owner. Action taken by the prospective group member.', - errors: [ - { - name: 'ConvoLocked', - }, - { - name: 'FollowRequired', - }, - { - name: 'InvalidCode', - }, - { - name: 'LinkDisabled', - }, - { - name: 'MemberLimitReached', - }, - { - name: 'UserKicked', - }, - ], - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['code'], - properties: { - code: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['status'], - properties: { - status: { - type: 'string', - knownValues: ['joined', 'pending'], - }, - convo: { - description: - 'The group convo joined. This is only present in the case of status=joined', - type: 'ref', - ref: 'lex:chat.bsky.convo.defs#convoView', - }, - }, - }, - }, - }, - }, - }, - ChatBskyModerationGetActorMetadata: { - lexicon: 1, - id: 'chat.bsky.moderation.getActorMetadata', - defs: { - main: { - type: 'query', - parameters: { - type: 'params', - required: ['actor'], - properties: { - actor: { - type: 'string', - format: 'did', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['day', 'month', 'all'], - properties: { - day: { - type: 'ref', - ref: 'lex:chat.bsky.moderation.getActorMetadata#metadata', - }, - month: { - type: 'ref', - ref: 'lex:chat.bsky.moderation.getActorMetadata#metadata', - }, - all: { - type: 'ref', - ref: 'lex:chat.bsky.moderation.getActorMetadata#metadata', - }, - }, - }, - }, - }, - metadata: { - type: 'object', - required: [ - 'messagesSent', - 'messagesReceived', - 'convos', - 'convosStarted', - ], - properties: { - messagesSent: { - type: 'integer', - }, - messagesReceived: { - type: 'integer', - }, - convos: { - type: 'integer', - }, - convosStarted: { - type: 'integer', - }, - }, - }, - }, - }, - ChatBskyModerationGetMessageContext: { - lexicon: 1, - id: 'chat.bsky.moderation.getMessageContext', - defs: { - main: { - type: 'query', - parameters: { - type: 'params', - required: ['messageId'], - properties: { - convoId: { - type: 'string', - description: - 'Conversation that the message is from. NOTE: this field will eventually be required.', - }, - messageId: { - type: 'string', - }, - before: { - type: 'integer', - default: 5, - description: - 'Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead.', - }, - after: { - type: 'integer', - default: 5, - description: - 'Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead.', - }, - maxInterleavedSystemMessages: { - type: 'integer', - default: 10, - minimum: 0, - maximum: 1000, - description: - 'Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['messages'], - properties: { - messages: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:chat.bsky.convo.defs#messageView', - 'lex:chat.bsky.convo.defs#systemMessageView', - ], - }, - }, - }, - }, - }, - }, - }, - }, - ChatBskyModerationSubscribeModEvents: { - lexicon: 1, - id: 'chat.bsky.moderation.subscribeModEvents', - defs: { - main: { - type: 'subscription', - description: - 'Subscribe to stream of chat events targeted to moderation. Private endpoint.', - parameters: { - type: 'params', - properties: { - cursor: { - type: 'string', - description: - "The last known event seq number to backfill from. Use '2222222222222' to backfill from the beginning. Don't specify a cursor to listen only for new events.", - }, - }, - }, - message: { - schema: { - type: 'union', - refs: [ - 'lex:chat.bsky.moderation.subscribeModEvents#eventConvoFirstMessage', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatCreated', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberAdded', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberJoined', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequest', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestApproved', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestRejected', - 'lex:chat.bsky.moderation.subscribeModEvents#eventChatAccepted', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberLeft', - 'lex:chat.bsky.moderation.subscribeModEvents#eventGroupChatUpdated', - ], - }, - }, - errors: [ - { - name: 'FutureCursor', - }, - { - name: 'ConsumerTooSlow', - description: - 'If the consumer of the stream can not keep up with events, and a backlog gets too large, the server will drop the connection.', - }, - ], - }, - eventConvoFirstMessage: { - type: 'object', - description: 'Fired when the first message was sent on a convo.', - required: ['createdAt', 'rev', 'convoId', 'user', 'recipients'], - properties: { - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - messageId: { - type: 'string', - }, - recipients: { - description: - 'The list of DIDs message recipients. Does not include the sender, which is in the `user` field', - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - rev: { - type: 'string', - }, - user: { - description: 'The DID of the message author.', - type: 'string', - format: 'did', - }, - }, - }, - eventGroupChatCreated: { - type: 'object', - description: 'Fire when a group chat is created.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'initialMemberDids', - 'ownerDid', - 'rev', - ], - properties: { - actorDid: { - description: - 'The DID of the actor performing the action. For this event, same as ownerDid.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - description: 'The name set at creation time.', - type: 'string', - }, - initialMemberDids: { - description: 'DIDs of everyone added at creation time.', - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - }, - }, - eventGroupChatMemberAdded: { - type: 'object', - description: - "Fired when a member is added to a group chat. Note that members are added in the 'request' state.", - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'ownerDid', - 'requestMembersCount', - 'rev', - 'subjectDid', - 'subjectFollowsOwner', - ], - properties: { - actorDid: { - description: - 'The DID of the actor performing the action. For this event, same as ownerDid.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - type: 'string', - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - requestMembersCount: { - description: - 'The number of members who have not yet accepted the convo.', - type: 'integer', - }, - rev: { - type: 'string', - }, - subjectDid: { - description: 'The DID of the member who was added.', - type: 'string', - format: 'did', - }, - subjectFollowsOwner: { - description: 'Whether the added member follows the group owner.', - type: 'boolean', - }, - }, - }, - eventGroupChatMemberJoined: { - type: 'object', - description: - 'Fired when a member joins a group chat via an join link that does not require approval.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'joinLinkCode', - 'ownerDid', - 'rev', - 'subjectFollowsOwner', - ], - properties: { - actorDid: { - description: 'The DID of the person joining.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - type: 'string', - }, - joinLinkCode: { - description: 'The code of the join link used to join.', - type: 'string', - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - subjectFollowsOwner: { - description: 'Whether the joining member follows the group owner.', - type: 'boolean', - }, - }, - }, - eventGroupChatJoinRequest: { - type: 'object', - description: - 'Fired when a user requests to join a group chat via an join link that requires approval.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'joinLinkCode', - 'ownerDid', - 'rev', - 'subjectFollowsOwner', - ], - properties: { - actorDid: { - description: 'The DID of the person requesting to join.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - type: 'string', - }, - joinLinkCode: { - description: 'The code of the join link used to request joining.', - type: 'string', - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - subjectFollowsOwner: { - description: - 'Whether the requesting member follows the group owner.', - type: 'boolean', - }, - }, - }, - eventGroupChatJoinRequestApproved: { - type: 'object', - description: - 'Fired when a join request is approved by the group owner.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'ownerDid', - 'rev', - 'subjectDid', - ], - properties: { - actorDid: { - description: 'The DID of the owner approving the request.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - type: 'string', - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - subjectDid: { - description: 'The DID of the member whose request was approved.', - type: 'string', - format: 'did', - }, - }, - }, - eventGroupChatJoinRequestRejected: { - type: 'object', - description: - 'Fired when a join request is rejected by the group owner.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'ownerDid', - 'rev', - 'subjectDid', - ], - properties: { - actorDid: { - description: 'The DID of the owner rejecting the request.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - type: 'string', - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - subjectDid: { - description: 'The DID of the member whose request was rejected.', - type: 'string', - format: 'did', - }, - }, - }, - eventChatAccepted: { - type: 'object', - description: - 'Fired when a user accepts a chat convo, either explicitly or by sending a message.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'method', - 'rev', - ], - properties: { - actorDid: { - description: 'The DID of the person accepting the convo.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the convo was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: - 'Current member count at the time of the event. Only present for group convos.', - type: 'integer', - }, - groupName: { - description: - 'The name of the group chat. Only present for group convos.', - type: 'string', - }, - method: { - description: 'How the convo was accepted.', - type: 'string', - knownValues: ['explicit', 'message'], - }, - ownerDid: { - description: - 'The DID of the group chat owner. Only present for group convos.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - }, - }, - eventGroupChatMemberLeft: { - type: 'object', - description: - 'Fired when a member leaves or is removed from a group chat.', - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'leaveMethod', - 'ownerDid', - 'rev', - 'subjectDid', - ], - properties: { - actorDid: { - description: - 'The DID of the actor. For voluntary: the person leaving. For kicked: the owner.', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - type: 'string', - }, - leaveMethod: { - description: 'How the member left.', - type: 'string', - knownValues: ['voluntary', 'kicked'], - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - subjectDid: { - description: 'The DID of the member who left or was removed.', - type: 'string', - format: 'did', - }, - }, - }, - eventGroupChatUpdated: { - type: 'object', - description: "Fired when a group chat's metadata or status changes.", - required: [ - 'actorDid', - 'convoCreatedAt', - 'convoId', - 'createdAt', - 'groupMemberCount', - 'groupName', - 'ownerDid', - 'rev', - 'updateType', - ], - properties: { - actorDid: { - description: - 'The DID of the actor performing the action (the owner).', - type: 'string', - format: 'did', - }, - convoCreatedAt: { - description: 'When the group was originally created.', - type: 'string', - format: 'datetime', - }, - convoId: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - groupMemberCount: { - description: 'Current member count at the time of the event.', - type: 'integer', - }, - groupName: { - description: 'Current group name.', - type: 'string', - }, - joinLinkCode: { - description: - 'The code of the join link. Only present when updateType is join-link-related.', - type: 'string', - }, - joinLinkFollowersOnly: { - description: - 'Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related.', - type: 'boolean', - }, - joinLinkRequiresApproval: { - description: - 'Whether the join link requires owner approval to join. Only present when updateType is join-link-related.', - type: 'boolean', - }, - lockReason: { - description: - "Why the group was locked. Only present when updateType is 'locked'.", - type: 'string', - knownValues: [ - 'owner_action', - 'owner_left', - 'owner_deactivated', - 'owner_deleted', - 'owner_suspended', - 'owner_taken_down', - 'label_applied', - ], - }, - newName: { - description: - "The new group name. Only present when updateType is 'name_changed'.", - type: 'string', - }, - oldName: { - description: - "The previous group name. Only present when updateType is 'name_changed'.", - type: 'string', - }, - ownerDid: { - description: 'The DID of the group chat owner.', - type: 'string', - format: 'did', - }, - rev: { - type: 'string', - }, - updateType: { - description: 'What changed.', - type: 'string', - knownValues: [ - 'name_changed', - 'locked', - 'locked_permanently', - 'unlocked', - 'join_link_created', - 'join_link_disabled', - 'join_link_settings_changed', - ], - }, - }, - }, - }, - }, - ChatBskyModerationUpdateActorAccess: { - lexicon: 1, - id: 'chat.bsky.moderation.updateActorAccess', - defs: { - main: { - type: 'procedure', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actor', 'allowAccess'], - properties: { - actor: { - type: 'string', - format: 'did', - }, - allowAccess: { - type: 'boolean', - }, - ref: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminDefs: { - lexicon: 1, - id: 'com.atproto.admin.defs', - defs: { - statusAttr: { - type: 'object', - required: ['applied'], - properties: { - applied: { - type: 'boolean', - }, - ref: { - type: 'string', - }, - }, - }, - accountView: { - type: 'object', - required: ['did', 'handle', 'indexedAt'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - email: { - type: 'string', - }, - relatedRecords: { - type: 'array', - items: { - type: 'unknown', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - invitedBy: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - invites: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - }, - invitesDisabled: { - type: 'boolean', - }, - emailConfirmedAt: { - type: 'string', - format: 'datetime', - }, - inviteNote: { - type: 'string', - }, - deactivatedAt: { - type: 'string', - format: 'datetime', - }, - threatSignatures: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#threatSignature', - }, - }, - }, - }, - repoRef: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - repoBlobRef: { - type: 'object', - required: ['did', 'cid'], - properties: { - did: { - type: 'string', - format: 'did', - }, - cid: { - type: 'string', - format: 'cid', - }, - recordUri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - threatSignature: { - type: 'object', - required: ['property', 'value'], - properties: { - property: { - type: 'string', - }, - value: { - type: 'string', - }, - }, - }, - }, - }, - ComAtprotoAdminDeleteAccount: { - lexicon: 1, - id: 'com.atproto.admin.deleteAccount', - defs: { - main: { - type: 'procedure', - description: 'Delete a user account as an administrator.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminDisableAccountInvites: { - lexicon: 1, - id: 'com.atproto.admin.disableAccountInvites', - defs: { - main: { - type: 'procedure', - description: - 'Disable an account from receiving new invite codes, but does not invalidate existing codes.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['account'], - properties: { - account: { - type: 'string', - format: 'did', - }, - note: { - type: 'string', - description: 'Optional reason for disabled invites.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminDisableInviteCodes: { - lexicon: 1, - id: 'com.atproto.admin.disableInviteCodes', - defs: { - main: { - type: 'procedure', - description: - 'Disable some set of codes and/or all codes associated with a set of users.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - codes: { - type: 'array', - items: { - type: 'string', - }, - }, - accounts: { - type: 'array', - items: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminEnableAccountInvites: { - lexicon: 1, - id: 'com.atproto.admin.enableAccountInvites', - defs: { - main: { - type: 'procedure', - description: "Re-enable an account's ability to receive invite codes.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['account'], - properties: { - account: { - type: 'string', - format: 'did', - }, - note: { - type: 'string', - description: 'Optional reason for enabled invites.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminGetAccountInfo: { - lexicon: 1, - id: 'com.atproto.admin.getAccountInfo', - defs: { - main: { - type: 'query', - description: 'Get details about an account.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#accountView', - }, - }, - }, - }, - }, - ComAtprotoAdminGetAccountInfos: { - lexicon: 1, - id: 'com.atproto.admin.getAccountInfos', - defs: { - main: { - type: 'query', - description: 'Get details about some accounts.', - parameters: { - type: 'params', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['infos'], - properties: { - infos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#accountView', - }, - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminGetInviteCodes: { - lexicon: 1, - id: 'com.atproto.admin.getInviteCodes', - defs: { - main: { - type: 'query', - description: 'Get an admin view of invite codes.', - parameters: { - type: 'params', - properties: { - sort: { - type: 'string', - knownValues: ['recent', 'usage'], - default: 'recent', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 500, - default: 100, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['codes'], - properties: { - cursor: { - type: 'string', - }, - codes: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminGetSubjectStatus: { - lexicon: 1, - id: 'com.atproto.admin.getSubjectStatus', - defs: { - main: { - type: 'query', - description: - 'Get the service-specific admin status of a subject (account, record, or blob).', - parameters: { - type: 'params', - properties: { - did: { - type: 'string', - format: 'did', - }, - uri: { - type: 'string', - format: 'at-uri', - }, - blob: { - type: 'string', - format: 'cid', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject'], - properties: { - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - 'lex:com.atproto.admin.defs#repoBlobRef', - ], - }, - takedown: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#statusAttr', - }, - deactivated: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#statusAttr', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminSearchAccounts: { - lexicon: 1, - id: 'com.atproto.admin.searchAccounts', - defs: { - main: { - type: 'query', - description: 'Get list of accounts that matches your search query.', - parameters: { - type: 'params', - properties: { - email: { - type: 'string', - }, - cursor: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['accounts'], - properties: { - cursor: { - type: 'string', - }, - accounts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#accountView', - }, - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminSendEmail: { - lexicon: 1, - id: 'com.atproto.admin.sendEmail', - defs: { - main: { - type: 'procedure', - description: "Send email to a user's account email address.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['recipientDid', 'content', 'senderDid'], - properties: { - recipientDid: { - type: 'string', - format: 'did', - }, - content: { - type: 'string', - }, - subject: { - type: 'string', - }, - senderDid: { - type: 'string', - format: 'did', - }, - comment: { - type: 'string', - description: - "Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers", - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['sent'], - properties: { - sent: { - type: 'boolean', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminUpdateAccountEmail: { - lexicon: 1, - id: 'com.atproto.admin.updateAccountEmail', - defs: { - main: { - type: 'procedure', - description: "Administrative action to update an account's email.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['account', 'email'], - properties: { - account: { - type: 'string', - format: 'at-identifier', - description: 'The handle or DID of the repo.', - }, - email: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminUpdateAccountHandle: { - lexicon: 1, - id: 'com.atproto.admin.updateAccountHandle', - defs: { - main: { - type: 'procedure', - description: "Administrative action to update an account's handle.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'handle'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminUpdateAccountPassword: { - lexicon: 1, - id: 'com.atproto.admin.updateAccountPassword', - defs: { - main: { - type: 'procedure', - description: - 'Update the password for a user account as an administrator.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'password'], - properties: { - did: { - type: 'string', - format: 'did', - }, - password: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminUpdateAccountSigningKey: { - lexicon: 1, - id: 'com.atproto.admin.updateAccountSigningKey', - defs: { - main: { - type: 'procedure', - description: - "Administrative action to update an account's signing key in their Did document.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'signingKey'], - properties: { - did: { - type: 'string', - format: 'did', - }, - signingKey: { - type: 'string', - format: 'did', - description: 'Did-key formatted public key', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoAdminUpdateSubjectStatus: { - lexicon: 1, - id: 'com.atproto.admin.updateSubjectStatus', - defs: { - main: { - type: 'procedure', - description: - 'Update the service-specific admin status of a subject (account, record, or blob).', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject'], - properties: { - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - 'lex:com.atproto.admin.defs#repoBlobRef', - ], - }, - takedown: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#statusAttr', - }, - deactivated: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#statusAttr', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject'], - properties: { - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - 'lex:com.atproto.admin.defs#repoBlobRef', - ], - }, - takedown: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#statusAttr', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoIdentityDefs: { - lexicon: 1, - id: 'com.atproto.identity.defs', - defs: { - identityInfo: { - type: 'object', - required: ['did', 'handle', 'didDoc'], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - description: - "The validated handle of the account; or 'handle.invalid' if the handle did not bi-directionally match the DID document.", - }, - didDoc: { - type: 'unknown', - description: 'The complete DID document for the identity.', - }, - }, - }, - }, - }, - ComAtprotoIdentityGetRecommendedDidCredentials: { - lexicon: 1, - id: 'com.atproto.identity.getRecommendedDidCredentials', - defs: { - main: { - type: 'query', - description: - 'Describe the credentials that should be included in the DID doc of an account that is migrating to this service.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - rotationKeys: { - description: - 'Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs.', - type: 'array', - items: { - type: 'string', - }, - }, - alsoKnownAs: { - type: 'array', - items: { - type: 'string', - }, - }, - verificationMethods: { - type: 'unknown', - }, - services: { - type: 'unknown', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoIdentityRefreshIdentity: { - lexicon: 1, - id: 'com.atproto.identity.refreshIdentity', - defs: { - main: { - type: 'procedure', - description: - 'Request that the server re-resolve an identity (DID and handle). The server may ignore this request, or require authentication, depending on the role, implementation, and policy of the server.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['identifier'], - properties: { - identifier: { - type: 'string', - format: 'at-identifier', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:com.atproto.identity.defs#identityInfo', - }, - }, - errors: [ - { - name: 'HandleNotFound', - description: - 'The resolution process confirmed that the handle does not resolve to any DID.', - }, - { - name: 'DidNotFound', - description: - 'The DID resolution process confirmed that there is no current DID.', - }, - { - name: 'DidDeactivated', - description: - 'The DID previously existed, but has been deactivated.', - }, - ], - }, - }, - }, - ComAtprotoIdentityRequestPlcOperationSignature: { - lexicon: 1, - id: 'com.atproto.identity.requestPlcOperationSignature', - defs: { - main: { - type: 'procedure', - description: - 'Request an email with a code to in order to request a signed PLC operation. Requires Auth.', - }, - }, - }, - ComAtprotoIdentityResolveDid: { - lexicon: 1, - id: 'com.atproto.identity.resolveDid', - defs: { - main: { - type: 'query', - description: - 'Resolves DID to DID document. Does not bi-directionally verify handle.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'DID to resolve.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['didDoc'], - properties: { - didDoc: { - type: 'unknown', - description: 'The complete DID document for the identity.', - }, - }, - }, - }, - errors: [ - { - name: 'DidNotFound', - description: - 'The DID resolution process confirmed that there is no current DID.', - }, - { - name: 'DidDeactivated', - description: - 'The DID previously existed, but has been deactivated.', - }, - ], - }, - }, - }, - ComAtprotoIdentityResolveHandle: { - lexicon: 1, - id: 'com.atproto.identity.resolveHandle', - defs: { - main: { - type: 'query', - description: - 'Resolves an atproto handle (hostname) to a DID. Does not necessarily bi-directionally verify against the the DID document.', - parameters: { - type: 'params', - required: ['handle'], - properties: { - handle: { - type: 'string', - format: 'handle', - description: 'The handle to resolve.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - }, - errors: [ - { - name: 'HandleNotFound', - description: - 'The resolution process confirmed that the handle does not resolve to any DID.', - }, - ], - }, - }, - }, - ComAtprotoIdentityResolveIdentity: { - lexicon: 1, - id: 'com.atproto.identity.resolveIdentity', - defs: { - main: { - type: 'query', - description: - 'Resolves an identity (DID or Handle) to a full identity (DID document and verified handle).', - parameters: { - type: 'params', - required: ['identifier'], - properties: { - identifier: { - type: 'string', - format: 'at-identifier', - description: 'Handle or DID to resolve.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:com.atproto.identity.defs#identityInfo', - }, - }, - errors: [ - { - name: 'HandleNotFound', - description: - 'The resolution process confirmed that the handle does not resolve to any DID.', - }, - { - name: 'DidNotFound', - description: - 'The DID resolution process confirmed that there is no current DID.', - }, - { - name: 'DidDeactivated', - description: - 'The DID previously existed, but has been deactivated.', - }, - ], - }, - }, - }, - ComAtprotoIdentitySignPlcOperation: { - lexicon: 1, - id: 'com.atproto.identity.signPlcOperation', - defs: { - main: { - type: 'procedure', - description: - "Signs a PLC operation to update some value(s) in the requesting DID's document.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - token: { - description: - 'A token received through com.atproto.identity.requestPlcOperationSignature', - type: 'string', - }, - rotationKeys: { - type: 'array', - items: { - type: 'string', - }, - }, - alsoKnownAs: { - type: 'array', - items: { - type: 'string', - }, - }, - verificationMethods: { - type: 'unknown', - }, - services: { - type: 'unknown', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['operation'], - properties: { - operation: { - type: 'unknown', - description: 'A signed DID PLC operation.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoIdentitySubmitPlcOperation: { - lexicon: 1, - id: 'com.atproto.identity.submitPlcOperation', - defs: { - main: { - type: 'procedure', - description: - "Validates a PLC operation to ensure that it doesn't violate a service's constraints or get the identity into a bad state, then submits it to the PLC registry", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['operation'], - properties: { - operation: { - type: 'unknown', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoIdentityUpdateHandle: { - lexicon: 1, - id: 'com.atproto.identity.updateHandle', - defs: { - main: { - type: 'procedure', - description: - "Updates the current account's handle. Verifies handle validity, and updates did:plc document if necessary. Implemented by PDS, and requires auth.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['handle'], - properties: { - handle: { - type: 'string', - format: 'handle', - description: 'The new handle.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoLabelDefs: { - lexicon: 1, - id: 'com.atproto.label.defs', - defs: { - label: { - type: 'object', - description: - 'Metadata tag on an atproto resource (eg, repo or record).', - required: ['src', 'uri', 'val', 'cts'], - properties: { - ver: { - type: 'integer', - description: 'The AT Protocol version of the label object.', - }, - src: { - type: 'string', - format: 'did', - description: 'DID of the actor who created this label.', - }, - uri: { - type: 'string', - format: 'uri', - description: - 'AT URI of the record, repository (account), or other resource that this label applies to.', - }, - cid: { - type: 'string', - format: 'cid', - description: - "Optionally, CID specifying the specific version of 'uri' resource this label applies to.", - }, - val: { - type: 'string', - maxLength: 128, - description: - 'The short string name of the value or type of this label.', - }, - neg: { - type: 'boolean', - description: - 'If true, this is a negation label, overwriting a previous label.', - }, - cts: { - type: 'string', - format: 'datetime', - description: 'Timestamp when this label was created.', - }, - exp: { - type: 'string', - format: 'datetime', - description: - 'Timestamp at which this label expires (no longer applies).', - }, - sig: { - type: 'bytes', - description: 'Signature of dag-cbor encoded label.', - }, - }, - }, - selfLabels: { - type: 'object', - description: - 'Metadata tags on an atproto record, published by the author within the record.', - required: ['values'], - properties: { - values: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#selfLabel', - }, - maxLength: 10, - }, - }, - }, - selfLabel: { - type: 'object', - description: - 'Metadata tag on an atproto record, published by the author within the record. Note that schemas should use #selfLabels, not #selfLabel.', - required: ['val'], - properties: { - val: { - type: 'string', - maxLength: 128, - description: - 'The short string name of the value or type of this label.', - }, - }, - }, - labelValueDefinition: { - type: 'object', - description: - 'Declares a label value and its expected interpretations and behaviors.', - required: ['identifier', 'severity', 'blurs', 'locales'], - properties: { - identifier: { - type: 'string', - description: - "The value of the label being defined. Must only include lowercase ascii and the '-' character ([a-z-]+).", - maxLength: 100, - maxGraphemes: 100, - }, - severity: { - type: 'string', - description: - "How should a client visually convey this label? 'inform' means neutral and informational; 'alert' means negative and warning; 'none' means show nothing.", - knownValues: ['inform', 'alert', 'none'], - }, - blurs: { - type: 'string', - description: - "What should this label hide in the UI, if applied? 'content' hides all of the target; 'media' hides the images/video/audio; 'none' hides nothing.", - knownValues: ['content', 'media', 'none'], - }, - defaultSetting: { - type: 'string', - description: 'The default setting for this label.', - knownValues: ['ignore', 'warn', 'hide'], - default: 'warn', - }, - adultOnly: { - type: 'boolean', - description: - 'Does the user need to have adult content enabled in order to configure this label?', - }, - locales: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#labelValueDefinitionStrings', - }, - }, - }, - }, - labelValueDefinitionStrings: { - type: 'object', - description: - 'Strings which describe the label in the UI, localized into a specific language.', - required: ['lang', 'name', 'description'], - properties: { - lang: { - type: 'string', - description: - 'The code of the language these strings are written in.', - format: 'language', - }, - name: { - type: 'string', - description: 'A short human-readable name for the label.', - maxGraphemes: 64, - maxLength: 640, - }, - description: { - type: 'string', - description: - 'A longer description of what the label means and why it might be applied.', - maxGraphemes: 10000, - maxLength: 100000, - }, - }, - }, - labelValue: { - type: 'string', - knownValues: [ - '!hide', - '!warn', - '!no-unauthenticated', - 'porn', - 'sexual', - 'nudity', - 'graphic-media', - 'bot', - ], - }, - }, - }, - ComAtprotoLabelQueryLabels: { - lexicon: 1, - id: 'com.atproto.label.queryLabels', - defs: { - main: { - type: 'query', - description: - 'Find labels relevant to the provided AT-URI patterns. Public endpoint for moderation services, though may return different or additional results with auth.', - parameters: { - type: 'params', - required: ['uriPatterns'], - properties: { - uriPatterns: { - type: 'array', - items: { - type: 'string', - }, - description: - "List of AT URI patterns to match (boolean 'OR'). Each may be a prefix (ending with '*'; will match inclusive of the string leading to '*'), or a full URI.", - }, - sources: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - description: - 'Optional list of label sources (DIDs) to filter on.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 250, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['labels'], - properties: { - cursor: { - type: 'string', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - }, - }, - }, - }, - }, - }, - ComAtprotoLabelSubscribeLabels: { - lexicon: 1, - id: 'com.atproto.label.subscribeLabels', - defs: { - main: { - type: 'subscription', - description: - 'Subscribe to stream of labels (and negations). Public endpoint implemented by mod services. Uses same sequencing scheme as repo event stream.', - parameters: { - type: 'params', - properties: { - cursor: { - type: 'integer', - description: 'The last known event seq number to backfill from.', - }, - }, - }, - message: { - schema: { - type: 'union', - refs: [ - 'lex:com.atproto.label.subscribeLabels#labels', - 'lex:com.atproto.label.subscribeLabels#info', - ], - }, - }, - errors: [ - { - name: 'FutureCursor', - }, - ], - }, - labels: { - type: 'object', - required: ['seq', 'labels'], - properties: { - seq: { - type: 'integer', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - }, - }, - info: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - knownValues: ['OutdatedCursor'], - }, - message: { - type: 'string', - }, - }, - }, - }, - }, - ComAtprotoLexiconResolveLexicon: { - lexicon: 1, - id: 'com.atproto.lexicon.resolveLexicon', - defs: { - main: { - type: 'query', - description: 'Resolves an atproto lexicon (NSID) to a schema.', - parameters: { - type: 'params', - properties: { - nsid: { - format: 'nsid', - type: 'string', - description: 'The lexicon NSID to resolve.', - }, - }, - required: ['nsid'], - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - cid: { - type: 'string', - format: 'cid', - description: 'The CID of the lexicon schema record.', - }, - schema: { - type: 'ref', - ref: 'lex:com.atproto.lexicon.schema#main', - description: 'The resolved lexicon schema record.', - }, - uri: { - type: 'string', - format: 'at-uri', - description: 'The AT-URI of the lexicon schema record.', - }, - }, - required: ['uri', 'cid', 'schema'], - }, - }, - errors: [ - { - description: 'No lexicon was resolved for the NSID.', - name: 'LexiconNotFound', - }, - ], - }, - }, - }, - ComAtprotoLexiconSchema: { - lexicon: 1, - id: 'com.atproto.lexicon.schema', - defs: { - main: { - type: 'record', - description: - "Representation of Lexicon schemas themselves, when published as atproto records. Note that the schema language is not defined in Lexicon; this meta schema currently only includes a single version field ('lexicon'). See the atproto specifications for description of the other expected top-level fields ('id', 'defs', etc).", - key: 'nsid', - record: { - type: 'object', - required: ['lexicon'], - properties: { - lexicon: { - type: 'integer', - description: - "Indicates the 'version' of the Lexicon language. Must be '1' for the current atproto/Lexicon schema system.", - }, - }, - }, - }, - }, - }, - ComAtprotoModerationCreateReport: { - lexicon: 1, - id: 'com.atproto.moderation.createReport', - defs: { - main: { - type: 'procedure', - description: - 'Submit a moderation report regarding an atproto account or record. Implemented by moderation services (with PDS proxying), and requires auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['reasonType', 'subject'], - properties: { - reasonType: { - type: 'ref', - description: - 'Indicates the broad category of violation the report is for.', - ref: 'lex:com.atproto.moderation.defs#reasonType', - }, - reason: { - type: 'string', - maxGraphemes: 2000, - maxLength: 20000, - description: - 'Additional context about the content and violation.', - }, - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - ], - }, - modTool: { - type: 'ref', - ref: 'lex:com.atproto.moderation.createReport#modTool', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: [ - 'id', - 'reasonType', - 'subject', - 'reportedBy', - 'createdAt', - ], - properties: { - id: { - type: 'integer', - }, - reasonType: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#reasonType', - }, - reason: { - type: 'string', - maxGraphemes: 2000, - maxLength: 20000, - }, - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - ], - }, - reportedBy: { - type: 'string', - format: 'did', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - modTool: { - type: 'object', - description: - 'Moderation tool information for tracing the source of the action', - required: ['name'], - properties: { - name: { - type: 'string', - description: - "Name/identifier of the source (e.g., 'bsky-app/android', 'bsky-web/chrome')", - }, - meta: { - type: 'unknown', - description: 'Additional arbitrary metadata about the source', - }, - }, - }, - }, - }, - ComAtprotoModerationDefs: { - lexicon: 1, - id: 'com.atproto.moderation.defs', - defs: { - reasonType: { - type: 'string', - knownValues: [ - 'com.atproto.moderation.defs#reasonSpam', - 'com.atproto.moderation.defs#reasonViolation', - 'com.atproto.moderation.defs#reasonMisleading', - 'com.atproto.moderation.defs#reasonSexual', - 'com.atproto.moderation.defs#reasonRude', - 'com.atproto.moderation.defs#reasonOther', - 'com.atproto.moderation.defs#reasonAppeal', - 'tools.ozone.report.defs#reasonAppeal', - 'tools.ozone.report.defs#reasonOther', - 'tools.ozone.report.defs#reasonViolenceAnimal', - 'tools.ozone.report.defs#reasonViolenceThreats', - 'tools.ozone.report.defs#reasonViolenceGraphicContent', - 'tools.ozone.report.defs#reasonViolenceGlorification', - 'tools.ozone.report.defs#reasonViolenceExtremistContent', - 'tools.ozone.report.defs#reasonViolenceTrafficking', - 'tools.ozone.report.defs#reasonViolenceOther', - 'tools.ozone.report.defs#reasonSexualAbuseContent', - 'tools.ozone.report.defs#reasonSexualNCII', - 'tools.ozone.report.defs#reasonSexualDeepfake', - 'tools.ozone.report.defs#reasonSexualAnimal', - 'tools.ozone.report.defs#reasonSexualUnlabeled', - 'tools.ozone.report.defs#reasonSexualOther', - 'tools.ozone.report.defs#reasonChildSafetyCSAM', - 'tools.ozone.report.defs#reasonChildSafetyGroom', - 'tools.ozone.report.defs#reasonChildSafetyPrivacy', - 'tools.ozone.report.defs#reasonChildSafetyHarassment', - 'tools.ozone.report.defs#reasonChildSafetyOther', - 'tools.ozone.report.defs#reasonHarassmentTroll', - 'tools.ozone.report.defs#reasonHarassmentTargeted', - 'tools.ozone.report.defs#reasonHarassmentHateSpeech', - 'tools.ozone.report.defs#reasonHarassmentDoxxing', - 'tools.ozone.report.defs#reasonHarassmentOther', - 'tools.ozone.report.defs#reasonMisleadingBot', - 'tools.ozone.report.defs#reasonMisleadingImpersonation', - 'tools.ozone.report.defs#reasonMisleadingSpam', - 'tools.ozone.report.defs#reasonMisleadingScam', - 'tools.ozone.report.defs#reasonMisleadingElections', - 'tools.ozone.report.defs#reasonMisleadingOther', - 'tools.ozone.report.defs#reasonRuleSiteSecurity', - 'tools.ozone.report.defs#reasonRuleProhibitedSales', - 'tools.ozone.report.defs#reasonRuleBanEvasion', - 'tools.ozone.report.defs#reasonRuleOther', - 'tools.ozone.report.defs#reasonSelfHarmContent', - 'tools.ozone.report.defs#reasonSelfHarmED', - 'tools.ozone.report.defs#reasonSelfHarmStunts', - 'tools.ozone.report.defs#reasonSelfHarmSubstances', - 'tools.ozone.report.defs#reasonSelfHarmOther', - ], - }, - reasonSpam: { - type: 'token', - description: - 'Spam: frequent unwanted promotion, replies, mentions. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingSpam`.', - }, - reasonViolation: { - type: 'token', - description: - 'Direct violation of server rules, laws, terms of service. Prefer new lexicon definition `tools.ozone.report.defs#reasonRuleOther`.', - }, - reasonMisleading: { - type: 'token', - description: - 'Misleading identity, affiliation, or content. Prefer new lexicon definition `tools.ozone.report.defs#reasonMisleadingOther`.', - }, - reasonSexual: { - type: 'token', - description: - 'Unwanted or mislabeled sexual content. Prefer new lexicon definition `tools.ozone.report.defs#reasonSexualUnlabeled`.', - }, - reasonRude: { - type: 'token', - description: - 'Rude, harassing, explicit, or otherwise unwelcoming behavior. Prefer new lexicon definition `tools.ozone.report.defs#reasonHarassmentOther`.', - }, - reasonOther: { - type: 'token', - description: - 'Reports not falling under another report category. Prefer new lexicon definition `tools.ozone.report.defs#reasonOther`.', - }, - reasonAppeal: { - type: 'token', - description: 'Appeal a previously taken moderation action', - }, - subjectType: { - type: 'string', - description: 'Tag describing a type of subject that might be reported.', - knownValues: ['account', 'record', 'chat'], - }, - }, - }, - ComAtprotoRepoApplyWrites: { - lexicon: 1, - id: 'com.atproto.repo.applyWrites', - defs: { - main: { - type: 'procedure', - description: - 'Apply a batch transaction of repository creates, updates, and deletes. Requires auth, implemented by PDS.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repo', 'writes'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: - 'The handle or DID of the repo (aka, current account).', - }, - validate: { - type: 'boolean', - description: - "Can be set to 'false' to skip Lexicon schema validation of record data across all operations, 'true' to require it, or leave unset to validate only for known Lexicons.", - }, - writes: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:com.atproto.repo.applyWrites#create', - 'lex:com.atproto.repo.applyWrites#update', - 'lex:com.atproto.repo.applyWrites#delete', - ], - closed: true, - }, - }, - swapCommit: { - type: 'string', - description: - 'If provided, the entire operation will fail if the current repo commit CID does not match this value. Used to prevent conflicting repo mutations.', - format: 'cid', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: [], - properties: { - commit: { - type: 'ref', - ref: 'lex:com.atproto.repo.defs#commitMeta', - }, - results: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:com.atproto.repo.applyWrites#createResult', - 'lex:com.atproto.repo.applyWrites#updateResult', - 'lex:com.atproto.repo.applyWrites#deleteResult', - ], - closed: true, - }, - }, - }, - }, - }, - errors: [ - { - name: 'InvalidSwap', - description: - "Indicates that the 'swapCommit' parameter did not match current commit.", - }, - ], - }, - create: { - type: 'object', - description: 'Operation which creates a new record.', - required: ['collection', 'value'], - properties: { - collection: { - type: 'string', - format: 'nsid', - }, - rkey: { - type: 'string', - maxLength: 512, - format: 'record-key', - description: - 'NOTE: maxLength is redundant with record-key format. Keeping it temporarily to ensure backwards compatibility.', - }, - value: { - type: 'unknown', - }, - }, - }, - update: { - type: 'object', - description: 'Operation which updates an existing record.', - required: ['collection', 'rkey', 'value'], - properties: { - collection: { - type: 'string', - format: 'nsid', - }, - rkey: { - type: 'string', - format: 'record-key', - }, - value: { - type: 'unknown', - }, - }, - }, - delete: { - type: 'object', - description: 'Operation which deletes an existing record.', - required: ['collection', 'rkey'], - properties: { - collection: { - type: 'string', - format: 'nsid', - }, - rkey: { - type: 'string', - format: 'record-key', - }, - }, - }, - createResult: { - type: 'object', - required: ['uri', 'cid'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - validationStatus: { - type: 'string', - knownValues: ['valid', 'unknown'], - }, - }, - }, - updateResult: { - type: 'object', - required: ['uri', 'cid'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - validationStatus: { - type: 'string', - knownValues: ['valid', 'unknown'], - }, - }, - }, - deleteResult: { - type: 'object', - required: [], - properties: {}, - }, - }, - }, - ComAtprotoRepoCreateRecord: { - lexicon: 1, - id: 'com.atproto.repo.createRecord', - defs: { - main: { - type: 'procedure', - description: - 'Create a single new repository record. Requires auth, implemented by PDS.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repo', 'collection', 'record'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: - 'The handle or DID of the repo (aka, current account).', - }, - collection: { - type: 'string', - format: 'nsid', - description: 'The NSID of the record collection.', - }, - rkey: { - type: 'string', - format: 'record-key', - description: 'The Record Key.', - maxLength: 512, - }, - validate: { - type: 'boolean', - description: - "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons.", - }, - record: { - type: 'unknown', - description: 'The record itself. Must contain a $type field.', - }, - swapCommit: { - type: 'string', - format: 'cid', - description: - 'Compare and swap with the previous commit by CID.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'cid'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - commit: { - type: 'ref', - ref: 'lex:com.atproto.repo.defs#commitMeta', - }, - validationStatus: { - type: 'string', - knownValues: ['valid', 'unknown'], - }, - }, - }, - }, - errors: [ - { - name: 'InvalidSwap', - description: - "Indicates that 'swapCommit' didn't match current repo commit.", - }, - ], - }, - }, - }, - ComAtprotoRepoDefs: { - lexicon: 1, - id: 'com.atproto.repo.defs', - defs: { - commitMeta: { - type: 'object', - required: ['cid', 'rev'], - properties: { - cid: { - type: 'string', - format: 'cid', - }, - rev: { - type: 'string', - format: 'tid', - }, - }, - }, - }, - }, - ComAtprotoRepoDeleteRecord: { - lexicon: 1, - id: 'com.atproto.repo.deleteRecord', - defs: { - main: { - type: 'procedure', - description: - "Delete a repository record, or ensure it doesn't exist. Requires auth, implemented by PDS.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repo', 'collection', 'rkey'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: - 'The handle or DID of the repo (aka, current account).', - }, - collection: { - type: 'string', - format: 'nsid', - description: 'The NSID of the record collection.', - }, - rkey: { - type: 'string', - format: 'record-key', - description: 'The Record Key.', - }, - swapRecord: { - type: 'string', - format: 'cid', - description: - 'Compare and swap with the previous record by CID.', - }, - swapCommit: { - type: 'string', - format: 'cid', - description: - 'Compare and swap with the previous commit by CID.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - commit: { - type: 'ref', - ref: 'lex:com.atproto.repo.defs#commitMeta', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidSwap', - }, - ], - }, - }, - }, - ComAtprotoRepoDescribeRepo: { - lexicon: 1, - id: 'com.atproto.repo.describeRepo', - defs: { - main: { - type: 'query', - description: - 'Get information about an account and repository, including the list of collections. Does not require auth.', - parameters: { - type: 'params', - required: ['repo'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: 'The handle or DID of the repo.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: [ - 'handle', - 'did', - 'didDoc', - 'collections', - 'handleIsCorrect', - ], - properties: { - handle: { - type: 'string', - format: 'handle', - }, - did: { - type: 'string', - format: 'did', - }, - didDoc: { - type: 'unknown', - description: 'The complete DID document for this account.', - }, - collections: { - type: 'array', - description: - 'List of all the collections (NSIDs) for which this repo contains at least one record.', - items: { - type: 'string', - format: 'nsid', - }, - }, - handleIsCorrect: { - type: 'boolean', - description: - 'Indicates if handle is currently valid (resolves bi-directionally)', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoRepoGetRecord: { - lexicon: 1, - id: 'com.atproto.repo.getRecord', - defs: { - main: { - type: 'query', - description: - 'Get a single record from a repository. Does not require auth.', - parameters: { - type: 'params', - required: ['repo', 'collection', 'rkey'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: 'The handle or DID of the repo.', - }, - collection: { - type: 'string', - format: 'nsid', - description: 'The NSID of the record collection.', - }, - rkey: { - type: 'string', - description: 'The Record Key.', - format: 'record-key', - }, - cid: { - type: 'string', - format: 'cid', - description: - 'The CID of the version of the record. If not specified, then return the most recent version.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'value'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - value: { - type: 'unknown', - }, - }, - }, - }, - errors: [ - { - name: 'RecordNotFound', - }, - ], - }, - }, - }, - ComAtprotoRepoImportRepo: { - lexicon: 1, - id: 'com.atproto.repo.importRepo', - defs: { - main: { - type: 'procedure', - description: - 'Import a repo in the form of a CAR file. Requires Content-Length HTTP header to be set.', - input: { - encoding: 'application/vnd.ipld.car', - }, - }, - }, - }, - ComAtprotoRepoListMissingBlobs: { - lexicon: 1, - id: 'com.atproto.repo.listMissingBlobs', - defs: { - main: { - type: 'query', - description: - 'Returns a list of missing blobs for the requesting account. Intended to be used in the account migration flow.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 1000, - default: 500, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['blobs'], - properties: { - cursor: { - type: 'string', - }, - blobs: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.repo.listMissingBlobs#recordBlob', - }, - }, - }, - }, - }, - }, - recordBlob: { - type: 'object', - required: ['cid', 'recordUri'], - properties: { - cid: { - type: 'string', - format: 'cid', - }, - recordUri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - }, - ComAtprotoRepoListRecords: { - lexicon: 1, - id: 'com.atproto.repo.listRecords', - defs: { - main: { - type: 'query', - description: - 'List a range of records in a repository, matching a specific collection. Does not require auth.', - parameters: { - type: 'params', - required: ['repo', 'collection'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: 'The handle or DID of the repo.', - }, - collection: { - type: 'string', - format: 'nsid', - description: 'The NSID of the record type.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - description: 'The number of records to return.', - }, - cursor: { - type: 'string', - }, - reverse: { - type: 'boolean', - description: 'Flag to reverse the order of the returned records.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['records'], - properties: { - cursor: { - type: 'string', - }, - records: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.repo.listRecords#record', - }, - }, - }, - }, - }, - }, - record: { - type: 'object', - required: ['uri', 'cid', 'value'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - value: { - type: 'unknown', - }, - }, - }, - }, - }, - ComAtprotoRepoPutRecord: { - lexicon: 1, - id: 'com.atproto.repo.putRecord', - defs: { - main: { - type: 'procedure', - description: - 'Write a repository record, creating or updating it as needed. Requires auth, implemented by PDS.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repo', 'collection', 'rkey', 'record'], - nullable: ['swapRecord'], - properties: { - repo: { - type: 'string', - format: 'at-identifier', - description: - 'The handle or DID of the repo (aka, current account).', - }, - collection: { - type: 'string', - format: 'nsid', - description: 'The NSID of the record collection.', - }, - rkey: { - type: 'string', - format: 'record-key', - description: 'The Record Key.', - maxLength: 512, - }, - validate: { - type: 'boolean', - description: - "Can be set to 'false' to skip Lexicon schema validation of record data, 'true' to require it, or leave unset to validate only for known Lexicons.", - }, - record: { - type: 'unknown', - description: 'The record to write.', - }, - swapRecord: { - type: 'string', - format: 'cid', - description: - 'Compare and swap with the previous record by CID. WARNING: nullable and optional field; may cause problems with golang implementation', - }, - swapCommit: { - type: 'string', - format: 'cid', - description: - 'Compare and swap with the previous commit by CID.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uri', 'cid'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - commit: { - type: 'ref', - ref: 'lex:com.atproto.repo.defs#commitMeta', - }, - validationStatus: { - type: 'string', - knownValues: ['valid', 'unknown'], - }, - }, - }, - }, - errors: [ - { - name: 'InvalidSwap', - }, - ], - }, - }, - }, - ComAtprotoRepoStrongRef: { - lexicon: 1, - id: 'com.atproto.repo.strongRef', - description: 'A URI with a content-hash fingerprint.', - defs: { - main: { - type: 'object', - required: ['uri', 'cid'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - }, - }, - }, - }, - ComAtprotoRepoUploadBlob: { - lexicon: 1, - id: 'com.atproto.repo.uploadBlob', - defs: { - main: { - type: 'procedure', - description: - 'Upload a new blob, to be referenced from a repository record. The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created. Requires auth, implemented by PDS.', - input: { - encoding: '*/*', - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['blob'], - properties: { - blob: { - type: 'blob', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerActivateAccount: { - lexicon: 1, - id: 'com.atproto.server.activateAccount', - defs: { - main: { - type: 'procedure', - description: - "Activates a currently deactivated account. Used to finalize account migration after the account's repo is imported and identity is setup.", - }, - }, - }, - ComAtprotoServerCheckAccountStatus: { - lexicon: 1, - id: 'com.atproto.server.checkAccountStatus', - defs: { - main: { - type: 'query', - description: - 'Returns the status of an account, especially as pertaining to import or recovery. Can be called many times over the course of an account migration. Requires auth and can only be called pertaining to oneself.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: [ - 'activated', - 'validDid', - 'repoCommit', - 'repoRev', - 'repoBlocks', - 'indexedRecords', - 'privateStateValues', - 'expectedBlobs', - 'importedBlobs', - ], - properties: { - activated: { - type: 'boolean', - }, - validDid: { - type: 'boolean', - }, - repoCommit: { - type: 'string', - format: 'cid', - }, - repoRev: { - type: 'string', - }, - repoBlocks: { - type: 'integer', - }, - indexedRecords: { - type: 'integer', - }, - privateStateValues: { - type: 'integer', - }, - expectedBlobs: { - type: 'integer', - }, - importedBlobs: { - type: 'integer', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerConfirmEmail: { - lexicon: 1, - id: 'com.atproto.server.confirmEmail', - defs: { - main: { - type: 'procedure', - description: - 'Confirm an email using a token from com.atproto.server.requestEmailConfirmation.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['email', 'token'], - properties: { - email: { - type: 'string', - }, - token: { - type: 'string', - }, - }, - }, - }, - errors: [ - { - name: 'AccountNotFound', - }, - { - name: 'ExpiredToken', - }, - { - name: 'InvalidToken', - }, - { - name: 'InvalidEmail', - }, - ], - }, - }, - }, - ComAtprotoServerCreateAccount: { - lexicon: 1, - id: 'com.atproto.server.createAccount', - defs: { - main: { - type: 'procedure', - description: 'Create an account. Implemented by PDS.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['handle'], - properties: { - email: { - type: 'string', - }, - handle: { - type: 'string', - format: 'handle', - description: 'Requested handle for the account.', - }, - did: { - type: 'string', - format: 'did', - description: - 'Pre-existing atproto DID, being imported to a new account.', - }, - inviteCode: { - type: 'string', - }, - verificationCode: { - type: 'string', - }, - verificationPhone: { - type: 'string', - }, - password: { - type: 'string', - description: - 'Initial account password. May need to meet instance-specific password strength requirements.', - }, - recoveryKey: { - type: 'string', - description: - 'DID PLC rotation key (aka, recovery key) to be included in PLC creation operation.', - }, - plcOp: { - type: 'unknown', - description: - 'A signed DID PLC operation to be submitted as part of importing an existing account to this instance. NOTE: this optional field may be updated when full account migration is implemented.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - description: - 'Account login session returned on successful account creation.', - required: ['accessJwt', 'refreshJwt', 'handle', 'did'], - properties: { - accessJwt: { - type: 'string', - }, - refreshJwt: { - type: 'string', - }, - handle: { - type: 'string', - format: 'handle', - }, - did: { - type: 'string', - format: 'did', - description: 'The DID of the new account.', - }, - didDoc: { - type: 'unknown', - description: 'Complete DID document.', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidHandle', - }, - { - name: 'InvalidPassword', - }, - { - name: 'InvalidInviteCode', - }, - { - name: 'HandleNotAvailable', - }, - { - name: 'UnsupportedDomain', - }, - { - name: 'UnresolvableDid', - }, - { - name: 'IncompatibleDidDoc', - }, - ], - }, - }, - }, - ComAtprotoServerCreateAppPassword: { - lexicon: 1, - id: 'com.atproto.server.createAppPassword', - defs: { - main: { - type: 'procedure', - description: 'Create an App Password.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - description: - 'A short name for the App Password, to help distinguish them.', - }, - privileged: { - type: 'boolean', - description: - "If an app password has 'privileged' access to possibly sensitive account state. Meant for use with trusted clients.", - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:com.atproto.server.createAppPassword#appPassword', - }, - }, - errors: [ - { - name: 'AccountTakedown', - }, - ], - }, - appPassword: { - type: 'object', - required: ['name', 'password', 'createdAt'], - properties: { - name: { - type: 'string', - }, - password: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - privileged: { - type: 'boolean', - }, - }, - }, - }, - }, - ComAtprotoServerCreateInviteCode: { - lexicon: 1, - id: 'com.atproto.server.createInviteCode', - defs: { - main: { - type: 'procedure', - description: 'Create an invite code.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['useCount'], - properties: { - useCount: { - type: 'integer', - }, - forAccount: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['code'], - properties: { - code: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerCreateInviteCodes: { - lexicon: 1, - id: 'com.atproto.server.createInviteCodes', - defs: { - main: { - type: 'procedure', - description: 'Create invite codes.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['codeCount', 'useCount'], - properties: { - codeCount: { - type: 'integer', - default: 1, - }, - useCount: { - type: 'integer', - }, - forAccounts: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['codes'], - properties: { - codes: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.createInviteCodes#accountCodes', - }, - }, - }, - }, - }, - }, - accountCodes: { - type: 'object', - required: ['account', 'codes'], - properties: { - account: { - type: 'string', - }, - codes: { - type: 'array', - items: { - type: 'string', - }, - }, - }, - }, - }, - }, - ComAtprotoServerCreateSession: { - lexicon: 1, - id: 'com.atproto.server.createSession', - defs: { - main: { - type: 'procedure', - description: 'Create an authentication session.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['identifier', 'password'], - properties: { - identifier: { - type: 'string', - description: - 'Handle or other identifier supported by the server for the authenticating user.', - }, - password: { - type: 'string', - }, - authFactorToken: { - type: 'string', - }, - allowTakendown: { - type: 'boolean', - description: - 'When true, instead of throwing error for takendown accounts, a valid response with a narrow scoped token will be returned', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['accessJwt', 'refreshJwt', 'handle', 'did'], - properties: { - accessJwt: { - type: 'string', - }, - refreshJwt: { - type: 'string', - }, - handle: { - type: 'string', - format: 'handle', - }, - did: { - type: 'string', - format: 'did', - }, - didDoc: { - type: 'unknown', - }, - email: { - type: 'string', - }, - emailConfirmed: { - type: 'boolean', - }, - emailAuthFactor: { - type: 'boolean', - }, - active: { - type: 'boolean', - }, - status: { - type: 'string', - description: - 'If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.', - knownValues: ['takendown', 'suspended', 'deactivated'], - }, - }, - }, - }, - errors: [ - { - name: 'AccountTakedown', - }, - { - name: 'AuthFactorTokenRequired', - }, - ], - }, - }, - }, - ComAtprotoServerDeactivateAccount: { - lexicon: 1, - id: 'com.atproto.server.deactivateAccount', - defs: { - main: { - type: 'procedure', - description: - 'Deactivates a currently active account. Stops serving of repo, and future writes to repo until reactivated. Used to finalize account migration with the old host after the account has been activated on the new host.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - deleteAfter: { - type: 'string', - format: 'datetime', - description: - 'A recommendation to server as to how long they should hold onto the deactivated account before deleting.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerDefs: { - lexicon: 1, - id: 'com.atproto.server.defs', - defs: { - inviteCode: { - type: 'object', - required: [ - 'code', - 'available', - 'disabled', - 'forAccount', - 'createdBy', - 'createdAt', - 'uses', - ], - properties: { - code: { - type: 'string', - }, - available: { - type: 'integer', - }, - disabled: { - type: 'boolean', - }, - forAccount: { - type: 'string', - }, - createdBy: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - uses: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCodeUse', - }, - }, - }, - }, - inviteCodeUse: { - type: 'object', - required: ['usedBy', 'usedAt'], - properties: { - usedBy: { - type: 'string', - format: 'did', - }, - usedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - ComAtprotoServerDeleteAccount: { - lexicon: 1, - id: 'com.atproto.server.deleteAccount', - defs: { - main: { - type: 'procedure', - description: - "Delete an actor's account with a token and password. Can only be called after requesting a deletion token. Requires auth.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'password', 'token'], - properties: { - did: { - type: 'string', - format: 'did', - }, - password: { - type: 'string', - }, - token: { - type: 'string', - }, - }, - }, - }, - errors: [ - { - name: 'ExpiredToken', - }, - { - name: 'InvalidToken', - }, - ], - }, - }, - }, - ComAtprotoServerDeleteSession: { - lexicon: 1, - id: 'com.atproto.server.deleteSession', - defs: { - main: { - type: 'procedure', - description: - "Delete the current session. Requires auth using the 'refreshJwt' (not the 'accessJwt').", - errors: [ - { - name: 'InvalidToken', - }, - { - name: 'ExpiredToken', - }, - ], - }, - }, - }, - ComAtprotoServerDescribeServer: { - lexicon: 1, - id: 'com.atproto.server.describeServer', - defs: { - main: { - type: 'query', - description: - "Describes the server's account creation requirements and capabilities. Implemented by PDS.", - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'availableUserDomains'], - properties: { - inviteCodeRequired: { - type: 'boolean', - description: - 'If true, an invite code must be supplied to create an account on this instance.', - }, - phoneVerificationRequired: { - type: 'boolean', - description: - 'If true, a phone verification token must be supplied to create an account on this instance.', - }, - availableUserDomains: { - type: 'array', - description: - 'List of domain suffixes that can be used in account handles.', - items: { - type: 'string', - }, - }, - links: { - type: 'ref', - description: 'URLs of service policy documents.', - ref: 'lex:com.atproto.server.describeServer#links', - }, - contact: { - type: 'ref', - description: 'Contact information', - ref: 'lex:com.atproto.server.describeServer#contact', - }, - did: { - type: 'string', - format: 'did', - }, - }, - }, - }, - }, - links: { - type: 'object', - properties: { - privacyPolicy: { - type: 'string', - format: 'uri', - }, - termsOfService: { - type: 'string', - format: 'uri', - }, - }, - }, - contact: { - type: 'object', - properties: { - email: { - type: 'string', - }, - }, - }, - }, - }, - ComAtprotoServerGetAccountInviteCodes: { - lexicon: 1, - id: 'com.atproto.server.getAccountInviteCodes', - defs: { - main: { - type: 'query', - description: - 'Get all invite codes for the current account. Requires auth.', - parameters: { - type: 'params', - properties: { - includeUsed: { - type: 'boolean', - default: true, - }, - createAvailable: { - type: 'boolean', - default: true, - description: - "Controls whether any new 'earned' but not 'created' invites should be created.", - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['codes'], - properties: { - codes: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - }, - }, - }, - }, - errors: [ - { - name: 'DuplicateCreate', - }, - ], - }, - }, - }, - ComAtprotoServerGetServiceAuth: { - lexicon: 1, - id: 'com.atproto.server.getServiceAuth', - defs: { - main: { - type: 'query', - description: - 'Get a signed token on behalf of the requesting DID for the requested service.', - parameters: { - type: 'params', - required: ['aud'], - properties: { - aud: { - type: 'string', - format: 'did', - description: - 'The DID of the service that the token will be used to authenticate with', - }, - exp: { - type: 'integer', - description: - 'The time in Unix Epoch seconds that the JWT expires. Defaults to 60 seconds in the future. The service may enforce certain time bounds on tokens depending on the requested scope.', - }, - lxm: { - type: 'string', - format: 'nsid', - description: - 'Lexicon (XRPC) method to bind the requested token to', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['token'], - properties: { - token: { - type: 'string', - }, - }, - }, - }, - errors: [ - { - name: 'BadExpiration', - description: - 'Indicates that the requested expiration date is not a valid. May be in the past or may be reliant on the requested scopes.', - }, - ], - }, - }, - }, - ComAtprotoServerGetSession: { - lexicon: 1, - id: 'com.atproto.server.getSession', - defs: { - main: { - type: 'query', - description: - 'Get information about the current auth session. Requires auth.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['handle', 'did'], - properties: { - handle: { - type: 'string', - format: 'handle', - }, - did: { - type: 'string', - format: 'did', - }, - didDoc: { - type: 'unknown', - }, - email: { - type: 'string', - }, - emailConfirmed: { - type: 'boolean', - }, - emailAuthFactor: { - type: 'boolean', - }, - active: { - type: 'boolean', - }, - status: { - type: 'string', - description: - 'If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.', - knownValues: ['takendown', 'suspended', 'deactivated'], - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerListAppPasswords: { - lexicon: 1, - id: 'com.atproto.server.listAppPasswords', - defs: { - main: { - type: 'query', - description: 'List all App Passwords.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['passwords'], - properties: { - passwords: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.listAppPasswords#appPassword', - }, - }, - }, - }, - }, - errors: [ - { - name: 'AccountTakedown', - }, - ], - }, - appPassword: { - type: 'object', - required: ['name', 'createdAt'], - properties: { - name: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - privileged: { - type: 'boolean', - }, - }, - }, - }, - }, - ComAtprotoServerRefreshSession: { - lexicon: 1, - id: 'com.atproto.server.refreshSession', - defs: { - main: { - type: 'procedure', - description: - "Refresh an authentication session. Requires auth using the 'refreshJwt' (not the 'accessJwt').", - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['accessJwt', 'refreshJwt', 'handle', 'did'], - properties: { - accessJwt: { - type: 'string', - }, - refreshJwt: { - type: 'string', - }, - handle: { - type: 'string', - format: 'handle', - }, - did: { - type: 'string', - format: 'did', - }, - didDoc: { - type: 'unknown', - }, - email: { - type: 'string', - }, - emailConfirmed: { - type: 'boolean', - }, - emailAuthFactor: { - type: 'boolean', - }, - active: { - type: 'boolean', - }, - status: { - type: 'string', - description: - "Hosting status of the account. If not specified, then assume 'active'.", - knownValues: ['takendown', 'suspended', 'deactivated'], - }, - }, - }, - }, - errors: [ - { - name: 'AccountTakedown', - }, - { - name: 'InvalidToken', - }, - { - name: 'ExpiredToken', - }, - ], - }, - }, - }, - ComAtprotoServerRequestAccountDelete: { - lexicon: 1, - id: 'com.atproto.server.requestAccountDelete', - defs: { - main: { - type: 'procedure', - description: 'Initiate a user account deletion via email.', - }, - }, - }, - ComAtprotoServerRequestEmailConfirmation: { - lexicon: 1, - id: 'com.atproto.server.requestEmailConfirmation', - defs: { - main: { - type: 'procedure', - description: - 'Request an email with a code to confirm ownership of email.', - }, - }, - }, - ComAtprotoServerRequestEmailUpdate: { - lexicon: 1, - id: 'com.atproto.server.requestEmailUpdate', - defs: { - main: { - type: 'procedure', - description: 'Request a token in order to update email.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['tokenRequired'], - properties: { - tokenRequired: { - type: 'boolean', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerRequestPasswordReset: { - lexicon: 1, - id: 'com.atproto.server.requestPasswordReset', - defs: { - main: { - type: 'procedure', - description: 'Initiate a user account password reset via email.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['email'], - properties: { - email: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerReserveSigningKey: { - lexicon: 1, - id: 'com.atproto.server.reserveSigningKey', - defs: { - main: { - type: 'procedure', - description: - 'Reserve a repo signing key, for use with account creation. Necessary so that a DID PLC update operation can be constructed during an account migraiton. Public and does not require auth; implemented by PDS. NOTE: this endpoint may change when full account migration is implemented.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID to reserve a key for.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['signingKey'], - properties: { - signingKey: { - type: 'string', - description: - 'The public key for the reserved signing key, in did:key serialization.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerResetPassword: { - lexicon: 1, - id: 'com.atproto.server.resetPassword', - defs: { - main: { - type: 'procedure', - description: 'Reset a user account password using a token.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['token', 'password'], - properties: { - token: { - type: 'string', - }, - password: { - type: 'string', - }, - }, - }, - }, - errors: [ - { - name: 'ExpiredToken', - }, - { - name: 'InvalidToken', - }, - ], - }, - }, - }, - ComAtprotoServerRevokeAppPassword: { - lexicon: 1, - id: 'com.atproto.server.revokeAppPassword', - defs: { - main: { - type: 'procedure', - description: 'Revoke an App Password by name.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoServerUpdateEmail: { - lexicon: 1, - id: 'com.atproto.server.updateEmail', - defs: { - main: { - type: 'procedure', - description: "Update an account's email.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['email'], - properties: { - email: { - type: 'string', - }, - emailAuthFactor: { - type: 'boolean', - }, - token: { - type: 'string', - description: - "Requires a token from com.atproto.sever.requestEmailUpdate if the account's email has been confirmed.", - }, - }, - }, - }, - errors: [ - { - name: 'ExpiredToken', - }, - { - name: 'InvalidToken', - }, - { - name: 'TokenRequired', - }, - ], - }, - }, - }, - ComAtprotoSyncDefs: { - lexicon: 1, - id: 'com.atproto.sync.defs', - defs: { - hostStatus: { - type: 'string', - knownValues: ['active', 'idle', 'offline', 'throttled', 'banned'], - }, - }, - }, - ComAtprotoSyncGetBlob: { - lexicon: 1, - id: 'com.atproto.sync.getBlob', - defs: { - main: { - type: 'query', - description: - 'Get a blob associated with a given account. Returns the full blob as originally uploaded. Does not require auth; implemented by PDS.', - parameters: { - type: 'params', - required: ['did', 'cid'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the account.', - }, - cid: { - type: 'string', - format: 'cid', - description: 'The CID of the blob to fetch', - }, - }, - }, - output: { - encoding: '*/*', - }, - errors: [ - { - name: 'BlobNotFound', - }, - { - name: 'RepoNotFound', - }, - { - name: 'RepoTakendown', - }, - { - name: 'RepoSuspended', - }, - { - name: 'RepoDeactivated', - }, - ], - }, - }, - }, - ComAtprotoSyncGetBlocks: { - lexicon: 1, - id: 'com.atproto.sync.getBlocks', - defs: { - main: { - type: 'query', - description: - 'Get data blocks from a given repo, by CID. For example, intermediate MST nodes, or records. Does not require auth; implemented by PDS.', - parameters: { - type: 'params', - required: ['did', 'cids'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - cids: { - type: 'array', - items: { - type: 'string', - format: 'cid', - }, - }, - }, - }, - output: { - encoding: 'application/vnd.ipld.car', - }, - errors: [ - { - name: 'BlockNotFound', - }, - { - name: 'RepoNotFound', - }, - { - name: 'RepoTakendown', - }, - { - name: 'RepoSuspended', - }, - { - name: 'RepoDeactivated', - }, - ], - }, - }, - }, - ComAtprotoSyncGetCheckout: { - lexicon: 1, - id: 'com.atproto.sync.getCheckout', - defs: { - main: { - type: 'query', - description: 'DEPRECATED - please use com.atproto.sync.getRepo instead', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - }, - }, - output: { - encoding: 'application/vnd.ipld.car', - }, - }, - }, - }, - ComAtprotoSyncGetHead: { - lexicon: 1, - id: 'com.atproto.sync.getHead', - defs: { - main: { - type: 'query', - description: - 'DEPRECATED - please use com.atproto.sync.getLatestCommit instead', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['root'], - properties: { - root: { - type: 'string', - format: 'cid', - }, - }, - }, - }, - errors: [ - { - name: 'HeadNotFound', - }, - ], - }, - }, - }, - ComAtprotoSyncGetHostStatus: { - lexicon: 1, - id: 'com.atproto.sync.getHostStatus', - defs: { - main: { - type: 'query', - description: - 'Returns information about a specified upstream host, as consumed by the server. Implemented by relays.', - parameters: { - type: 'params', - required: ['hostname'], - properties: { - hostname: { - type: 'string', - description: - 'Hostname of the host (eg, PDS or relay) being queried.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['hostname'], - properties: { - hostname: { - type: 'string', - }, - seq: { - type: 'integer', - description: - 'Recent repo stream event sequence number. May be delayed from actual stream processing (eg, persisted cursor not in-memory cursor).', - }, - accountCount: { - type: 'integer', - description: - 'Number of accounts on the server which are associated with the upstream host. Note that the upstream may actually have more accounts.', - }, - status: { - type: 'ref', - ref: 'lex:com.atproto.sync.defs#hostStatus', - }, - }, - }, - }, - errors: [ - { - name: 'HostNotFound', - }, - ], - }, - }, - }, - ComAtprotoSyncGetLatestCommit: { - lexicon: 1, - id: 'com.atproto.sync.getLatestCommit', - defs: { - main: { - type: 'query', - description: - 'Get the current commit CID & revision of the specified repo. Does not require auth.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['cid', 'rev'], - properties: { - cid: { - type: 'string', - format: 'cid', - }, - rev: { - type: 'string', - format: 'tid', - }, - }, - }, - }, - errors: [ - { - name: 'RepoNotFound', - }, - { - name: 'RepoTakendown', - }, - { - name: 'RepoSuspended', - }, - { - name: 'RepoDeactivated', - }, - ], - }, - }, - }, - ComAtprotoSyncGetRecord: { - lexicon: 1, - id: 'com.atproto.sync.getRecord', - defs: { - main: { - type: 'query', - description: - 'Get data blocks needed to prove the existence or non-existence of record in the current version of repo. Does not require auth.', - parameters: { - type: 'params', - required: ['did', 'collection', 'rkey'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - collection: { - type: 'string', - format: 'nsid', - }, - rkey: { - type: 'string', - description: 'Record Key', - format: 'record-key', - }, - }, - }, - output: { - encoding: 'application/vnd.ipld.car', - }, - errors: [ - { - name: 'RecordNotFound', - }, - { - name: 'RepoNotFound', - }, - { - name: 'RepoTakendown', - }, - { - name: 'RepoSuspended', - }, - { - name: 'RepoDeactivated', - }, - ], - }, - }, - }, - ComAtprotoSyncGetRepo: { - lexicon: 1, - id: 'com.atproto.sync.getRepo', - defs: { - main: { - type: 'query', - description: - "Download a repository export as CAR file. Optionally only a 'diff' since a previous revision. Does not require auth; implemented by PDS.", - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - since: { - type: 'string', - format: 'tid', - description: - "The revision ('rev') of the repo to create a diff from.", - }, - }, - }, - output: { - encoding: 'application/vnd.ipld.car', - }, - errors: [ - { - name: 'RepoNotFound', - }, - { - name: 'RepoTakendown', - }, - { - name: 'RepoSuspended', - }, - { - name: 'RepoDeactivated', - }, - ], - }, - }, - }, - ComAtprotoSyncGetRepoStatus: { - lexicon: 1, - id: 'com.atproto.sync.getRepoStatus', - defs: { - main: { - type: 'query', - description: - 'Get the hosting status for a repository, on this server. Expected to be implemented by PDS and Relay.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'active'], - properties: { - did: { - type: 'string', - format: 'did', - }, - active: { - type: 'boolean', - }, - status: { - type: 'string', - description: - 'If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.', - knownValues: [ - 'takendown', - 'suspended', - 'deleted', - 'deactivated', - 'desynchronized', - 'throttled', - ], - }, - rev: { - type: 'string', - format: 'tid', - description: - 'Optional field, the current rev of the repo, if active=true', - }, - }, - }, - }, - errors: [ - { - name: 'RepoNotFound', - }, - ], - }, - }, - }, - ComAtprotoSyncListBlobs: { - lexicon: 1, - id: 'com.atproto.sync.listBlobs', - defs: { - main: { - type: 'query', - description: - 'List blob CIDs for an account, since some repo revision. Does not require auth; implemented by PDS.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'The DID of the repo.', - }, - since: { - type: 'string', - format: 'tid', - description: 'Optional revision of the repo to list blobs since.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 1000, - default: 500, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['cids'], - properties: { - cursor: { - type: 'string', - }, - cids: { - type: 'array', - items: { - type: 'string', - format: 'cid', - }, - }, - }, - }, - }, - errors: [ - { - name: 'RepoNotFound', - }, - { - name: 'RepoTakendown', - }, - { - name: 'RepoSuspended', - }, - { - name: 'RepoDeactivated', - }, - ], - }, - }, - }, - ComAtprotoSyncListHosts: { - lexicon: 1, - id: 'com.atproto.sync.listHosts', - defs: { - main: { - type: 'query', - description: - 'Enumerates upstream hosts (eg, PDS or relay instances) that this service consumes from. Implemented by relays.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 1000, - default: 200, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['hosts'], - properties: { - cursor: { - type: 'string', - }, - hosts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.sync.listHosts#host', - }, - description: - 'Sort order is not formally specified. Recommended order is by time host was first seen by the server, with oldest first.', - }, - }, - }, - }, - }, - host: { - type: 'object', - required: ['hostname'], - properties: { - hostname: { - type: 'string', - description: 'hostname of server; not a URL (no scheme)', - }, - seq: { - type: 'integer', - description: - 'Recent repo stream event sequence number. May be delayed from actual stream processing (eg, persisted cursor not in-memory cursor).', - }, - accountCount: { - type: 'integer', - }, - status: { - type: 'ref', - ref: 'lex:com.atproto.sync.defs#hostStatus', - }, - }, - }, - }, - }, - ComAtprotoSyncListRepos: { - lexicon: 1, - id: 'com.atproto.sync.listRepos', - defs: { - main: { - type: 'query', - description: - 'Enumerates all the DID, rev, and commit CID for all repos hosted by this service. Does not require auth; implemented by PDS and Relay.', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 1000, - default: 500, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repos'], - properties: { - cursor: { - type: 'string', - }, - repos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.sync.listRepos#repo', - }, - }, - }, - }, - }, - }, - repo: { - type: 'object', - required: ['did', 'head', 'rev'], - properties: { - did: { - type: 'string', - format: 'did', - }, - head: { - type: 'string', - format: 'cid', - description: 'Current repo commit CID', - }, - rev: { - type: 'string', - format: 'tid', - }, - active: { - type: 'boolean', - }, - status: { - type: 'string', - description: - 'If active=false, this optional field indicates a possible reason for why the account is not active. If active=false and no status is supplied, then the host makes no claim for why the repository is no longer being hosted.', - knownValues: [ - 'takendown', - 'suspended', - 'deleted', - 'deactivated', - 'desynchronized', - 'throttled', - ], - }, - }, - }, - }, - }, - ComAtprotoSyncListReposByCollection: { - lexicon: 1, - id: 'com.atproto.sync.listReposByCollection', - defs: { - main: { - type: 'query', - description: - 'Enumerates all the DIDs which have records with the given collection NSID.', - parameters: { - type: 'params', - required: ['collection'], - properties: { - collection: { - type: 'string', - format: 'nsid', - }, - limit: { - type: 'integer', - description: - 'Maximum size of response set. Recommend setting a large maximum (1000+) when enumerating large DID lists.', - minimum: 1, - maximum: 2000, - default: 500, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repos'], - properties: { - cursor: { - type: 'string', - }, - repos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.sync.listReposByCollection#repo', - }, - }, - }, - }, - }, - }, - repo: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - }, - }, - ComAtprotoSyncNotifyOfUpdate: { - lexicon: 1, - id: 'com.atproto.sync.notifyOfUpdate', - defs: { - main: { - type: 'procedure', - description: - 'Notify a crawling service of a recent update, and that crawling should resume. Intended use is after a gap between repo stream events caused the crawling service to disconnect. Does not require auth; implemented by Relay. DEPRECATED: just use com.atproto.sync.requestCrawl', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['hostname'], - properties: { - hostname: { - type: 'string', - description: - 'Hostname of the current service (usually a PDS) that is notifying of update.', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoSyncRequestCrawl: { - lexicon: 1, - id: 'com.atproto.sync.requestCrawl', - defs: { - main: { - type: 'procedure', - description: - 'Request a service to persistently crawl hosted repos. Expected use is new PDS instances declaring their existence to Relays. Does not require auth.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['hostname'], - properties: { - hostname: { - type: 'string', - description: - 'Hostname of the current service (eg, PDS) that is requesting to be crawled.', - }, - }, - }, - }, - errors: [ - { - name: 'HostBanned', - }, - ], - }, - }, - }, - ComAtprotoSyncSubscribeRepos: { - lexicon: 1, - id: 'com.atproto.sync.subscribeRepos', - defs: { - main: { - type: 'subscription', - description: - 'Repository event stream, aka Firehose endpoint. Outputs repo commits with diff data, and identity update events, for all repositories on the current server. See the atproto specifications for details around stream sequencing, repo versioning, CAR diff format, and more. Public and does not require auth; implemented by PDS and Relay.', - parameters: { - type: 'params', - properties: { - cursor: { - type: 'integer', - description: 'The last known event seq number to backfill from.', - }, - }, - }, - message: { - schema: { - type: 'union', - refs: [ - 'lex:com.atproto.sync.subscribeRepos#commit', - 'lex:com.atproto.sync.subscribeRepos#sync', - 'lex:com.atproto.sync.subscribeRepos#identity', - 'lex:com.atproto.sync.subscribeRepos#account', - 'lex:com.atproto.sync.subscribeRepos#info', - ], - }, - }, - errors: [ - { - name: 'FutureCursor', - }, - { - name: 'ConsumerTooSlow', - description: - 'If the consumer of the stream can not keep up with events, and a backlog gets too large, the server will drop the connection.', - }, - ], - }, - commit: { - type: 'object', - description: - 'Represents an update of repository state. Note that empty commits are allowed, which include no repo data changes, but an update to rev and signature.', - required: [ - 'seq', - 'rebase', - 'tooBig', - 'repo', - 'commit', - 'rev', - 'since', - 'blocks', - 'ops', - 'blobs', - 'time', - ], - nullable: ['since'], - properties: { - seq: { - type: 'integer', - description: 'The stream sequence number of this message.', - }, - rebase: { - type: 'boolean', - description: 'DEPRECATED -- unused', - }, - tooBig: { - type: 'boolean', - description: - 'DEPRECATED -- replaced by #sync event and data limits. Indicates that this commit contained too many ops, or data size was too large. Consumers will need to make a separate request to get missing data.', - }, - repo: { - type: 'string', - format: 'did', - description: - "The repo this event comes from. Note that all other message types name this field 'did'.", - }, - commit: { - type: 'cid-link', - description: 'Repo commit object CID.', - }, - rev: { - type: 'string', - format: 'tid', - description: - 'The rev of the emitted commit. Note that this information is also in the commit object included in blocks, unless this is a tooBig event.', - }, - since: { - type: 'string', - format: 'tid', - description: - 'The rev of the last emitted commit from this repo (if any).', - }, - blocks: { - type: 'bytes', - description: - "CAR file containing relevant blocks, as a diff since the previous repo state. The commit must be included as a block, and the commit block CID must be the first entry in the CAR header 'roots' list.", - maxLength: 2000000, - }, - ops: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.sync.subscribeRepos#repoOp', - description: - 'List of repo mutation operations in this commit (eg, records created, updated, or deleted).', - }, - maxLength: 200, - }, - blobs: { - type: 'array', - items: { - type: 'cid-link', - description: - 'DEPRECATED -- will soon always be empty. List of new blobs (by CID) referenced by records in this commit.', - }, - }, - prevData: { - type: 'cid-link', - description: - "The root CID of the MST tree for the previous commit from this repo (indicated by the 'since' revision field in this message). Corresponds to the 'data' field in the repo commit object. NOTE: this field is effectively required for the 'inductive' version of firehose.", - }, - time: { - type: 'string', - format: 'datetime', - description: - 'Timestamp of when this message was originally broadcast.', - }, - }, - }, - sync: { - type: 'object', - description: - 'Updates the repo to a new state, without necessarily including that state on the firehose. Used to recover from broken commit streams, data loss incidents, or in situations where upstream host does not know recent state of the repository.', - required: ['seq', 'did', 'blocks', 'rev', 'time'], - properties: { - seq: { - type: 'integer', - description: 'The stream sequence number of this message.', - }, - did: { - type: 'string', - format: 'did', - description: - 'The account this repo event corresponds to. Must match that in the commit object.', - }, - blocks: { - type: 'bytes', - description: - "CAR file containing the commit, as a block. The CAR header must include the commit block CID as the first 'root'.", - maxLength: 10000, - }, - rev: { - type: 'string', - description: - 'The rev of the commit. This value must match that in the commit object.', - }, - time: { - type: 'string', - format: 'datetime', - description: - 'Timestamp of when this message was originally broadcast.', - }, - }, - }, - identity: { - type: 'object', - description: - "Represents a change to an account's identity. Could be an updated handle, signing key, or pds hosting endpoint. Serves as a prod to all downstream services to refresh their identity cache.", - required: ['seq', 'did', 'time'], - properties: { - seq: { - type: 'integer', - }, - did: { - type: 'string', - format: 'did', - }, - time: { - type: 'string', - format: 'datetime', - }, - handle: { - type: 'string', - format: 'handle', - description: - "The current handle for the account, or 'handle.invalid' if validation fails. This field is optional, might have been validated or passed-through from an upstream source. Semantics and behaviors for PDS vs Relay may evolve in the future; see atproto specs for more details.", - }, - }, - }, - account: { - type: 'object', - description: - "Represents a change to an account's status on a host (eg, PDS or Relay). The semantics of this event are that the status is at the host which emitted the event, not necessarily that at the currently active PDS. Eg, a Relay takedown would emit a takedown with active=false, even if the PDS is still active.", - required: ['seq', 'did', 'time', 'active'], - properties: { - seq: { - type: 'integer', - }, - did: { - type: 'string', - format: 'did', - }, - time: { - type: 'string', - format: 'datetime', - }, - active: { - type: 'boolean', - description: - 'Indicates that the account has a repository which can be fetched from the host that emitted this event.', - }, - status: { - type: 'string', - description: - 'If active=false, this optional field indicates a reason for why the account is not active.', - knownValues: [ - 'takendown', - 'suspended', - 'deleted', - 'deactivated', - 'desynchronized', - 'throttled', - ], - }, - }, - }, - info: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - knownValues: ['OutdatedCursor'], - }, - message: { - type: 'string', - }, - }, - }, - repoOp: { - type: 'object', - description: 'A repo operation, ie a mutation of a single record.', - required: ['action', 'path', 'cid'], - nullable: ['cid'], - properties: { - action: { - type: 'string', - knownValues: ['create', 'update', 'delete'], - }, - path: { - type: 'string', - }, - cid: { - type: 'cid-link', - description: - 'For creates and updates, the new record CID. For deletions, null.', - }, - prev: { - type: 'cid-link', - description: - 'For updates and deletes, the previous record CID (required for inductive firehose). For creations, field should not be defined.', - }, - }, - }, - }, - }, - ComAtprotoTempAddReservedHandle: { - lexicon: 1, - id: 'com.atproto.temp.addReservedHandle', - defs: { - main: { - type: 'procedure', - description: 'Add a handle to the set of reserved handles.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['handle'], - properties: { - handle: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - }, - }, - }, - ComAtprotoTempCheckHandleAvailability: { - lexicon: 1, - id: 'com.atproto.temp.checkHandleAvailability', - defs: { - main: { - type: 'query', - description: - 'Checks whether the provided handle is available. If the handle is not available, available suggestions will be returned. Optional inputs will be used to generate suggestions.', - parameters: { - type: 'params', - required: ['handle'], - properties: { - handle: { - type: 'string', - format: 'handle', - description: - 'Tentative handle. Will be checked for availability or used to build handle suggestions.', - }, - email: { - type: 'string', - description: - 'User-provided email. Might be used to build handle suggestions.', - }, - birthDate: { - type: 'string', - format: 'datetime', - description: - 'User-provided birth date. Might be used to build handle suggestions.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['handle', 'result'], - properties: { - handle: { - type: 'string', - format: 'handle', - description: 'Echo of the input handle.', - }, - result: { - type: 'union', - refs: [ - 'lex:com.atproto.temp.checkHandleAvailability#resultAvailable', - 'lex:com.atproto.temp.checkHandleAvailability#resultUnavailable', - ], - }, - }, - }, - }, - errors: [ - { - name: 'InvalidEmail', - description: 'An invalid email was provided.', - }, - ], - }, - resultAvailable: { - type: 'object', - description: 'Indicates the provided handle is available.', - properties: {}, - }, - resultUnavailable: { - type: 'object', - description: - 'Indicates the provided handle is unavailable and gives suggestions of available handles.', - required: ['suggestions'], - properties: { - suggestions: { - type: 'array', - description: - 'List of suggested handles based on the provided inputs.', - items: { - type: 'ref', - ref: 'lex:com.atproto.temp.checkHandleAvailability#suggestion', - }, - }, - }, - }, - suggestion: { - type: 'object', - required: ['handle', 'method'], - properties: { - handle: { - type: 'string', - format: 'handle', - }, - method: { - type: 'string', - description: - 'Method used to build this suggestion. Should be considered opaque to clients. Can be used for metrics.', - }, - }, - }, - }, - }, - ComAtprotoTempCheckSignupQueue: { - lexicon: 1, - id: 'com.atproto.temp.checkSignupQueue', - defs: { - main: { - type: 'query', - description: 'Check accounts location in signup queue.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['activated'], - properties: { - activated: { - type: 'boolean', - }, - placeInQueue: { - type: 'integer', - }, - estimatedTimeMs: { - type: 'integer', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoTempDereferenceScope: { - lexicon: 1, - id: 'com.atproto.temp.dereferenceScope', - defs: { - main: { - type: 'query', - description: - 'Allows finding the oauth permission scope from a reference', - parameters: { - type: 'params', - required: ['scope'], - properties: { - scope: { - type: 'string', - description: "The scope reference (starts with 'ref:')", - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['scope'], - properties: { - scope: { - type: 'string', - description: 'The full oauth permission scope', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidScopeReference', - description: 'An invalid scope reference was provided.', - }, - ], - }, - }, - }, - ComAtprotoTempFetchLabels: { - lexicon: 1, - id: 'com.atproto.temp.fetchLabels', - defs: { - main: { - type: 'query', - description: - 'DEPRECATED: use queryLabels or subscribeLabels instead -- Fetch all labels from a labeler created after a certain date.', - parameters: { - type: 'params', - properties: { - since: { - type: 'integer', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 250, - default: 50, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['labels'], - properties: { - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - }, - }, - }, - }, - }, - }, - ComAtprotoTempRequestPhoneVerification: { - lexicon: 1, - id: 'com.atproto.temp.requestPhoneVerification', - defs: { - main: { - type: 'procedure', - description: - 'Request a verification code to be sent to the supplied phone number', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['phoneNumber'], - properties: { - phoneNumber: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ComAtprotoTempRevokeAccountCredentials: { - lexicon: 1, - id: 'com.atproto.temp.revokeAccountCredentials', - defs: { - main: { - type: 'procedure', - description: - 'Revoke sessions, password, and app passwords associated with account. May be resolved by a password reset.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['account'], - properties: { - account: { - type: 'string', - format: 'at-identifier', - }, - }, - }, - }, - }, - }, - }, - ComGermnetworkDeclaration: { - lexicon: 1, - id: 'com.germnetwork.declaration', - defs: { - main: { - type: 'record', - description: 'A declaration of a Germ Network account', - key: 'literal:self', - record: { - type: 'object', - required: ['version', 'currentKey'], - properties: { - version: { - type: 'string', - description: - 'Semver version number, without pre-release or build information, for the format of opaque content', - minLength: 5, - maxLength: 14, - }, - currentKey: { - type: 'bytes', - description: - 'Opaque value, an ed25519 public key prefixed with a byte enum', - }, - messageMe: { - type: 'ref', - description: 'Controls who can message this account', - ref: 'lex:com.germnetwork.declaration#messageMe', - }, - keyPackage: { - type: 'bytes', - description: - 'Opaque value, contains MLS KeyPackage(s), and other signature data, and is signed by the currentKey', - }, - continuityProofs: { - type: 'array', - description: 'Array of opaque values to allow for key rolling', - items: { - type: 'bytes', - }, - maxLength: 1000, - }, - }, - }, - }, - messageMe: { - type: 'object', - required: ['showButtonTo', 'messageMeUrl'], - properties: { - messageMeUrl: { - type: 'string', - description: - 'A URL to present to an account that does not have its own com.germnetwork.declaration record, must have an empty fragment component, where the app should fill in the fragment component with the DIDs of the two accounts who wish to message each other', - format: 'uri', - minLength: 1, - maxLength: 2047, - }, - showButtonTo: { - type: 'string', - knownValues: ['none', 'usersIFollow', 'everyone'], - description: - "The policy of who can message the account, this value is included in the keyPackage, but is duplicated here to allow applications to decide if they should show a 'Message on Germ' button to the viewer.", - minLength: 1, - maxLength: 100, - }, - }, - }, - }, - }, - ToolsOzoneCommunicationCreateTemplate: { - lexicon: 1, - id: 'tools.ozone.communication.createTemplate', - defs: { - main: { - type: 'procedure', - description: - 'Administrative action to create a new, re-usable communication (email for now) template.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subject', 'contentMarkdown', 'name'], - properties: { - name: { - type: 'string', - description: 'Name of the template.', - }, - contentMarkdown: { - type: 'string', - description: - 'Content of the template, markdown supported, can contain variable placeholders.', - }, - subject: { - type: 'string', - description: 'Subject of the message, used in emails.', - }, - lang: { - type: 'string', - format: 'language', - description: 'Message language.', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'DID of the user who is creating the template.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.communication.defs#templateView', - }, - }, - errors: [ - { - name: 'DuplicateTemplateName', - }, - ], - }, - }, - }, - ToolsOzoneCommunicationDefs: { - lexicon: 1, - id: 'tools.ozone.communication.defs', - defs: { - templateView: { - type: 'object', - required: [ - 'id', - 'name', - 'contentMarkdown', - 'disabled', - 'lastUpdatedBy', - 'createdAt', - 'updatedAt', - ], - properties: { - id: { - type: 'string', - }, - name: { - type: 'string', - description: 'Name of the template.', - }, - subject: { - type: 'string', - description: - 'Content of the template, can contain markdown and variable placeholders.', - }, - contentMarkdown: { - type: 'string', - description: 'Subject of the message, used in emails.', - }, - disabled: { - type: 'boolean', - }, - lang: { - type: 'string', - format: 'language', - description: 'Message language.', - }, - lastUpdatedBy: { - type: 'string', - format: 'did', - description: 'DID of the user who last updated the template.', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - ToolsOzoneCommunicationDeleteTemplate: { - lexicon: 1, - id: 'tools.ozone.communication.deleteTemplate', - defs: { - main: { - type: 'procedure', - description: 'Delete a communication template.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['id'], - properties: { - id: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneCommunicationListTemplates: { - lexicon: 1, - id: 'tools.ozone.communication.listTemplates', - defs: { - main: { - type: 'query', - description: 'Get list of all communication templates.', - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['communicationTemplates'], - properties: { - communicationTemplates: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.communication.defs#templateView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneCommunicationUpdateTemplate: { - lexicon: 1, - id: 'tools.ozone.communication.updateTemplate', - defs: { - main: { - type: 'procedure', - description: - 'Administrative action to update an existing communication template. Allows passing partial fields to patch specific fields only.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['id'], - properties: { - id: { - type: 'string', - description: 'ID of the template to be updated.', - }, - name: { - type: 'string', - description: 'Name of the template.', - }, - lang: { - type: 'string', - format: 'language', - description: 'Message language.', - }, - contentMarkdown: { - type: 'string', - description: - 'Content of the template, markdown supported, can contain variable placeholders.', - }, - subject: { - type: 'string', - description: 'Subject of the message, used in emails.', - }, - updatedBy: { - type: 'string', - format: 'did', - description: 'DID of the user who is updating the template.', - }, - disabled: { - type: 'boolean', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.communication.defs#templateView', - }, - }, - errors: [ - { - name: 'DuplicateTemplateName', - }, - ], - }, - }, - }, - ToolsOzoneHostingGetAccountHistory: { - lexicon: 1, - id: 'tools.ozone.hosting.getAccountHistory', - defs: { - main: { - type: 'query', - description: - 'Get account history, e.g. log of updated email addresses or other identity information.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - events: { - type: 'array', - items: { - type: 'string', - knownValues: [ - 'accountCreated', - 'emailUpdated', - 'emailConfirmed', - 'passwordUpdated', - 'handleUpdated', - ], - }, - }, - cursor: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['events'], - properties: { - cursor: { - type: 'string', - }, - events: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.hosting.getAccountHistory#event', - }, - }, - }, - }, - }, - }, - event: { - type: 'object', - required: ['details', 'createdBy', 'createdAt'], - properties: { - details: { - type: 'union', - refs: [ - 'lex:tools.ozone.hosting.getAccountHistory#accountCreated', - 'lex:tools.ozone.hosting.getAccountHistory#emailUpdated', - 'lex:tools.ozone.hosting.getAccountHistory#emailConfirmed', - 'lex:tools.ozone.hosting.getAccountHistory#passwordUpdated', - 'lex:tools.ozone.hosting.getAccountHistory#handleUpdated', - ], - }, - createdBy: { - type: 'string', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - accountCreated: { - type: 'object', - required: [], - properties: { - email: { - type: 'string', - }, - handle: { - type: 'string', - format: 'handle', - }, - }, - }, - emailUpdated: { - type: 'object', - required: ['email'], - properties: { - email: { - type: 'string', - }, - }, - }, - emailConfirmed: { - type: 'object', - required: ['email'], - properties: { - email: { - type: 'string', - }, - }, - }, - passwordUpdated: { - type: 'object', - required: [], - properties: {}, - }, - handleUpdated: { - type: 'object', - required: ['handle'], - properties: { - handle: { - type: 'string', - format: 'handle', - }, - }, - }, - }, - }, - ToolsOzoneModerationCancelScheduledActions: { - lexicon: 1, - id: 'tools.ozone.moderation.cancelScheduledActions', - defs: { - main: { - type: 'procedure', - description: - 'Cancel all pending scheduled moderation actions for specified subjects', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subjects'], - properties: { - subjects: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'did', - }, - description: - 'Array of DID subjects to cancel scheduled actions for', - }, - comment: { - type: 'string', - description: - 'Optional comment describing the reason for cancellation', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.cancelScheduledActions#cancellationResults', - }, - }, - }, - cancellationResults: { - type: 'object', - required: ['succeeded', 'failed'], - properties: { - succeeded: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - description: - 'DIDs for which all pending scheduled actions were successfully cancelled', - }, - failed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.cancelScheduledActions#failedCancellation', - }, - description: - 'DIDs for which cancellation failed with error details', - }, - }, - }, - failedCancellation: { - type: 'object', - required: ['did', 'error'], - properties: { - did: { - type: 'string', - format: 'did', - }, - error: { - type: 'string', - }, - errorCode: { - type: 'string', - }, - }, - }, - }, - }, - ToolsOzoneModerationDefs: { - lexicon: 1, - id: 'tools.ozone.moderation.defs', - defs: { - modEventView: { - type: 'object', - required: [ - 'id', - 'event', - 'subject', - 'subjectBlobCids', - 'createdBy', - 'createdAt', - ], - properties: { - id: { - type: 'integer', - }, - event: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#modEventTakedown', - 'lex:tools.ozone.moderation.defs#modEventReverseTakedown', - 'lex:tools.ozone.moderation.defs#modEventComment', - 'lex:tools.ozone.moderation.defs#modEventReport', - 'lex:tools.ozone.moderation.defs#modEventLabel', - 'lex:tools.ozone.moderation.defs#modEventAcknowledge', - 'lex:tools.ozone.moderation.defs#modEventEscalate', - 'lex:tools.ozone.moderation.defs#modEventMute', - 'lex:tools.ozone.moderation.defs#modEventUnmute', - 'lex:tools.ozone.moderation.defs#modEventMuteReporter', - 'lex:tools.ozone.moderation.defs#modEventUnmuteReporter', - 'lex:tools.ozone.moderation.defs#modEventEmail', - 'lex:tools.ozone.moderation.defs#modEventResolveAppeal', - 'lex:tools.ozone.moderation.defs#modEventDivert', - 'lex:tools.ozone.moderation.defs#modEventTag', - 'lex:tools.ozone.moderation.defs#accountEvent', - 'lex:tools.ozone.moderation.defs#identityEvent', - 'lex:tools.ozone.moderation.defs#recordEvent', - 'lex:tools.ozone.moderation.defs#modEventPriorityScore', - 'lex:tools.ozone.moderation.defs#ageAssuranceEvent', - 'lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent', - 'lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent', - 'lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent', - 'lex:tools.ozone.moderation.defs#scheduleTakedownEvent', - 'lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent', - ], - }, - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - 'lex:chat.bsky.convo.defs#messageRef', - ], - }, - subjectBlobCids: { - type: 'array', - items: { - type: 'string', - }, - }, - createdBy: { - type: 'string', - format: 'did', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - creatorHandle: { - type: 'string', - }, - subjectHandle: { - type: 'string', - }, - modTool: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modTool', - }, - }, - }, - modEventViewDetail: { - type: 'object', - required: [ - 'id', - 'event', - 'subject', - 'subjectBlobs', - 'createdBy', - 'createdAt', - ], - properties: { - id: { - type: 'integer', - }, - event: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#modEventTakedown', - 'lex:tools.ozone.moderation.defs#modEventReverseTakedown', - 'lex:tools.ozone.moderation.defs#modEventComment', - 'lex:tools.ozone.moderation.defs#modEventReport', - 'lex:tools.ozone.moderation.defs#modEventLabel', - 'lex:tools.ozone.moderation.defs#modEventAcknowledge', - 'lex:tools.ozone.moderation.defs#modEventEscalate', - 'lex:tools.ozone.moderation.defs#modEventMute', - 'lex:tools.ozone.moderation.defs#modEventUnmute', - 'lex:tools.ozone.moderation.defs#modEventMuteReporter', - 'lex:tools.ozone.moderation.defs#modEventUnmuteReporter', - 'lex:tools.ozone.moderation.defs#modEventEmail', - 'lex:tools.ozone.moderation.defs#modEventResolveAppeal', - 'lex:tools.ozone.moderation.defs#modEventDivert', - 'lex:tools.ozone.moderation.defs#modEventTag', - 'lex:tools.ozone.moderation.defs#accountEvent', - 'lex:tools.ozone.moderation.defs#identityEvent', - 'lex:tools.ozone.moderation.defs#recordEvent', - 'lex:tools.ozone.moderation.defs#modEventPriorityScore', - 'lex:tools.ozone.moderation.defs#ageAssuranceEvent', - 'lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent', - 'lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent', - 'lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent', - 'lex:tools.ozone.moderation.defs#scheduleTakedownEvent', - 'lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent', - ], - }, - subject: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#repoView', - 'lex:tools.ozone.moderation.defs#repoViewNotFound', - 'lex:tools.ozone.moderation.defs#recordView', - 'lex:tools.ozone.moderation.defs#recordViewNotFound', - ], - }, - subjectBlobs: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#blobView', - }, - }, - createdBy: { - type: 'string', - format: 'did', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - modTool: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modTool', - }, - }, - }, - subjectStatusView: { - type: 'object', - required: ['id', 'subject', 'createdAt', 'updatedAt', 'reviewState'], - properties: { - id: { - type: 'integer', - }, - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - 'lex:chat.bsky.convo.defs#messageRef', - ], - }, - hosting: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#accountHosting', - 'lex:tools.ozone.moderation.defs#recordHosting', - ], - }, - subjectBlobCids: { - type: 'array', - items: { - type: 'string', - format: 'cid', - }, - }, - subjectRepoHandle: { - type: 'string', - }, - updatedAt: { - type: 'string', - format: 'datetime', - description: - 'Timestamp referencing when the last update was made to the moderation status of the subject', - }, - createdAt: { - type: 'string', - format: 'datetime', - description: - 'Timestamp referencing the first moderation status impacting event was emitted on the subject', - }, - reviewState: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectReviewState', - }, - comment: { - type: 'string', - description: 'Sticky comment on the subject.', - }, - priorityScore: { - type: 'integer', - description: - 'Numeric value representing the level of priority. Higher score means higher priority.', - minimum: 0, - maximum: 100, - }, - muteUntil: { - type: 'string', - format: 'datetime', - }, - muteReportingUntil: { - type: 'string', - format: 'datetime', - }, - lastReviewedBy: { - type: 'string', - format: 'did', - }, - lastReviewedAt: { - type: 'string', - format: 'datetime', - }, - lastReportedAt: { - type: 'string', - format: 'datetime', - }, - lastAppealedAt: { - type: 'string', - format: 'datetime', - description: - 'Timestamp referencing when the author of the subject appealed a moderation action', - }, - takendown: { - type: 'boolean', - }, - appealed: { - type: 'boolean', - description: - 'True indicates that the a previously taken moderator action was appealed against, by the author of the content. False indicates last appeal was resolved by moderators.', - }, - suspendUntil: { - type: 'string', - format: 'datetime', - }, - tags: { - type: 'array', - items: { - type: 'string', - }, - }, - accountStats: { - description: 'Statistics related to the account subject', - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#accountStats', - }, - recordsStats: { - description: - "Statistics related to the record subjects authored by the subject's account", - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#recordsStats', - }, - accountStrike: { - description: - 'Strike information for the account (account-level only)', - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#accountStrike', - }, - ageAssuranceState: { - type: 'string', - description: 'Current age assurance state of the subject.', - knownValues: ['pending', 'assured', 'unknown', 'reset', 'blocked'], - }, - ageAssuranceUpdatedBy: { - type: 'string', - description: - 'Whether or not the last successful update to age assurance was made by the user or admin.', - knownValues: ['admin', 'user'], - }, - }, - }, - subjectView: { - description: - "Detailed view of a subject. For record subjects, the author's repo and profile will be returned.", - type: 'object', - required: ['type', 'subject'], - properties: { - type: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#subjectType', - }, - subject: { - type: 'string', - }, - status: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', - }, - repo: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#repoViewDetail', - }, - profile: { - type: 'union', - refs: [], - }, - record: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#recordViewDetail', - }, - }, - }, - accountStats: { - description: 'Statistics about a particular account subject', - type: 'object', - properties: { - reportCount: { - description: 'Total number of reports on the account', - type: 'integer', - }, - appealCount: { - description: - 'Total number of appeals against a moderation action on the account', - type: 'integer', - }, - suspendCount: { - description: 'Number of times the account was suspended', - type: 'integer', - }, - escalateCount: { - description: 'Number of times the account was escalated', - type: 'integer', - }, - takedownCount: { - description: 'Number of times the account was taken down', - type: 'integer', - }, - }, - }, - recordsStats: { - description: 'Statistics about a set of record subject items', - type: 'object', - properties: { - totalReports: { - description: - 'Cumulative sum of the number of reports on the items in the set', - type: 'integer', - }, - reportedCount: { - description: 'Number of items that were reported at least once', - type: 'integer', - }, - escalatedCount: { - description: 'Number of items that were escalated at least once', - type: 'integer', - }, - appealedCount: { - description: 'Number of items that were appealed at least once', - type: 'integer', - }, - subjectCount: { - description: 'Total number of item in the set', - type: 'integer', - }, - pendingCount: { - description: - 'Number of item currently in "reviewOpen" or "reviewEscalated" state', - type: 'integer', - }, - processedCount: { - description: - 'Number of item currently in "reviewNone" or "reviewClosed" state', - type: 'integer', - }, - takendownCount: { - description: 'Number of item currently taken down', - type: 'integer', - }, - }, - }, - accountStrike: { - description: 'Strike information for an account', - type: 'object', - properties: { - activeStrikeCount: { - description: - 'Current number of active strikes (excluding expired strikes)', - type: 'integer', - }, - totalStrikeCount: { - description: - 'Total number of strikes ever received (including expired strikes)', - type: 'integer', - }, - firstStrikeAt: { - description: 'Timestamp of the first strike received', - type: 'string', - format: 'datetime', - }, - lastStrikeAt: { - description: 'Timestamp of the most recent strike received', - type: 'string', - format: 'datetime', - }, - }, - }, - subjectReviewState: { - type: 'string', - knownValues: [ - 'tools.ozone.moderation.defs#reviewOpen', - 'tools.ozone.moderation.defs#reviewEscalated', - 'tools.ozone.moderation.defs#reviewClosed', - 'tools.ozone.moderation.defs#reviewNone', - ], - }, - reviewOpen: { - type: 'token', - description: - 'Moderator review status of a subject: Open. Indicates that the subject needs to be reviewed by a moderator', - }, - reviewEscalated: { - type: 'token', - description: - 'Moderator review status of a subject: Escalated. Indicates that the subject was escalated for review by a moderator', - }, - reviewClosed: { - type: 'token', - description: - 'Moderator review status of a subject: Closed. Indicates that the subject was already reviewed and resolved by a moderator', - }, - reviewNone: { - type: 'token', - description: - 'Moderator review status of a subject: Unnecessary. Indicates that the subject does not need a review at the moment but there is probably some moderation related metadata available for it', - }, - modEventTakedown: { - type: 'object', - description: 'Take down a subject permanently or temporarily', - properties: { - comment: { - type: 'string', - }, - durationInHours: { - type: 'integer', - description: - 'Indicates how long the takedown should be in effect before automatically expiring.', - }, - acknowledgeAccountSubjects: { - type: 'boolean', - description: - 'If true, all other reports on content authored by this account will be resolved (acknowledged).', - }, - policies: { - type: 'array', - maxLength: 5, - items: { - type: 'string', - }, - description: - 'Names/Keywords of the policies that drove the decision.', - }, - severityLevel: { - type: 'string', - description: - "Severity level of the violation (e.g., 'sev-0', 'sev-1', 'sev-2', etc.).", - }, - targetServices: { - type: 'array', - items: { - type: 'string', - knownValues: ['appview', 'pds'], - }, - description: - 'List of services where the takedown should be applied. If empty or not provided, takedown is applied on all configured services.', - }, - strikeCount: { - type: 'integer', - description: - 'Number of strikes to assign to the user for this violation.', - }, - strikeExpiresAt: { - type: 'string', - format: 'datetime', - description: - 'When the strike should expire. If not provided, the strike never expires.', - }, - }, - }, - modEventReverseTakedown: { - type: 'object', - description: 'Revert take down action on a subject', - properties: { - comment: { - type: 'string', - description: 'Describe reasoning behind the reversal.', - }, - policies: { - type: 'array', - maxLength: 5, - items: { - type: 'string', - }, - description: - 'Names/Keywords of the policy infraction for which takedown is being reversed.', - }, - severityLevel: { - type: 'string', - description: - "Severity level of the violation. Usually set from the last policy infraction's severity.", - }, - strikeCount: { - type: 'integer', - description: - "Number of strikes to subtract from the user's strike count. Usually set from the last policy infraction's severity.", - }, - }, - }, - modEventResolveAppeal: { - type: 'object', - description: 'Resolve appeal on a subject', - properties: { - comment: { - type: 'string', - description: 'Describe resolution.', - }, - }, - }, - modEventComment: { - type: 'object', - description: - 'Add a comment to a subject. An empty comment will clear any previously set sticky comment.', - properties: { - comment: { - type: 'string', - }, - sticky: { - type: 'boolean', - description: 'Make the comment persistent on the subject', - }, - }, - }, - modEventReport: { - type: 'object', - description: 'Report a subject', - required: ['reportType'], - properties: { - comment: { - type: 'string', - }, - isReporterMuted: { - type: 'boolean', - description: - "Set to true if the reporter was muted from reporting at the time of the event. These reports won't impact the reviewState of the subject.", - }, - reportType: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#reasonType', - }, - }, - }, - modEventLabel: { - type: 'object', - description: 'Apply/Negate labels on a subject', - required: ['createLabelVals', 'negateLabelVals'], - properties: { - comment: { - type: 'string', - }, - createLabelVals: { - type: 'array', - items: { - type: 'string', - }, - }, - negateLabelVals: { - type: 'array', - items: { - type: 'string', - }, - }, - durationInHours: { - type: 'integer', - description: - 'Indicates how long the label will remain on the subject. Only applies on labels that are being added.', - }, - }, - }, - modEventPriorityScore: { - type: 'object', - description: - 'Set priority score of the subject. Higher score means higher priority.', - required: ['score'], - properties: { - comment: { - type: 'string', - }, - score: { - type: 'integer', - minimum: 0, - maximum: 100, - }, - }, - }, - ageAssuranceEvent: { - type: 'object', - description: - 'Age assurance info coming directly from users. Only works on DID subjects.', - required: ['createdAt', 'status', 'attemptId'], - properties: { - createdAt: { - type: 'string', - format: 'datetime', - description: 'The date and time of this write operation.', - }, - attemptId: { - type: 'string', - description: - 'The unique identifier for this instance of the age assurance flow, in UUID format.', - }, - status: { - type: 'string', - description: 'The status of the Age Assurance process.', - knownValues: ['unknown', 'pending', 'assured'], - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - countryCode: { - type: 'string', - description: - 'The ISO 3166-1 alpha-2 country code provided when beginning the Age Assurance flow.', - }, - regionCode: { - type: 'string', - description: - 'The ISO 3166-2 region code provided when beginning the Age Assurance flow.', - }, - initIp: { - type: 'string', - description: 'The IP address used when initiating the AA flow.', - }, - initUa: { - type: 'string', - description: 'The user agent used when initiating the AA flow.', - }, - completeIp: { - type: 'string', - description: 'The IP address used when completing the AA flow.', - }, - completeUa: { - type: 'string', - description: 'The user agent used when completing the AA flow.', - }, - }, - }, - ageAssuranceOverrideEvent: { - type: 'object', - description: - 'Age assurance status override by moderators. Only works on DID subjects.', - required: ['comment', 'status'], - properties: { - status: { - type: 'string', - description: - 'The status to be set for the user decided by a moderator, overriding whatever value the user had previously. Use reset to default to original state.', - knownValues: ['assured', 'reset', 'blocked'], - }, - access: { - type: 'ref', - ref: 'lex:app.bsky.ageassurance.defs#access', - }, - comment: { - type: 'string', - minLength: 1, - description: 'Comment describing the reason for the override.', - }, - }, - }, - ageAssurancePurgeEvent: { - type: 'object', - description: - 'Purges all age assurance events for the subject. Only works on DID subjects. Moderator-only.', - required: ['comment'], - properties: { - comment: { - type: 'string', - minLength: 1, - description: 'Comment describing the reason for the purge.', - }, - }, - }, - revokeAccountCredentialsEvent: { - type: 'object', - description: - 'Account credentials revocation by moderators. Only works on DID subjects.', - required: ['comment'], - properties: { - comment: { - minLength: 1, - type: 'string', - description: 'Comment describing the reason for the revocation.', - }, - }, - }, - modEventAcknowledge: { - type: 'object', - properties: { - comment: { - type: 'string', - }, - acknowledgeAccountSubjects: { - type: 'boolean', - description: - 'If true, all other reports on content authored by this account will be resolved (acknowledged).', - }, - }, - }, - modEventEscalate: { - type: 'object', - properties: { - comment: { - type: 'string', - }, - }, - }, - modEventMute: { - type: 'object', - description: 'Mute incoming reports on a subject', - required: ['durationInHours'], - properties: { - comment: { - type: 'string', - }, - durationInHours: { - type: 'integer', - description: 'Indicates how long the subject should remain muted.', - }, - }, - }, - modEventUnmute: { - type: 'object', - description: 'Unmute action on a subject', - properties: { - comment: { - type: 'string', - description: 'Describe reasoning behind the reversal.', - }, - }, - }, - modEventMuteReporter: { - type: 'object', - description: 'Mute incoming reports from an account', - properties: { - comment: { - type: 'string', - }, - durationInHours: { - type: 'integer', - description: - 'Indicates how long the account should remain muted. Falsy value here means a permanent mute.', - }, - }, - }, - modEventUnmuteReporter: { - type: 'object', - description: 'Unmute incoming reports from an account', - properties: { - comment: { - type: 'string', - description: 'Describe reasoning behind the reversal.', - }, - }, - }, - modEventEmail: { - type: 'object', - description: 'Keep a log of outgoing email to a user', - required: ['subjectLine'], - properties: { - subjectLine: { - type: 'string', - description: 'The subject line of the email sent to the user.', - }, - content: { - type: 'string', - description: 'The content of the email sent to the user.', - }, - comment: { - type: 'string', - description: 'Additional comment about the outgoing comm.', - }, - policies: { - type: 'array', - maxLength: 5, - items: { - type: 'string', - }, - description: - 'Names/Keywords of the policies that necessitated the email.', - }, - severityLevel: { - type: 'string', - description: - "Severity level of the violation. Normally 'sev-1' that adds strike on repeat offense", - }, - strikeCount: { - type: 'integer', - description: - 'Number of strikes to assign to the user for this violation. Normally 0 as an indicator of a warning and only added as a strike on a repeat offense.', - }, - strikeExpiresAt: { - type: 'string', - format: 'datetime', - description: - 'When the strike should expire. If not provided, the strike never expires.', - }, - isDelivered: { - type: 'boolean', - description: - "Indicates whether the email was successfully delivered to the user's inbox.", - }, - }, - }, - modEventDivert: { - type: 'object', - description: - "Divert a record's blobs to a 3rd party service for further scanning/tagging", - properties: { - comment: { - type: 'string', - }, - }, - }, - modEventTag: { - type: 'object', - description: 'Add/Remove a tag on a subject', - required: ['add', 'remove'], - properties: { - add: { - type: 'array', - items: { - type: 'string', - }, - description: - "Tags to be added to the subject. If already exists, won't be duplicated.", - }, - remove: { - type: 'array', - items: { - type: 'string', - }, - description: - "Tags to be removed to the subject. Ignores a tag If it doesn't exist, won't be duplicated.", - }, - comment: { - type: 'string', - description: 'Additional comment about added/removed tags.', - }, - durationInHours: { - type: 'integer', - description: - 'Indicates how long the tags being added should remain before automatically being removed. Only applies to tags being added.', - }, - }, - }, - accountEvent: { - type: 'object', - description: - 'Logs account status related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.', - required: ['timestamp', 'active'], - properties: { - comment: { - type: 'string', - }, - active: { - type: 'boolean', - description: - 'Indicates that the account has a repository which can be fetched from the host that emitted this event.', - }, - status: { - type: 'string', - knownValues: [ - 'unknown', - 'deactivated', - 'deleted', - 'takendown', - 'suspended', - 'tombstoned', - ], - }, - timestamp: { - type: 'string', - format: 'datetime', - }, - }, - }, - identityEvent: { - type: 'object', - description: - 'Logs identity related events on a repo subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.', - required: ['timestamp'], - properties: { - comment: { - type: 'string', - }, - handle: { - type: 'string', - format: 'handle', - }, - pdsHost: { - type: 'string', - format: 'uri', - }, - tombstone: { - type: 'boolean', - }, - timestamp: { - type: 'string', - format: 'datetime', - }, - }, - }, - recordEvent: { - type: 'object', - description: - 'Logs lifecycle event on a record subject. Normally captured by automod from the firehose and emitted to ozone for historical tracking.', - required: ['timestamp', 'op'], - properties: { - comment: { - type: 'string', - }, - op: { - type: 'string', - knownValues: ['create', 'update', 'delete'], - }, - cid: { - type: 'string', - format: 'cid', - }, - timestamp: { - type: 'string', - format: 'datetime', - }, - }, - }, - scheduleTakedownEvent: { - type: 'object', - description: 'Logs a scheduled takedown action for an account.', - properties: { - comment: { - type: 'string', - }, - executeAt: { - type: 'string', - format: 'datetime', - }, - executeAfter: { - type: 'string', - format: 'datetime', - }, - executeUntil: { - type: 'string', - format: 'datetime', - }, - }, - }, - cancelScheduledTakedownEvent: { - type: 'object', - description: - 'Logs cancellation of a scheduled takedown action for an account.', - properties: { - comment: { - type: 'string', - }, - }, - }, - repoView: { - type: 'object', - required: [ - 'did', - 'handle', - 'relatedRecords', - 'indexedAt', - 'moderation', - ], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - email: { - type: 'string', - }, - relatedRecords: { - type: 'array', - items: { - type: 'unknown', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - moderation: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#moderation', - }, - invitedBy: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - invitesDisabled: { - type: 'boolean', - }, - inviteNote: { - type: 'string', - }, - deactivatedAt: { - type: 'string', - format: 'datetime', - }, - threatSignatures: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#threatSignature', - }, - }, - }, - }, - repoViewDetail: { - type: 'object', - required: [ - 'did', - 'handle', - 'relatedRecords', - 'indexedAt', - 'moderation', - ], - properties: { - did: { - type: 'string', - format: 'did', - }, - handle: { - type: 'string', - format: 'handle', - }, - email: { - type: 'string', - }, - relatedRecords: { - type: 'array', - items: { - type: 'unknown', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - moderation: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#moderationDetail', - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - invitedBy: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - invites: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.server.defs#inviteCode', - }, - }, - invitesDisabled: { - type: 'boolean', - }, - inviteNote: { - type: 'string', - }, - emailConfirmedAt: { - type: 'string', - format: 'datetime', - }, - deactivatedAt: { - type: 'string', - format: 'datetime', - }, - threatSignatures: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#threatSignature', - }, - }, - }, - }, - repoViewNotFound: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - recordView: { - type: 'object', - required: [ - 'uri', - 'cid', - 'value', - 'blobCids', - 'indexedAt', - 'moderation', - 'repo', - ], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - value: { - type: 'unknown', - }, - blobCids: { - type: 'array', - items: { - type: 'string', - format: 'cid', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - moderation: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#moderation', - }, - repo: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#repoView', - }, - }, - }, - recordViewDetail: { - type: 'object', - required: [ - 'uri', - 'cid', - 'value', - 'blobs', - 'indexedAt', - 'moderation', - 'repo', - ], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - value: { - type: 'unknown', - }, - blobs: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#blobView', - }, - }, - labels: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.label.defs#label', - }, - }, - indexedAt: { - type: 'string', - format: 'datetime', - }, - moderation: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#moderationDetail', - }, - repo: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#repoView', - }, - }, - }, - recordViewNotFound: { - type: 'object', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - }, - }, - moderation: { - type: 'object', - properties: { - subjectStatus: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', - }, - }, - }, - moderationDetail: { - type: 'object', - properties: { - subjectStatus: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', - }, - }, - }, - blobView: { - type: 'object', - required: ['cid', 'mimeType', 'size', 'createdAt'], - properties: { - cid: { - type: 'string', - format: 'cid', - }, - mimeType: { - type: 'string', - }, - size: { - type: 'integer', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - details: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#imageDetails', - 'lex:tools.ozone.moderation.defs#videoDetails', - ], - }, - moderation: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#moderation', - }, - }, - }, - imageDetails: { - type: 'object', - required: ['width', 'height'], - properties: { - width: { - type: 'integer', - }, - height: { - type: 'integer', - }, - }, - }, - videoDetails: { - type: 'object', - required: ['width', 'height', 'length'], - properties: { - width: { - type: 'integer', - }, - height: { - type: 'integer', - }, - length: { - type: 'integer', - }, - }, - }, - accountHosting: { - type: 'object', - required: ['status'], - properties: { - status: { - type: 'string', - knownValues: [ - 'takendown', - 'suspended', - 'deleted', - 'deactivated', - 'unknown', - ], - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - deletedAt: { - type: 'string', - format: 'datetime', - }, - deactivatedAt: { - type: 'string', - format: 'datetime', - }, - reactivatedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - recordHosting: { - type: 'object', - required: ['status'], - properties: { - status: { - type: 'string', - knownValues: ['deleted', 'unknown'], - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - deletedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - reporterStats: { - type: 'object', - required: [ - 'did', - 'accountReportCount', - 'recordReportCount', - 'reportedAccountCount', - 'reportedRecordCount', - 'takendownAccountCount', - 'takendownRecordCount', - 'labeledAccountCount', - 'labeledRecordCount', - ], - properties: { - did: { - type: 'string', - format: 'did', - }, - accountReportCount: { - type: 'integer', - description: - 'The total number of reports made by the user on accounts.', - }, - recordReportCount: { - type: 'integer', - description: - 'The total number of reports made by the user on records.', - }, - reportedAccountCount: { - type: 'integer', - description: 'The total number of accounts reported by the user.', - }, - reportedRecordCount: { - type: 'integer', - description: 'The total number of records reported by the user.', - }, - takendownAccountCount: { - type: 'integer', - description: - "The total number of accounts taken down as a result of the user's reports.", - }, - takendownRecordCount: { - type: 'integer', - description: - "The total number of records taken down as a result of the user's reports.", - }, - labeledAccountCount: { - type: 'integer', - description: - "The total number of accounts labeled as a result of the user's reports.", - }, - labeledRecordCount: { - type: 'integer', - description: - "The total number of records labeled as a result of the user's reports.", - }, - }, - }, - modTool: { - type: 'object', - description: - 'Moderation tool information for tracing the source of the action', - required: ['name'], - properties: { - name: { - type: 'string', - description: - "Name/identifier of the source (e.g., 'automod', 'ozone/workspace')", - }, - meta: { - type: 'unknown', - description: 'Additional arbitrary metadata about the source', - }, - }, - }, - timelineEventPlcCreate: { - type: 'token', - description: - 'Moderation event timeline event for a PLC create operation', - }, - timelineEventPlcOperation: { - type: 'token', - description: - 'Moderation event timeline event for generic PLC operation', - }, - timelineEventPlcTombstone: { - type: 'token', - description: - 'Moderation event timeline event for a PLC tombstone operation', - }, - scheduledActionView: { - type: 'object', - description: 'View of a scheduled moderation action', - required: ['id', 'action', 'did', 'createdBy', 'createdAt', 'status'], - properties: { - id: { - type: 'integer', - description: 'Auto-incrementing row ID', - }, - action: { - type: 'string', - knownValues: ['takedown'], - description: 'Type of action to be executed', - }, - eventData: { - type: 'unknown', - description: - 'Serialized event object that will be propagated to the event when performed', - }, - did: { - type: 'string', - format: 'did', - description: 'Subject DID for the action', - }, - executeAt: { - type: 'string', - format: 'datetime', - description: 'Exact time to execute the action', - }, - executeAfter: { - type: 'string', - format: 'datetime', - description: - 'Earliest time to execute the action (for randomized scheduling)', - }, - executeUntil: { - type: 'string', - format: 'datetime', - description: - 'Latest time to execute the action (for randomized scheduling)', - }, - randomizeExecution: { - type: 'boolean', - description: - 'Whether execution time should be randomized within the specified range', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'DID of the user who created this scheduled action', - }, - createdAt: { - type: 'string', - format: 'datetime', - description: 'When the scheduled action was created', - }, - updatedAt: { - type: 'string', - format: 'datetime', - description: 'When the scheduled action was last updated', - }, - status: { - type: 'string', - knownValues: ['pending', 'executed', 'cancelled', 'failed'], - description: 'Current status of the scheduled action', - }, - lastExecutedAt: { - type: 'string', - format: 'datetime', - description: 'When the action was last attempted to be executed', - }, - lastFailureReason: { - type: 'string', - description: 'Reason for the last execution failure', - }, - executionEventId: { - type: 'integer', - description: - 'ID of the moderation event created when action was successfully executed', - }, - }, - }, - }, - }, - ToolsOzoneModerationEmitEvent: { - lexicon: 1, - id: 'tools.ozone.moderation.emitEvent', - defs: { - main: { - type: 'procedure', - description: 'Take a moderation action on an actor.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['event', 'subject', 'createdBy'], - properties: { - event: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#modEventTakedown', - 'lex:tools.ozone.moderation.defs#modEventAcknowledge', - 'lex:tools.ozone.moderation.defs#modEventEscalate', - 'lex:tools.ozone.moderation.defs#modEventComment', - 'lex:tools.ozone.moderation.defs#modEventLabel', - 'lex:tools.ozone.moderation.defs#modEventReport', - 'lex:tools.ozone.moderation.defs#modEventMute', - 'lex:tools.ozone.moderation.defs#modEventUnmute', - 'lex:tools.ozone.moderation.defs#modEventMuteReporter', - 'lex:tools.ozone.moderation.defs#modEventUnmuteReporter', - 'lex:tools.ozone.moderation.defs#modEventReverseTakedown', - 'lex:tools.ozone.moderation.defs#modEventResolveAppeal', - 'lex:tools.ozone.moderation.defs#modEventEmail', - 'lex:tools.ozone.moderation.defs#modEventDivert', - 'lex:tools.ozone.moderation.defs#modEventTag', - 'lex:tools.ozone.moderation.defs#accountEvent', - 'lex:tools.ozone.moderation.defs#identityEvent', - 'lex:tools.ozone.moderation.defs#recordEvent', - 'lex:tools.ozone.moderation.defs#modEventPriorityScore', - 'lex:tools.ozone.moderation.defs#ageAssuranceEvent', - 'lex:tools.ozone.moderation.defs#ageAssuranceOverrideEvent', - 'lex:tools.ozone.moderation.defs#ageAssurancePurgeEvent', - 'lex:tools.ozone.moderation.defs#revokeAccountCredentialsEvent', - 'lex:tools.ozone.moderation.defs#scheduleTakedownEvent', - 'lex:tools.ozone.moderation.defs#cancelScheduledTakedownEvent', - ], - }, - subject: { - type: 'union', - refs: [ - 'lex:com.atproto.admin.defs#repoRef', - 'lex:com.atproto.repo.strongRef', - ], - }, - subjectBlobCids: { - type: 'array', - items: { - type: 'string', - format: 'cid', - }, - }, - createdBy: { - type: 'string', - format: 'did', - }, - modTool: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modTool', - }, - externalId: { - type: 'string', - description: - 'An optional external ID for the event, used to deduplicate events from external systems. Fails when an event of same type with the same external ID exists for the same subject.', - }, - reportAction: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.emitEvent#reportAction', - description: - 'Optional report-level targeting. If provided, this event will be linked to specific reports and reporters may be notified.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modEventView', - }, - }, - errors: [ - { - name: 'SubjectHasAction', - }, - { - name: 'DuplicateExternalId', - description: - 'An event with the same external ID already exists for the subject.', - }, - ], - }, - reportAction: { - type: 'object', - description: 'Target specific reports when emitting a moderation event', - properties: { - ids: { - type: 'array', - items: { - type: 'integer', - }, - description: 'Target specific report IDs', - }, - types: { - type: 'array', - items: { - type: 'string', - }, - description: - 'Target reports matching these report types on the subject (fully qualified NSIDs)', - }, - all: { - type: 'boolean', - description: 'Target ALL reports on the subject', - }, - note: { - type: 'string', - description: - 'Note to send to reporter(s) when actioning their report', - }, - }, - }, - }, - }, - ToolsOzoneModerationGetAccountTimeline: { - lexicon: 1, - id: 'tools.ozone.moderation.getAccountTimeline', - defs: { - main: { - type: 'query', - description: - 'Get timeline of all available events of an account. This includes moderation events, account history and did history.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['timeline'], - properties: { - timeline: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.getAccountTimeline#timelineItem', - }, - }, - }, - }, - }, - errors: [ - { - name: 'RepoNotFound', - }, - ], - }, - timelineItem: { - type: 'object', - required: ['day', 'summary'], - properties: { - day: { - type: 'string', - }, - summary: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.getAccountTimeline#timelineItemSummary', - }, - }, - }, - }, - timelineItemSummary: { - type: 'object', - required: ['eventSubjectType', 'eventType', 'count'], - properties: { - eventSubjectType: { - type: 'string', - knownValues: ['account', 'record', 'chat'], - }, - eventType: { - type: 'string', - knownValues: [ - 'tools.ozone.moderation.defs#modEventTakedown', - 'tools.ozone.moderation.defs#modEventReverseTakedown', - 'tools.ozone.moderation.defs#modEventComment', - 'tools.ozone.moderation.defs#modEventReport', - 'tools.ozone.moderation.defs#modEventLabel', - 'tools.ozone.moderation.defs#modEventAcknowledge', - 'tools.ozone.moderation.defs#modEventEscalate', - 'tools.ozone.moderation.defs#modEventMute', - 'tools.ozone.moderation.defs#modEventUnmute', - 'tools.ozone.moderation.defs#modEventMuteReporter', - 'tools.ozone.moderation.defs#modEventUnmuteReporter', - 'tools.ozone.moderation.defs#modEventEmail', - 'tools.ozone.moderation.defs#modEventResolveAppeal', - 'tools.ozone.moderation.defs#modEventDivert', - 'tools.ozone.moderation.defs#modEventTag', - 'tools.ozone.moderation.defs#accountEvent', - 'tools.ozone.moderation.defs#identityEvent', - 'tools.ozone.moderation.defs#recordEvent', - 'tools.ozone.moderation.defs#modEventPriorityScore', - 'tools.ozone.moderation.defs#revokeAccountCredentialsEvent', - 'tools.ozone.moderation.defs#ageAssuranceEvent', - 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent', - 'tools.ozone.moderation.defs#timelineEventPlcCreate', - 'tools.ozone.moderation.defs#timelineEventPlcOperation', - 'tools.ozone.moderation.defs#timelineEventPlcTombstone', - 'tools.ozone.hosting.getAccountHistory#accountCreated', - 'tools.ozone.hosting.getAccountHistory#emailConfirmed', - 'tools.ozone.hosting.getAccountHistory#passwordUpdated', - 'tools.ozone.hosting.getAccountHistory#handleUpdated', - 'tools.ozone.moderation.defs#scheduleTakedownEvent', - 'tools.ozone.moderation.defs#cancelScheduledTakedownEvent', - ], - }, - count: { - type: 'integer', - }, - }, - }, - }, - }, - ToolsOzoneModerationGetEvent: { - lexicon: 1, - id: 'tools.ozone.moderation.getEvent', - defs: { - main: { - type: 'query', - description: 'Get details about a moderation event.', - parameters: { - type: 'params', - required: ['id'], - properties: { - id: { - type: 'integer', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modEventViewDetail', - }, - }, - }, - }, - }, - ToolsOzoneModerationGetRecord: { - lexicon: 1, - id: 'tools.ozone.moderation.getRecord', - defs: { - main: { - type: 'query', - description: 'Get details about a record.', - parameters: { - type: 'params', - required: ['uri'], - properties: { - uri: { - type: 'string', - format: 'at-uri', - }, - cid: { - type: 'string', - format: 'cid', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#recordViewDetail', - }, - }, - errors: [ - { - name: 'RecordNotFound', - }, - ], - }, - }, - }, - ToolsOzoneModerationGetRecords: { - lexicon: 1, - id: 'tools.ozone.moderation.getRecords', - defs: { - main: { - type: 'query', - description: 'Get details about some records.', - parameters: { - type: 'params', - required: ['uris'], - properties: { - uris: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'at-uri', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['records'], - properties: { - records: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#recordViewDetail', - 'lex:tools.ozone.moderation.defs#recordViewNotFound', - ], - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationGetRepo: { - lexicon: 1, - id: 'tools.ozone.moderation.getRepo', - defs: { - main: { - type: 'query', - description: 'Get details about a repository.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#repoViewDetail', - }, - }, - errors: [ - { - name: 'RepoNotFound', - }, - ], - }, - }, - }, - ToolsOzoneModerationGetReporterStats: { - lexicon: 1, - id: 'tools.ozone.moderation.getReporterStats', - defs: { - main: { - type: 'query', - description: 'Get reporter stats for a list of users.', - parameters: { - type: 'params', - required: ['dids'], - properties: { - dids: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['stats'], - properties: { - stats: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#reporterStats', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationGetRepos: { - lexicon: 1, - id: 'tools.ozone.moderation.getRepos', - defs: { - main: { - type: 'query', - description: 'Get details about some repositories.', - parameters: { - type: 'params', - required: ['dids'], - properties: { - dids: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repos'], - properties: { - repos: { - type: 'array', - items: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#repoViewDetail', - 'lex:tools.ozone.moderation.defs#repoViewNotFound', - ], - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationGetSubjects: { - lexicon: 1, - id: 'tools.ozone.moderation.getSubjects', - defs: { - main: { - type: 'query', - description: 'Get details about subjects.', - parameters: { - type: 'params', - required: ['subjects'], - properties: { - subjects: { - type: 'array', - maxLength: 100, - minLength: 1, - items: { - type: 'string', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subjects'], - properties: { - subjects: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationListScheduledActions: { - lexicon: 1, - id: 'tools.ozone.moderation.listScheduledActions', - defs: { - main: { - type: 'procedure', - description: - 'List scheduled moderation actions with optional filtering', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['statuses'], - properties: { - startsAfter: { - type: 'string', - format: 'datetime', - description: - 'Filter actions scheduled to execute after this time', - }, - endsBefore: { - type: 'string', - format: 'datetime', - description: - 'Filter actions scheduled to execute before this time', - }, - subjects: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'did', - }, - description: 'Filter actions for specific DID subjects', - }, - statuses: { - type: 'array', - minLength: 1, - items: { - type: 'string', - knownValues: ['pending', 'executed', 'cancelled', 'failed'], - }, - description: 'Filter actions by status', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - description: 'Maximum number of results to return', - }, - cursor: { - type: 'string', - description: 'Cursor for pagination', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['actions'], - properties: { - actions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#scheduledActionView', - }, - }, - cursor: { - type: 'string', - description: 'Cursor for next page of results', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationQueryEvents: { - lexicon: 1, - id: 'tools.ozone.moderation.queryEvents', - defs: { - main: { - type: 'query', - description: 'List moderation events related to a subject.', - parameters: { - type: 'params', - properties: { - types: { - type: 'array', - items: { - type: 'string', - }, - description: - 'The types of events (fully qualified string in the format of tools.ozone.moderation.defs#modEvent) to filter by. If not specified, all events are returned.', - }, - createdBy: { - type: 'string', - format: 'did', - }, - sortDirection: { - type: 'string', - default: 'desc', - enum: ['asc', 'desc'], - description: - 'Sort direction for the events. Defaults to descending order of created at timestamp.', - }, - createdAfter: { - type: 'string', - format: 'datetime', - description: 'Retrieve events created after a given timestamp', - }, - createdBefore: { - type: 'string', - format: 'datetime', - description: 'Retrieve events created before a given timestamp', - }, - subject: { - type: 'string', - format: 'uri', - }, - collections: { - type: 'array', - maxLength: 20, - description: - "If specified, only events where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", - items: { - type: 'string', - format: 'nsid', - }, - }, - subjectType: { - type: 'string', - description: - "If specified, only events where the subject is of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", - knownValues: ['account', 'record'], - }, - includeAllUserRecords: { - type: 'boolean', - default: false, - description: - "If true, events on all record types (posts, lists, profile etc.) or records from given 'collections' param, owned by the did are returned.", - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - hasComment: { - type: 'boolean', - description: 'If true, only events with comments are returned', - }, - comment: { - type: 'string', - description: - 'If specified, only events with comments containing the keyword are returned. Apply || separator to use multiple keywords and match using OR condition.', - }, - addedLabels: { - type: 'array', - items: { - type: 'string', - }, - description: - 'If specified, only events where all of these labels were added are returned', - }, - removedLabels: { - type: 'array', - items: { - type: 'string', - }, - description: - 'If specified, only events where all of these labels were removed are returned', - }, - addedTags: { - type: 'array', - items: { - type: 'string', - }, - description: - 'If specified, only events where all of these tags were added are returned', - }, - removedTags: { - type: 'array', - items: { - type: 'string', - }, - description: - 'If specified, only events where all of these tags were removed are returned', - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - }, - policies: { - type: 'array', - items: { - type: 'string', - description: - 'If specified, only events where the action policies match any of the given policies are returned', - }, - }, - modTool: { - type: 'array', - items: { - type: 'string', - }, - description: - 'If specified, only events where the modTool name matches any of the given values are returned', - }, - batchId: { - type: 'string', - description: - 'If specified, only events where the batchId matches the given value are returned', - }, - ageAssuranceState: { - type: 'string', - description: - 'If specified, only events where the age assurance state matches the given value are returned', - knownValues: [ - 'pending', - 'assured', - 'unknown', - 'reset', - 'blocked', - ], - }, - withStrike: { - type: 'boolean', - description: - 'If specified, only events where strikeCount value is set are returned.', - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['events'], - properties: { - cursor: { - type: 'string', - }, - events: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modEventView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationQueryStatuses: { - lexicon: 1, - id: 'tools.ozone.moderation.queryStatuses', - defs: { - main: { - type: 'query', - description: 'View moderation statuses of subjects (record or repo).', - parameters: { - type: 'params', - properties: { - queueCount: { - type: 'integer', - description: - 'Number of queues being used by moderators. Subjects will be split among all queues.', - }, - queueIndex: { - type: 'integer', - description: - 'Index of the queue to fetch subjects from. Works only when queueCount value is specified.', - }, - queueSeed: { - type: 'string', - description: 'A seeder to shuffle/balance the queue items.', - }, - includeAllUserRecords: { - type: 'boolean', - description: - "All subjects, or subjects from given 'collections' param, belonging to the account specified in the 'subject' param will be returned.", - }, - subject: { - type: 'string', - format: 'uri', - description: 'The subject to get the status for.', - }, - comment: { - type: 'string', - description: 'Search subjects by keyword from comments', - }, - reportedAfter: { - type: 'string', - format: 'datetime', - description: 'Search subjects reported after a given timestamp', - }, - reportedBefore: { - type: 'string', - format: 'datetime', - description: 'Search subjects reported before a given timestamp', - }, - reviewedAfter: { - type: 'string', - format: 'datetime', - description: 'Search subjects reviewed after a given timestamp', - }, - hostingDeletedAfter: { - type: 'string', - format: 'datetime', - description: - 'Search subjects where the associated record/account was deleted after a given timestamp', - }, - hostingDeletedBefore: { - type: 'string', - format: 'datetime', - description: - 'Search subjects where the associated record/account was deleted before a given timestamp', - }, - hostingUpdatedAfter: { - type: 'string', - format: 'datetime', - description: - 'Search subjects where the associated record/account was updated after a given timestamp', - }, - hostingUpdatedBefore: { - type: 'string', - format: 'datetime', - description: - 'Search subjects where the associated record/account was updated before a given timestamp', - }, - hostingStatuses: { - type: 'array', - items: { - type: 'string', - }, - description: - 'Search subjects by the status of the associated record/account', - }, - reviewedBefore: { - type: 'string', - format: 'datetime', - description: 'Search subjects reviewed before a given timestamp', - }, - includeMuted: { - type: 'boolean', - description: - "By default, we don't include muted subjects in the results. Set this to true to include them.", - }, - onlyMuted: { - type: 'boolean', - description: - 'When set to true, only muted subjects and reporters will be returned.', - }, - reviewState: { - type: 'string', - description: 'Specify when fetching subjects in a certain state', - knownValues: [ - 'tools.ozone.moderation.defs#reviewOpen', - 'tools.ozone.moderation.defs#reviewClosed', - 'tools.ozone.moderation.defs#reviewEscalated', - 'tools.ozone.moderation.defs#reviewNone', - ], - }, - ignoreSubjects: { - type: 'array', - items: { - type: 'string', - format: 'uri', - }, - }, - lastReviewedBy: { - type: 'string', - format: 'did', - description: - 'Get all subject statuses that were reviewed by a specific moderator', - }, - sortField: { - type: 'string', - default: 'lastReportedAt', - enum: [ - 'lastReviewedAt', - 'lastReportedAt', - 'reportedRecordsCount', - 'takendownRecordsCount', - 'priorityScore', - ], - }, - sortDirection: { - type: 'string', - default: 'desc', - enum: ['asc', 'desc'], - }, - takendown: { - type: 'boolean', - description: 'Get subjects that were taken down', - }, - appealed: { - type: 'boolean', - description: 'Get subjects in unresolved appealed status', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - tags: { - type: 'array', - maxLength: 25, - items: { - type: 'string', - description: - 'Items in this array are applied with OR filters. To apply AND filter, put all tags in the same string and separate using && characters', - }, - }, - excludeTags: { - type: 'array', - items: { - type: 'string', - }, - }, - cursor: { - type: 'string', - }, - collections: { - type: 'array', - maxLength: 20, - description: - "If specified, subjects belonging to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", - items: { - type: 'string', - format: 'nsid', - }, - }, - subjectType: { - type: 'string', - description: - "If specified, subjects of the given type (account or record) will be returned. When this is set to 'account' the 'collections' parameter will be ignored. When includeAllUserRecords or subject is set, this will be ignored.", - knownValues: ['account', 'record'], - }, - minAccountSuspendCount: { - type: 'integer', - description: - 'If specified, only subjects that belong to an account that has at least this many suspensions will be returned.', - }, - minReportedRecordsCount: { - type: 'integer', - description: - 'If specified, only subjects that belong to an account that has at least this many reported records will be returned.', - }, - minTakendownRecordsCount: { - type: 'integer', - description: - 'If specified, only subjects that belong to an account that has at least this many taken down records will be returned.', - }, - minPriorityScore: { - minimum: 0, - maximum: 100, - type: 'integer', - description: - 'If specified, only subjects that have priority score value above the given value will be returned.', - }, - minStrikeCount: { - type: 'integer', - minimum: 1, - description: - 'If specified, only subjects that belong to an account that has at least this many active strikes will be returned.', - }, - ageAssuranceState: { - type: 'string', - description: - 'If specified, only subjects with the given age assurance state will be returned.', - knownValues: [ - 'pending', - 'assured', - 'unknown', - 'reset', - 'blocked', - ], - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['subjectStatuses'], - properties: { - cursor: { - type: 'string', - }, - subjectStatuses: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneModerationScheduleAction: { - lexicon: 1, - id: 'tools.ozone.moderation.scheduleAction', - defs: { - main: { - type: 'procedure', - description: - 'Schedule a moderation action to be executed at a future time', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['action', 'subjects', 'createdBy', 'scheduling'], - properties: { - action: { - type: 'union', - refs: ['lex:tools.ozone.moderation.scheduleAction#takedown'], - }, - subjects: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'did', - }, - description: 'Array of DID subjects to schedule the action for', - }, - createdBy: { - type: 'string', - format: 'did', - }, - scheduling: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.scheduleAction#schedulingConfig', - }, - modTool: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modTool', - description: - 'This will be propagated to the moderation event when it is applied', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.scheduleAction#scheduledActionResults', - }, - }, - }, - takedown: { - type: 'object', - description: 'Schedule a takedown action', - properties: { - comment: { - type: 'string', - }, - durationInHours: { - type: 'integer', - description: - 'Indicates how long the takedown should be in effect before automatically expiring.', - }, - acknowledgeAccountSubjects: { - type: 'boolean', - description: - 'If true, all other reports on content authored by this account will be resolved (acknowledged).', - }, - policies: { - type: 'array', - maxLength: 5, - items: { - type: 'string', - }, - description: - 'Names/Keywords of the policies that drove the decision.', - }, - severityLevel: { - type: 'string', - description: - "Severity level of the violation (e.g., 'sev-0', 'sev-1', 'sev-2', etc.).", - }, - strikeCount: { - type: 'integer', - description: - 'Number of strikes to assign to the user when takedown is applied.', - }, - strikeExpiresAt: { - type: 'string', - format: 'datetime', - description: - 'When the strike should expire. If not provided, the strike never expires.', - }, - emailContent: { - type: 'string', - description: 'Email content to be sent to the user upon takedown.', - }, - emailSubject: { - type: 'string', - description: - 'Subject of the email to be sent to the user upon takedown.', - }, - }, - }, - schedulingConfig: { - type: 'object', - description: 'Configuration for when the action should be executed', - properties: { - executeAt: { - type: 'string', - format: 'datetime', - description: 'Exact time to execute the action', - }, - executeAfter: { - type: 'string', - format: 'datetime', - description: - 'Earliest time to execute the action (for randomized scheduling)', - }, - executeUntil: { - type: 'string', - format: 'datetime', - description: - 'Latest time to execute the action (for randomized scheduling)', - }, - }, - }, - scheduledActionResults: { - type: 'object', - required: ['succeeded', 'failed'], - properties: { - succeeded: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - failed: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.scheduleAction#failedScheduling', - }, - }, - }, - }, - failedScheduling: { - type: 'object', - required: ['subject', 'error'], - properties: { - subject: { - type: 'string', - format: 'did', - }, - error: { - type: 'string', - }, - errorCode: { - type: 'string', - }, - }, - }, - }, - }, - ToolsOzoneModerationSearchRepos: { - lexicon: 1, - id: 'tools.ozone.moderation.searchRepos', - defs: { - main: { - type: 'query', - description: 'Find repositories based on a search term.', - parameters: { - type: 'params', - properties: { - term: { - type: 'string', - description: "DEPRECATED: use 'q' instead", - }, - q: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['repos'], - properties: { - cursor: { - type: 'string', - }, - repos: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#repoView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneQueueAssignModerator: { - lexicon: 1, - id: 'tools.ozone.queue.assignModerator', - defs: { - main: { - type: 'procedure', - description: 'Assign a user to a queue.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queueId', 'did'], - properties: { - queueId: { - type: 'integer', - description: 'The ID of the queue to assign the user to.', - }, - did: { - type: 'string', - description: 'DID to be assigned.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#assignmentView', - }, - }, - errors: [ - { - name: 'InvalidAssignment', - description: - 'The specified queue does not exist or is not enabled.', - }, - ], - }, - }, - }, - ToolsOzoneQueueCreateQueue: { - lexicon: 1, - id: 'tools.ozone.queue.createQueue', - defs: { - main: { - type: 'procedure', - description: - 'Create a new moderation queue. Will fail if the queue configuration conflicts with an existing queue.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['name', 'subjectTypes', 'reportTypes'], - properties: { - name: { - type: 'string', - description: 'Display name for the queue (must be unique)', - }, - subjectTypes: { - type: 'array', - minLength: 1, - items: { - type: 'string', - knownValues: ['account', 'record', 'message'], - }, - description: 'Subject types this queue accepts', - }, - collection: { - type: 'string', - format: 'nsid', - description: - "Collection name for record subjects. Required if subjectTypes includes 'record'.", - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - minLength: 1, - maxLength: 25, - description: 'Report reason types (fully qualified NSIDs)', - }, - description: { - type: 'string', - description: 'Optional description of the queue', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queue'], - properties: { - queue: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueView', - }, - }, - }, - }, - errors: [ - { - name: 'ConflictingQueue', - description: - 'The queue configuration conflicts with an existing queue', - }, - ], - }, - }, - }, - ToolsOzoneQueueDefs: { - lexicon: 1, - id: 'tools.ozone.queue.defs', - defs: { - queueView: { - type: 'object', - required: [ - 'id', - 'name', - 'subjectTypes', - 'reportTypes', - 'createdBy', - 'createdAt', - 'updatedAt', - 'enabled', - 'stats', - ], - properties: { - id: { - type: 'integer', - description: 'Queue ID', - }, - name: { - type: 'string', - description: 'Display name of the queue', - }, - subjectTypes: { - type: 'array', - minLength: 1, - items: { - type: 'string', - knownValues: ['account', 'record', 'message'], - }, - description: 'Subject types this queue accepts.', - }, - collection: { - type: 'string', - format: 'nsid', - description: - "Collection name for record subjects (e.g., 'app.bsky.feed.post')", - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - minLength: 1, - description: - 'Report reason types this queue accepts (fully qualified NSIDs)', - }, - description: { - type: 'string', - description: 'Optional description of the queue', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'DID of moderator who created this queue', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - enabled: { - type: 'boolean', - description: 'Whether this queue is currently active', - }, - deletedAt: { - type: 'string', - format: 'datetime', - description: 'When the queue was deleted, if applicable', - }, - stats: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueStats', - description: 'Statistics about this queue', - }, - }, - }, - queueStats: { - type: 'object', - required: [], - properties: { - pendingCount: { - type: 'integer', - description: "Number of reports in 'open' status", - }, - actionedCount: { - type: 'integer', - description: "Number of reports in 'closed' status", - }, - escalatedCount: { - type: 'integer', - description: "Number of reports in 'escalated' status", - }, - inboundCount: { - type: 'integer', - description: 'Reports received in this queue in the last 24 hours.', - }, - actionRate: { - type: 'integer', - description: - 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer. Absent when inboundCount is 0.', - }, - avgHandlingTimeSec: { - type: 'integer', - description: - 'Average time in seconds from report creation to close, for reports closed in this period.', - }, - lastUpdated: { - type: 'string', - format: 'datetime', - description: 'When these statistics were last computed', - }, - }, - }, - assignmentView: { - type: 'object', - required: ['id', 'did', 'queue', 'startAt'], - properties: { - id: { - type: 'integer', - }, - did: { - type: 'string', - format: 'did', - }, - moderator: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - description: 'The moderator assigned to this queue', - }, - queue: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueView', - }, - startAt: { - type: 'string', - format: 'datetime', - }, - endAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - ToolsOzoneQueueDeleteQueue: { - lexicon: 1, - id: 'tools.ozone.queue.deleteQueue', - defs: { - main: { - type: 'procedure', - description: - 'Delete a moderation queue. Optionally migrate reports to another queue.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queueId'], - properties: { - queueId: { - type: 'integer', - description: 'ID of the queue to delete', - }, - migrateToQueueId: { - type: 'integer', - description: - 'Optional: migrate all reports to this queue. If not specified, reports will be set to unassigned (-1).', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['deleted'], - properties: { - deleted: { - type: 'boolean', - }, - reportsMigrated: { - type: 'integer', - description: - 'Number of reports that were migrated (if migration occurred)', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneQueueGetAssignments: { - lexicon: 1, - id: 'tools.ozone.queue.getAssignments', - defs: { - main: { - type: 'query', - description: - 'Get moderator assignments, optionally filtered by active status, queue, or moderator.', - parameters: { - type: 'params', - properties: { - onlyActive: { - type: 'boolean', - default: true, - description: 'When true, only returns active assignments.', - }, - queueIds: { - type: 'array', - items: { - type: 'integer', - }, - description: - 'If specified, returns assignments for these queues only.', - }, - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - description: - 'If specified, returns assignments for these moderators only.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['assignments'], - properties: { - cursor: { - type: 'string', - }, - assignments: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#assignmentView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneQueueListQueues: { - lexicon: 1, - id: 'tools.ozone.queue.listQueues', - defs: { - main: { - type: 'query', - description: 'List all configured moderation queues with statistics.', - parameters: { - type: 'params', - properties: { - enabled: { - type: 'boolean', - description: - 'Filter by enabled status. If not specified, returns all queues.', - }, - subjectType: { - type: 'string', - description: - "Filter queues that handle this subject type ('account' or 'record').", - }, - collection: { - type: 'string', - description: - "Filter queues by collection name (e.g. 'app.bsky.feed.post').", - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - maxLength: 10, - description: - 'Filter queues that handle any of these report reason types.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queues'], - properties: { - cursor: { - type: 'string', - }, - queues: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneQueueRouteReports: { - lexicon: 1, - id: 'tools.ozone.queue.routeReports', - defs: { - main: { - type: 'procedure', - description: - 'Route reports within an ID range to matching queues based.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['startReportId', 'endReportId'], - properties: { - startReportId: { - type: 'integer', - description: 'Start of report ID range (inclusive).', - }, - endReportId: { - type: 'integer', - description: - 'End of report ID range (inclusive). Difference between start and end must be less than 5,000.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['assigned', 'unmatched'], - properties: { - assigned: { - type: 'integer', - description: 'The number of reports assigned to a queue.', - }, - unmatched: { - type: 'integer', - description: 'The number of reports with no matching queue.', - }, - }, - }, - }, - errors: [ - { - name: 'OutOfRange', - description: - 'The request is invalid, such as missing required fields or invalid field values.', - }, - ], - }, - }, - }, - ToolsOzoneQueueUnassignModerator: { - lexicon: 1, - id: 'tools.ozone.queue.unassignModerator', - defs: { - main: { - type: 'procedure', - description: "Remove a user's assignment from a queue.", - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queueId', 'did'], - properties: { - queueId: { - type: 'integer', - description: 'The ID of the queue to unassign the user from.', - }, - did: { - type: 'string', - format: 'did', - description: 'DID to be unassigned.', - }, - }, - }, - }, - errors: [ - { - name: 'InvalidAssignment', - description: - 'No active assignment exists for the given queue and user.', - }, - ], - }, - }, - }, - ToolsOzoneQueueUpdateQueue: { - lexicon: 1, - id: 'tools.ozone.queue.updateQueue', - defs: { - main: { - type: 'procedure', - description: - 'Update queue properties. Currently only supports updating the name and enabled status to prevent configuration conflicts.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queueId'], - properties: { - queueId: { - type: 'integer', - description: 'ID of the queue to update', - }, - name: { - type: 'string', - description: 'New display name for the queue', - }, - enabled: { - type: 'boolean', - description: 'Enable or disable the queue', - }, - description: { - type: 'string', - description: 'Optional description of the queue', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['queue'], - properties: { - queue: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueView', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneReportAssignModerator: { - lexicon: 1, - id: 'tools.ozone.report.assignModerator', - defs: { - main: { - type: 'procedure', - description: - 'Assign a report to a user. Defaults to the caller. Admins may assign to any moderator.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['reportId'], - properties: { - reportId: { - type: 'integer', - description: 'The ID of the report to assign.', - }, - queueId: { - type: 'integer', - description: - 'Optional queue ID to associate the assignment with. If not provided and the report has been assigned on a queue before, it will stay on that queue.', - }, - did: { - type: 'string', - format: 'did', - description: - "DID to be assigned. Defaults to the caller's DID. Admins may assign to any moderator.", - }, - isPermanent: { - type: 'boolean', - description: - 'When true, the assignment has no expiry (endAt is null). Throws AlreadyAssigned if another user already has a permanent assignment on this report.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#assignmentView', - }, - }, - errors: [ - { - name: 'AlreadyAssigned', - description: 'The report is already assigned to another user.', - }, - { - name: 'InvalidAssignment', - description: 'The report ID or queue ID is invalid.', - }, - ], - }, - }, - }, - ToolsOzoneReportCreateActivity: { - lexicon: 1, - id: 'tools.ozone.report.createActivity', - defs: { - main: { - type: 'procedure', - description: - 'Register an activity on a report. For state-change activity types, validates the transition and updates report.status atomically.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['reportId', 'activity'], - properties: { - reportId: { - type: 'integer', - description: 'ID of the report to record activity on', - }, - activity: { - type: 'union', - refs: [ - 'lex:tools.ozone.report.defs#queueActivity', - 'lex:tools.ozone.report.defs#assignmentActivity', - 'lex:tools.ozone.report.defs#escalationActivity', - 'lex:tools.ozone.report.defs#closeActivity', - 'lex:tools.ozone.report.defs#reopenActivity', - 'lex:tools.ozone.report.defs#noteActivity', - ], - description: 'The type of activity to record.', - }, - internalNote: { - type: 'string', - description: - 'Optional moderator-only note. Not visible to reporters.', - }, - publicNote: { - type: 'string', - description: - 'Optional public-facing note, potentially visible to the reporter.', - }, - isAutomated: { - type: 'boolean', - description: - 'Set true when this activity is triggered by an automated process. Defaults to false.', - default: false, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['activity'], - properties: { - activity: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportActivityView', - }, - }, - }, - }, - errors: [ - { - name: 'ReportNotFound', - description: 'No report exists with the given reportId', - }, - { - name: 'InvalidStateTransition', - description: - "The requested state transition is not permitted from the report's current status", - }, - { - name: 'AlreadyInTargetState', - description: - 'The report is already in the status implied by this activity type', - }, - ], - }, - }, - }, - ToolsOzoneReportDefs: { - lexicon: 1, - id: 'tools.ozone.report.defs', - defs: { - reasonType: { - type: 'string', - knownValues: [ - 'tools.ozone.report.defs#reasonAppeal', - 'tools.ozone.report.defs#reasonOther', - 'tools.ozone.report.defs#reasonViolenceAnimal', - 'tools.ozone.report.defs#reasonViolenceThreats', - 'tools.ozone.report.defs#reasonViolenceGraphicContent', - 'tools.ozone.report.defs#reasonViolenceGlorification', - 'tools.ozone.report.defs#reasonViolenceExtremistContent', - 'tools.ozone.report.defs#reasonViolenceTrafficking', - 'tools.ozone.report.defs#reasonViolenceOther', - 'tools.ozone.report.defs#reasonSexualAbuseContent', - 'tools.ozone.report.defs#reasonSexualNCII', - 'tools.ozone.report.defs#reasonSexualDeepfake', - 'tools.ozone.report.defs#reasonSexualAnimal', - 'tools.ozone.report.defs#reasonSexualUnlabeled', - 'tools.ozone.report.defs#reasonSexualOther', - 'tools.ozone.report.defs#reasonChildSafetyCSAM', - 'tools.ozone.report.defs#reasonChildSafetyGroom', - 'tools.ozone.report.defs#reasonChildSafetyPrivacy', - 'tools.ozone.report.defs#reasonChildSafetyHarassment', - 'tools.ozone.report.defs#reasonChildSafetyOther', - 'tools.ozone.report.defs#reasonHarassmentTroll', - 'tools.ozone.report.defs#reasonHarassmentTargeted', - 'tools.ozone.report.defs#reasonHarassmentHateSpeech', - 'tools.ozone.report.defs#reasonHarassmentDoxxing', - 'tools.ozone.report.defs#reasonHarassmentOther', - 'tools.ozone.report.defs#reasonMisleadingBot', - 'tools.ozone.report.defs#reasonMisleadingImpersonation', - 'tools.ozone.report.defs#reasonMisleadingSpam', - 'tools.ozone.report.defs#reasonMisleadingScam', - 'tools.ozone.report.defs#reasonMisleadingElections', - 'tools.ozone.report.defs#reasonMisleadingOther', - 'tools.ozone.report.defs#reasonRuleSiteSecurity', - 'tools.ozone.report.defs#reasonRuleProhibitedSales', - 'tools.ozone.report.defs#reasonRuleBanEvasion', - 'tools.ozone.report.defs#reasonRuleOther', - 'tools.ozone.report.defs#reasonSelfHarmContent', - 'tools.ozone.report.defs#reasonSelfHarmED', - 'tools.ozone.report.defs#reasonSelfHarmStunts', - 'tools.ozone.report.defs#reasonSelfHarmSubstances', - 'tools.ozone.report.defs#reasonSelfHarmOther', - ], - }, - reasonAppeal: { - type: 'token', - description: 'Appeal a previously taken moderation action', - }, - reasonOther: { - type: 'token', - description: 'An issue not included in these options', - }, - reasonViolenceAnimal: { - type: 'token', - description: 'Animal welfare violations', - }, - reasonViolenceThreats: { - type: 'token', - description: 'Threats or incitement', - }, - reasonViolenceGraphicContent: { - type: 'token', - description: 'Graphic violent content', - }, - reasonViolenceGlorification: { - type: 'token', - description: 'Glorification of violence', - }, - reasonViolenceExtremistContent: { - type: 'token', - description: - "Extremist content. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonViolenceTrafficking: { - type: 'token', - description: 'Human trafficking', - }, - reasonViolenceOther: { - type: 'token', - description: 'Other violent content', - }, - reasonSexualAbuseContent: { - type: 'token', - description: 'Adult sexual abuse content', - }, - reasonSexualNCII: { - type: 'token', - description: 'Non-consensual intimate imagery', - }, - reasonSexualDeepfake: { - type: 'token', - description: 'Deepfake adult content', - }, - reasonSexualAnimal: { - type: 'token', - description: 'Animal sexual abuse', - }, - reasonSexualUnlabeled: { - type: 'token', - description: 'Unlabelled adult content', - }, - reasonSexualOther: { - type: 'token', - description: 'Other sexual violence content', - }, - reasonChildSafetyCSAM: { - type: 'token', - description: - "Child sexual abuse material (CSAM). These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonChildSafetyGroom: { - type: 'token', - description: - "Grooming or predatory behavior. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonChildSafetyPrivacy: { - type: 'token', - description: 'Privacy violation involving a minor', - }, - reasonChildSafetyHarassment: { - type: 'token', - description: 'Harassment or bullying of minors', - }, - reasonChildSafetyOther: { - type: 'token', - description: - "Other child safety. These reports will be sent only be sent to the application's Moderation Authority.", - }, - reasonHarassmentTroll: { - type: 'token', - description: 'Trolling', - }, - reasonHarassmentTargeted: { - type: 'token', - description: 'Targeted harassment', - }, - reasonHarassmentHateSpeech: { - type: 'token', - description: 'Hate speech', - }, - reasonHarassmentDoxxing: { - type: 'token', - description: 'Doxxing', - }, - reasonHarassmentOther: { - type: 'token', - description: 'Other harassing or hateful content', - }, - reasonMisleadingBot: { - type: 'token', - description: 'Fake account or bot', - }, - reasonMisleadingImpersonation: { - type: 'token', - description: 'Impersonation', - }, - reasonMisleadingSpam: { - type: 'token', - description: 'Spam', - }, - reasonMisleadingScam: { - type: 'token', - description: 'Scam', - }, - reasonMisleadingElections: { - type: 'token', - description: 'False information about elections', - }, - reasonMisleadingOther: { - type: 'token', - description: 'Other misleading content', - }, - reasonRuleSiteSecurity: { - type: 'token', - description: 'Hacking or system attacks', - }, - reasonRuleProhibitedSales: { - type: 'token', - description: 'Promoting or selling prohibited items or services', - }, - reasonRuleBanEvasion: { - type: 'token', - description: 'Banned user returning', - }, - reasonRuleOther: { - type: 'token', - description: 'Other', - }, - reasonSelfHarmContent: { - type: 'token', - description: 'Content promoting or depicting self-harm', - }, - reasonSelfHarmED: { - type: 'token', - description: 'Eating disorders', - }, - reasonSelfHarmStunts: { - type: 'token', - description: 'Dangerous challenges or activities', - }, - reasonSelfHarmSubstances: { - type: 'token', - description: 'Dangerous substances or drug abuse', - }, - reasonSelfHarmOther: { - type: 'token', - description: 'Other dangerous content', - }, - reportAssignment: { - type: 'object', - description: - 'Information about the moderator currently assigned to a report.', - required: ['did', 'assignedAt'], - properties: { - did: { - type: 'string', - format: 'did', - description: 'DID of the assigned moderator', - }, - moderator: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - description: 'Full member record of the assigned moderator', - }, - assignedAt: { - type: 'string', - format: 'datetime', - description: 'When the report was assigned', - }, - }, - }, - reportView: { - type: 'object', - required: [ - 'id', - 'eventId', - 'status', - 'subject', - 'reportType', - 'reportedBy', - 'reporter', - 'createdAt', - ], - properties: { - id: { - type: 'integer', - description: 'Report ID', - }, - eventId: { - type: 'integer', - description: 'ID of the moderation event that created this report', - }, - status: { - type: 'string', - knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], - description: 'Current status of the report', - }, - subject: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectView', - description: 'The subject that was reported with full details', - }, - reportType: { - type: 'ref', - ref: 'lex:com.atproto.moderation.defs#reasonType', - description: 'Type of report', - }, - reportedBy: { - type: 'string', - format: 'did', - description: 'DID of the user who made the report', - }, - reporter: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectView', - description: 'Full subject view of the reporter account', - }, - comment: { - type: 'string', - description: 'Comment provided by the reporter', - }, - createdAt: { - type: 'string', - format: 'datetime', - description: 'When the report was created', - }, - updatedAt: { - type: 'string', - format: 'datetime', - description: 'When the report was last updated', - }, - queuedAt: { - type: 'string', - format: 'datetime', - description: 'When the report was assigned to its current queue', - }, - actionEventIds: { - type: 'array', - items: { - type: 'integer', - }, - description: - 'Array of moderation event IDs representing actions taken on this report (sorted DESC, most recent first)', - }, - actions: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#modEventView', - }, - description: 'Optional: expanded action events', - }, - actionNote: { - type: 'string', - description: 'Note sent to reporter when report was actioned', - }, - subjectStatus: { - type: 'ref', - ref: 'lex:tools.ozone.moderation.defs#subjectStatusView', - description: 'Current status of the reported subject', - }, - relatedReportCount: { - type: 'integer', - description: 'Number of other pending reports on the same subject', - }, - assignment: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportAssignment', - description: - 'Information about moderator currently assigned to this report (if any)', - }, - queue: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueView', - description: 'The queue this report is assigned to (if any)', - }, - isMuted: { - type: 'boolean', - description: - 'Whether this report is muted. A report is muted if the reporter was muted or the subject was muted at the time the report was created.', - }, - }, - }, - queueActivity: { - type: 'object', - description: 'Activity recording a report being routed to a queue.', - properties: { - previousStatus: { - type: 'string', - knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], - description: - "The report's status before this activity. Populated automatically from the report row; not required in input.", - }, - }, - }, - assignmentActivity: { - type: 'object', - description: - 'Activity recording a moderator being assigned to a report.', - properties: { - previousStatus: { - type: 'string', - knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], - description: - "The report's status before this activity. Populated automatically from the report row; not required in input.", - }, - }, - }, - escalationActivity: { - type: 'object', - description: 'Activity recording a report being escalated.', - properties: { - previousStatus: { - type: 'string', - knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], - description: - "The report's status before this activity. Populated automatically from the report row; not required in input.", - }, - }, - }, - closeActivity: { - type: 'object', - description: 'Activity recording a report being closed.', - properties: { - previousStatus: { - type: 'string', - knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], - description: - "The report's status before this activity. Populated automatically from the report row; not required in input.", - }, - }, - }, - reopenActivity: { - type: 'object', - description: - "Activity recording a closed report being reopened. Only valid when the report is in 'closed' status.", - properties: { - previousStatus: { - type: 'string', - knownValues: ['open', 'closed', 'escalated', 'queued', 'assigned'], - description: - "The report's status before this activity. Populated automatically from the report row; not required in input.", - }, - }, - }, - noteActivity: { - type: 'object', - description: - 'Activity recording a note on a report. Use internalNote for moderator-only notes or publicNote for reporter-visible notes (or both).', - properties: {}, - }, - reportActivityView: { - type: 'object', - description: 'A single activity entry on a report.', - required: [ - 'id', - 'reportId', - 'activity', - 'isAutomated', - 'createdBy', - 'createdAt', - ], - properties: { - id: { - type: 'integer', - description: 'Activity ID', - }, - reportId: { - type: 'integer', - description: 'ID of the report this activity belongs to', - }, - activity: { - type: 'union', - refs: [ - 'lex:tools.ozone.report.defs#queueActivity', - 'lex:tools.ozone.report.defs#assignmentActivity', - 'lex:tools.ozone.report.defs#escalationActivity', - 'lex:tools.ozone.report.defs#closeActivity', - 'lex:tools.ozone.report.defs#reopenActivity', - 'lex:tools.ozone.report.defs#noteActivity', - ], - description: 'The typed activity object describing what occurred.', - }, - internalNote: { - type: 'string', - description: - 'Optional moderator-only note. Not visible to reporters.', - }, - publicNote: { - type: 'string', - description: - 'Optional public note, potentially visible to the reporter.', - }, - meta: { - type: 'unknown', - description: - 'Extensible JSON payload for loose activity-specific metadata (e.g. assignmentId).', - }, - isAutomated: { - type: 'boolean', - description: - 'True if this activity was created by an automated process (e.g. queue router) rather than a direct human action.', - }, - createdBy: { - type: 'string', - format: 'did', - description: - 'DID of the actor who created this activity, or the service DID for automated activities.', - }, - moderator: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - description: - 'Full member record of the moderator who created this activity', - }, - createdAt: { - type: 'string', - format: 'datetime', - description: 'When this activity was created', - }, - }, - }, - liveStats: { - description: - 'Live statistics for reports for the current calendar day, filterable by queue, moderator, or report type.', - type: 'object', - properties: { - pendingCount: { - type: 'integer', - description: 'Number of reports currently not closed.', - }, - actionedCount: { - type: 'integer', - description: 'Number of reports closed today.', - }, - escalatedCount: { - type: 'integer', - description: 'Number of reports escalated today.', - }, - inboundCount: { - type: 'integer', - description: 'Reports received today.', - }, - actionRate: { - type: 'integer', - description: - 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer.', - }, - avgHandlingTimeSec: { - type: 'integer', - description: - 'Average time in seconds from report creation (or moderator assignment) to close.', - }, - lastUpdated: { - type: 'string', - format: 'datetime', - description: 'When these statistics were last computed.', - }, - }, - }, - historicalStats: { - description: - 'A single daily snapshot of report statistics for a calendar date.', - type: 'object', - required: ['date'], - properties: { - date: { - type: 'string', - description: 'The calendar date this snapshot covers (YYYY-MM-DD).', - }, - computedAt: { - type: 'string', - format: 'datetime', - description: 'When this snapshot was last computed.', - }, - pendingCount: { - type: 'integer', - description: 'Number of reports not closed at time of computation.', - }, - actionedCount: { - type: 'integer', - description: 'Number of reports closed during this day.', - }, - escalatedCount: { - type: 'integer', - description: 'Number of reports escalated during this day.', - }, - inboundCount: { - type: 'integer', - description: 'Reports received during this day.', - }, - actionRate: { - type: 'integer', - description: - 'Percentage of reports actioned (actionedCount / inboundCount * 100), rounded to nearest integer.', - }, - avgHandlingTimeSec: { - type: 'integer', - description: - 'Average time in seconds from report creation (or moderator assignment) to close.', - }, - }, - }, - assignmentView: { - type: 'object', - required: ['id', 'did', 'reportId', 'startAt'], - properties: { - id: { - type: 'integer', - }, - did: { - type: 'string', - format: 'did', - }, - moderator: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - description: 'The moderator assigned to this report', - }, - queue: { - type: 'ref', - ref: 'lex:tools.ozone.queue.defs#queueView', - }, - reportId: { - type: 'integer', - }, - startAt: { - type: 'string', - format: 'datetime', - }, - endAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - ToolsOzoneReportGetAssignments: { - lexicon: 1, - id: 'tools.ozone.report.getAssignments', - defs: { - main: { - type: 'query', - description: 'Get assignments for reports.', - parameters: { - type: 'params', - properties: { - onlyActive: { - type: 'boolean', - default: true, - description: 'When true, only returns active assignments.', - }, - reportIds: { - type: 'array', - items: { - type: 'integer', - }, - maxLength: 50, - description: - 'If specified, returns assignments for these reports only.', - }, - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - maxLength: 50, - description: - 'If specified, returns assignments for these moderators only.', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['assignments'], - properties: { - cursor: { - type: 'string', - }, - assignments: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#assignmentView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneReportGetHistoricalStats: { - lexicon: 1, - id: 'tools.ozone.report.getHistoricalStats', - defs: { - main: { - type: 'query', - description: - 'Get historical daily report statistics. Returns a paginated list of daily stat snapshots, newest first. Filter by queue, moderator, or report type.', - parameters: { - type: 'params', - properties: { - queueId: { - type: 'integer', - description: - 'Filter stats by queue. Use -1 for unqueued reports.', - }, - moderatorDid: { - type: 'string', - format: 'did', - description: 'Filter stats by moderator DID.', - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - description: 'Filter stats by report types.', - }, - startDate: { - type: 'string', - format: 'datetime', - description: 'Earliest date to include (inclusive).', - }, - endDate: { - type: 'string', - format: 'datetime', - description: 'Latest date to include (inclusive).', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 30, - description: 'Maximum number of entries to return.', - }, - cursor: { - type: 'string', - description: 'Pagination cursor.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['stats'], - properties: { - stats: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#historicalStats', - }, - }, - cursor: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneReportGetLatestReport: { - lexicon: 1, - id: 'tools.ozone.report.getLatestReport', - defs: { - main: { - type: 'query', - description: 'Get the most recent report.', - parameters: { - type: 'params', - properties: {}, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['report'], - properties: { - report: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportView', - }, - }, - }, - }, - errors: [ - { - name: 'NotFound', - description: 'No report found.', - }, - ], - }, - }, - }, - ToolsOzoneReportGetLiveStats: { - lexicon: 1, - id: 'tools.ozone.report.getLiveStats', - defs: { - main: { - type: 'query', - description: - 'Get live report statistics from the past 24 hours. Filter by queue, moderator, or report type. Omit all parameters for aggregate stats.', - parameters: { - type: 'params', - properties: { - queueId: { - type: 'integer', - description: - 'Filter stats by queue. Use -1 for unqueued reports.', - }, - moderatorDid: { - type: 'string', - format: 'did', - description: 'Filter stats by moderator DID.', - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - description: 'Filter stats by report types.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['stats'], - properties: { - stats: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#liveStats', - description: 'Statistics for the requested filter.', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneReportGetReport: { - lexicon: 1, - id: 'tools.ozone.report.getReport', - defs: { - main: { - type: 'query', - description: 'Get details about a single moderation report by ID.', - parameters: { - type: 'params', - required: ['id'], - properties: { - id: { - type: 'integer', - description: 'The ID of the report to retrieve.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportView', - }, - }, - errors: [ - { - name: 'NotFound', - description: 'No report found.', - }, - ], - }, - }, - }, - ToolsOzoneReportListActivities: { - lexicon: 1, - id: 'tools.ozone.report.listActivities', - defs: { - main: { - type: 'query', - description: - 'List all activities for a report, sorted most-recent-first.', - parameters: { - type: 'params', - required: ['reportId'], - properties: { - reportId: { - type: 'integer', - description: 'ID of the report whose activities to list', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['activities'], - properties: { - activities: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportActivityView', - }, - }, - cursor: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneReportQueryReports: { - lexicon: 1, - id: 'tools.ozone.report.queryReports', - defs: { - main: { - type: 'query', - description: - 'View moderation reports. Reports are individual instances of content being reported, as opposed to subject statuses which aggregate reports at the subject level.', - parameters: { - type: 'params', - required: ['status'], - properties: { - queueId: { - type: 'integer', - description: 'Filter by queue ID. Use -1 for unassigned reports.', - }, - reportTypes: { - type: 'array', - items: { - type: 'string', - }, - description: - 'Filter by report types (fully qualified string in the format of com.atproto.moderation.defs#reason).', - }, - status: { - type: 'string', - knownValues: [ - 'open', - 'closed', - 'escalated', - 'queued', - 'assigned', - ], - description: 'Filter by report status.', - }, - subject: { - type: 'string', - format: 'uri', - description: 'Filter by subject DID or AT-URI.', - }, - did: { - type: 'string', - format: 'did', - description: - 'Filter to reports where the subject is this DID or any record owned by this DID. Unlike `subject` (which scopes to a specific account or record), this returns all reports tied to the DID across both account-level and record-level subjects.', - }, - subjectType: { - type: 'string', - description: - 'If specified, reports of the given type (account or record) will be returned.', - knownValues: ['account', 'record'], - }, - collections: { - type: 'array', - maxLength: 20, - description: - "If specified, reports where the subject belongs to the given collections will be returned. When subjectType is set to 'account', this will be ignored.", - items: { - type: 'string', - format: 'nsid', - }, - }, - reportedAfter: { - type: 'string', - format: 'datetime', - description: 'Retrieve reports created after a given timestamp', - }, - reportedBefore: { - type: 'string', - format: 'datetime', - description: 'Retrieve reports created before a given timestamp', - }, - isMuted: { - type: 'boolean', - default: false, - description: - 'Filter by muted status. true returns only muted reports, false returns only unmuted reports. Defaults to false.', - }, - assignedTo: { - type: 'string', - format: 'did', - description: - 'Filter by the DID of the moderator permanently assigned to the report.', - }, - sortField: { - type: 'string', - default: 'createdAt', - enum: ['createdAt', 'updatedAt'], - }, - sortDirection: { - type: 'string', - default: 'desc', - enum: ['asc', 'desc'], - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['reports'], - properties: { - cursor: { - type: 'string', - }, - reports: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneReportReassignQueue: { - lexicon: 1, - id: 'tools.ozone.report.reassignQueue', - defs: { - main: { - type: 'procedure', - description: - 'Manually reassign a report to a different queue (or unassign it). Records a queueActivity entry on the report.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['reportId', 'queueId'], - properties: { - reportId: { - type: 'integer', - description: 'ID of the report to reassign', - }, - queueId: { - type: 'integer', - description: - 'Target queue ID. Use -1 to unassign from any queue.', - }, - comment: { - type: 'string', - description: - 'Optional moderator-only note recorded on the resulting queueActivity as internalNote.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['report'], - properties: { - report: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#reportView', - }, - }, - }, - }, - errors: [ - { - name: 'ReportNotFound', - description: 'No report exists with the given reportId', - }, - { - name: 'ReportClosed', - description: 'The report is closed and cannot be reassigned', - }, - { - name: 'AlreadyInTargetQueue', - description: 'The report is already assigned to the target queue', - }, - { - name: 'QueueNotFound', - description: 'No active queue exists with the given queueId', - }, - { - name: 'QueueDisabled', - description: - 'The target queue is disabled and cannot receive new assignments', - }, - ], - }, - }, - }, - ToolsOzoneReportRefreshStats: { - lexicon: 1, - id: 'tools.ozone.report.refreshStats', - defs: { - main: { - type: 'procedure', - description: - 'Recompute report statistics for a date range. Useful for backfilling after failures or data corrections.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['startDate', 'endDate'], - properties: { - startDate: { - type: 'string', - description: - 'Start date for recomputation, inclusive (YYYY-MM-DD).', - }, - endDate: { - type: 'string', - description: - 'End date for recomputation, inclusive (YYYY-MM-DD).', - }, - queueIds: { - type: 'array', - items: { - type: 'integer', - }, - description: - 'Optional list of queue IDs to recompute. Omit to recompute all groups.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - }, - }, - }, - ToolsOzoneReportUnassignModerator: { - lexicon: 1, - id: 'tools.ozone.report.unassignModerator', - defs: { - main: { - type: 'procedure', - description: 'Remove report assignment.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['reportId'], - properties: { - reportId: { - type: 'integer', - description: 'The ID of the report to unassign.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.report.defs#assignmentView', - }, - }, - errors: [ - { - name: 'InvalidAssignment', - description: 'The report ID is invalid.', - }, - ], - }, - }, - }, - ToolsOzoneSafelinkAddRule: { - lexicon: 1, - id: 'tools.ozone.safelink.addRule', - defs: { - main: { - type: 'procedure', - description: 'Add a new URL safety rule', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['url', 'pattern', 'action', 'reason'], - properties: { - url: { - type: 'string', - description: 'The URL or domain to apply the rule to', - }, - pattern: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#patternType', - }, - action: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#actionType', - }, - reason: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#reasonType', - }, - comment: { - type: 'string', - description: 'Optional comment about the decision', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'Author DID. Only respected when using admin auth', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#event', - }, - }, - errors: [ - { - name: 'InvalidUrl', - description: 'The provided URL is invalid', - }, - { - name: 'RuleAlreadyExists', - description: 'A rule for this URL/domain already exists', - }, - ], - }, - }, - }, - ToolsOzoneSafelinkDefs: { - lexicon: 1, - id: 'tools.ozone.safelink.defs', - defs: { - event: { - type: 'object', - description: 'An event for URL safety decisions', - required: [ - 'id', - 'eventType', - 'url', - 'pattern', - 'action', - 'reason', - 'createdBy', - 'createdAt', - ], - properties: { - id: { - type: 'integer', - description: 'Auto-incrementing row ID', - }, - eventType: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#eventType', - }, - url: { - type: 'string', - description: 'The URL that this rule applies to', - }, - pattern: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#patternType', - }, - action: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#actionType', - }, - reason: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#reasonType', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'DID of the user who created this rule', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - comment: { - type: 'string', - description: 'Optional comment about the decision', - }, - }, - }, - eventType: { - type: 'string', - knownValues: ['addRule', 'updateRule', 'removeRule'], - }, - patternType: { - type: 'string', - knownValues: ['domain', 'url'], - }, - actionType: { - type: 'string', - knownValues: ['block', 'warn', 'whitelist'], - }, - reasonType: { - type: 'string', - knownValues: ['csam', 'spam', 'phishing', 'none'], - }, - urlRule: { - type: 'object', - description: 'Input for creating a URL safety rule', - required: [ - 'url', - 'pattern', - 'action', - 'reason', - 'createdBy', - 'createdAt', - 'updatedAt', - ], - properties: { - url: { - type: 'string', - description: 'The URL or domain to apply the rule to', - }, - pattern: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#patternType', - }, - action: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#actionType', - }, - reason: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#reasonType', - }, - comment: { - type: 'string', - description: 'Optional comment about the decision', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'DID of the user added the rule.', - }, - createdAt: { - type: 'string', - format: 'datetime', - description: 'Timestamp when the rule was created', - }, - updatedAt: { - type: 'string', - format: 'datetime', - description: 'Timestamp when the rule was last updated', - }, - }, - }, - }, - }, - ToolsOzoneSafelinkQueryEvents: { - lexicon: 1, - id: 'tools.ozone.safelink.queryEvents', - defs: { - main: { - type: 'procedure', - description: 'Query URL safety audit events', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - cursor: { - type: 'string', - description: 'Cursor for pagination', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - description: 'Maximum number of results to return', - }, - urls: { - type: 'array', - items: { - type: 'string', - }, - description: 'Filter by specific URLs or domains', - }, - patternType: { - type: 'string', - description: 'Filter by pattern type', - }, - sortDirection: { - type: 'string', - knownValues: ['asc', 'desc'], - default: 'desc', - description: 'Sort direction', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['events'], - properties: { - cursor: { - type: 'string', - description: - 'Next cursor for pagination. Only present if there are more results.', - }, - events: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#event', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSafelinkQueryRules: { - lexicon: 1, - id: 'tools.ozone.safelink.queryRules', - defs: { - main: { - type: 'procedure', - description: 'Query URL safety rules', - input: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - cursor: { - type: 'string', - description: 'Cursor for pagination', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - description: 'Maximum number of results to return', - }, - urls: { - type: 'array', - items: { - type: 'string', - }, - description: 'Filter by specific URLs or domains', - }, - patternType: { - type: 'string', - description: 'Filter by pattern type', - }, - actions: { - type: 'array', - items: { - type: 'string', - }, - description: 'Filter by action types', - }, - reason: { - type: 'string', - description: 'Filter by reason type', - }, - createdBy: { - type: 'string', - format: 'did', - description: 'Filter by rule creator', - }, - sortDirection: { - type: 'string', - knownValues: ['asc', 'desc'], - default: 'desc', - description: 'Sort direction', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['rules'], - properties: { - cursor: { - type: 'string', - description: - 'Next cursor for pagination. Only present if there are more results.', - }, - rules: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#urlRule', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSafelinkRemoveRule: { - lexicon: 1, - id: 'tools.ozone.safelink.removeRule', - defs: { - main: { - type: 'procedure', - description: 'Remove an existing URL safety rule', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['url', 'pattern'], - properties: { - url: { - type: 'string', - description: 'The URL or domain to remove the rule for', - }, - pattern: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#patternType', - }, - comment: { - type: 'string', - description: - 'Optional comment about why the rule is being removed', - }, - createdBy: { - type: 'string', - format: 'did', - description: - 'Optional DID of the user. Only respected when using admin auth.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#event', - }, - }, - errors: [ - { - name: 'RuleNotFound', - description: 'No active rule found for this URL/domain', - }, - ], - }, - }, - }, - ToolsOzoneSafelinkUpdateRule: { - lexicon: 1, - id: 'tools.ozone.safelink.updateRule', - defs: { - main: { - type: 'procedure', - description: 'Update an existing URL safety rule', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['url', 'pattern', 'action', 'reason'], - properties: { - url: { - type: 'string', - description: 'The URL or domain to update the rule for', - }, - pattern: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#patternType', - }, - action: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#actionType', - }, - reason: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#reasonType', - }, - comment: { - type: 'string', - description: 'Optional comment about the update', - }, - createdBy: { - type: 'string', - format: 'did', - description: - 'Optional DID to credit as the creator. Only respected for admin_token authentication.', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.safelink.defs#event', - }, - }, - errors: [ - { - name: 'RuleNotFound', - description: 'No active rule found for this URL/domain', - }, - ], - }, - }, - }, - ToolsOzoneServerGetConfig: { - lexicon: 1, - id: 'tools.ozone.server.getConfig', - defs: { - main: { - type: 'query', - description: "Get details about ozone's server configuration.", - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: { - appview: { - type: 'ref', - ref: 'lex:tools.ozone.server.getConfig#serviceConfig', - }, - pds: { - type: 'ref', - ref: 'lex:tools.ozone.server.getConfig#serviceConfig', - }, - blobDivert: { - type: 'ref', - ref: 'lex:tools.ozone.server.getConfig#serviceConfig', - }, - chat: { - type: 'ref', - ref: 'lex:tools.ozone.server.getConfig#serviceConfig', - }, - viewer: { - type: 'ref', - ref: 'lex:tools.ozone.server.getConfig#viewerConfig', - }, - verifierDid: { - type: 'string', - format: 'did', - description: 'The did of the verifier used for verification.', - }, - }, - }, - }, - }, - serviceConfig: { - type: 'object', - properties: { - url: { - type: 'string', - format: 'uri', - }, - }, - }, - viewerConfig: { - type: 'object', - properties: { - role: { - type: 'string', - knownValues: [ - 'tools.ozone.team.defs#roleAdmin', - 'tools.ozone.team.defs#roleModerator', - 'tools.ozone.team.defs#roleTriage', - 'tools.ozone.team.defs#roleVerifier', - ], - }, - }, - }, - }, - }, - ToolsOzoneSetAddValues: { - lexicon: 1, - id: 'tools.ozone.set.addValues', - defs: { - main: { - type: 'procedure', - description: - 'Add values to a specific set. Attempting to add values to a set that does not exist will result in an error.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['name', 'values'], - properties: { - name: { - type: 'string', - description: 'Name of the set to add values to', - }, - values: { - type: 'array', - minLength: 1, - maxLength: 1000, - items: { - type: 'string', - }, - description: 'Array of string values to add to the set', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSetDefs: { - lexicon: 1, - id: 'tools.ozone.set.defs', - defs: { - set: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - minLength: 3, - maxLength: 128, - }, - description: { - type: 'string', - maxGraphemes: 1024, - maxLength: 10240, - }, - }, - }, - setView: { - type: 'object', - required: ['name', 'setSize', 'createdAt', 'updatedAt'], - properties: { - name: { - type: 'string', - minLength: 3, - maxLength: 128, - }, - description: { - type: 'string', - maxGraphemes: 1024, - maxLength: 10240, - }, - setSize: { - type: 'integer', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - }, - }, - }, - }, - ToolsOzoneSetDeleteSet: { - lexicon: 1, - id: 'tools.ozone.set.deleteSet', - defs: { - main: { - type: 'procedure', - description: - 'Delete an entire set. Attempting to delete a set that does not exist will result in an error.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['name'], - properties: { - name: { - type: 'string', - description: 'Name of the set to delete', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - errors: [ - { - name: 'SetNotFound', - description: 'set with the given name does not exist', - }, - ], - }, - }, - }, - ToolsOzoneSetDeleteValues: { - lexicon: 1, - id: 'tools.ozone.set.deleteValues', - defs: { - main: { - type: 'procedure', - description: - 'Delete values from a specific set. Attempting to delete values that are not in the set will not result in an error', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['name', 'values'], - properties: { - name: { - type: 'string', - description: 'Name of the set to delete values from', - }, - values: { - type: 'array', - minLength: 1, - items: { - type: 'string', - }, - description: 'Array of string values to delete from the set', - }, - }, - }, - }, - errors: [ - { - name: 'SetNotFound', - description: 'set with the given name does not exist', - }, - ], - }, - }, - }, - ToolsOzoneSetGetValues: { - lexicon: 1, - id: 'tools.ozone.set.getValues', - defs: { - main: { - type: 'query', - description: 'Get a specific set and its values', - parameters: { - type: 'params', - required: ['name'], - properties: { - name: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 1000, - default: 100, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['set', 'values'], - properties: { - set: { - type: 'ref', - ref: 'lex:tools.ozone.set.defs#setView', - }, - values: { - type: 'array', - items: { - type: 'string', - }, - }, - cursor: { - type: 'string', - }, - }, - }, - }, - errors: [ - { - name: 'SetNotFound', - description: 'set with the given name does not exist', - }, - ], - }, - }, - }, - ToolsOzoneSetQuerySets: { - lexicon: 1, - id: 'tools.ozone.set.querySets', - defs: { - main: { - type: 'query', - description: 'Query available sets', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - namePrefix: { - type: 'string', - }, - sortBy: { - type: 'string', - enum: ['name', 'createdAt', 'updatedAt'], - default: 'name', - }, - sortDirection: { - type: 'string', - default: 'asc', - enum: ['asc', 'desc'], - description: 'Defaults to ascending order of name field.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['sets'], - properties: { - sets: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.set.defs#setView', - }, - }, - cursor: { - type: 'string', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSetUpsertSet: { - lexicon: 1, - id: 'tools.ozone.set.upsertSet', - defs: { - main: { - type: 'procedure', - description: 'Create or update set metadata', - input: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.set.defs#set', - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.set.defs#setView', - }, - }, - }, - }, - }, - ToolsOzoneSettingDefs: { - lexicon: 1, - id: 'tools.ozone.setting.defs', - defs: { - option: { - type: 'object', - required: [ - 'key', - 'value', - 'did', - 'scope', - 'createdBy', - 'lastUpdatedBy', - ], - properties: { - key: { - type: 'string', - format: 'nsid', - }, - did: { - type: 'string', - format: 'did', - }, - value: { - type: 'unknown', - }, - description: { - type: 'string', - maxGraphemes: 1024, - maxLength: 10240, - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - managerRole: { - type: 'string', - knownValues: [ - 'tools.ozone.team.defs#roleModerator', - 'tools.ozone.team.defs#roleTriage', - 'tools.ozone.team.defs#roleAdmin', - 'tools.ozone.team.defs#roleVerifier', - ], - }, - scope: { - type: 'string', - knownValues: ['instance', 'personal'], - }, - createdBy: { - type: 'string', - format: 'did', - }, - lastUpdatedBy: { - type: 'string', - format: 'did', - }, - }, - }, - }, - }, - ToolsOzoneSettingListOptions: { - lexicon: 1, - id: 'tools.ozone.setting.listOptions', - defs: { - main: { - type: 'query', - description: 'List settings with optional filtering', - parameters: { - type: 'params', - properties: { - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - scope: { - type: 'string', - knownValues: ['instance', 'personal'], - default: 'instance', - }, - prefix: { - type: 'string', - description: 'Filter keys by prefix', - }, - keys: { - type: 'array', - maxLength: 100, - items: { - type: 'string', - format: 'nsid', - }, - description: - 'Filter for only the specified keys. Ignored if prefix is provided', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['options'], - properties: { - cursor: { - type: 'string', - }, - options: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.setting.defs#option', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSettingRemoveOptions: { - lexicon: 1, - id: 'tools.ozone.setting.removeOptions', - defs: { - main: { - type: 'procedure', - description: 'Delete settings by key', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['keys', 'scope'], - properties: { - keys: { - type: 'array', - minLength: 1, - maxLength: 200, - items: { - type: 'string', - format: 'nsid', - }, - }, - scope: { - type: 'string', - knownValues: ['instance', 'personal'], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - properties: {}, - }, - }, - }, - }, - }, - ToolsOzoneSettingUpsertOption: { - lexicon: 1, - id: 'tools.ozone.setting.upsertOption', - defs: { - main: { - type: 'procedure', - description: 'Create or update setting option', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['key', 'scope', 'value'], - properties: { - key: { - type: 'string', - format: 'nsid', - }, - scope: { - type: 'string', - knownValues: ['instance', 'personal'], - }, - value: { - type: 'unknown', - }, - description: { - type: 'string', - maxLength: 2000, - }, - managerRole: { - type: 'string', - knownValues: [ - 'tools.ozone.team.defs#roleModerator', - 'tools.ozone.team.defs#roleTriage', - 'tools.ozone.team.defs#roleVerifier', - 'tools.ozone.team.defs#roleAdmin', - ], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['option'], - properties: { - option: { - type: 'ref', - ref: 'lex:tools.ozone.setting.defs#option', - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSignatureDefs: { - lexicon: 1, - id: 'tools.ozone.signature.defs', - defs: { - sigDetail: { - type: 'object', - required: ['property', 'value'], - properties: { - property: { - type: 'string', - }, - value: { - type: 'string', - }, - }, - }, - }, - }, - ToolsOzoneSignatureFindCorrelation: { - lexicon: 1, - id: 'tools.ozone.signature.findCorrelation', - defs: { - main: { - type: 'query', - description: - 'Find all correlated threat signatures between 2 or more accounts.', - parameters: { - type: 'params', - required: ['dids'], - properties: { - dids: { - type: 'array', - items: { - type: 'string', - format: 'did', - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['details'], - properties: { - details: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.signature.defs#sigDetail', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneSignatureFindRelatedAccounts: { - lexicon: 1, - id: 'tools.ozone.signature.findRelatedAccounts', - defs: { - main: { - type: 'query', - description: - 'Get accounts that share some matching threat signatures with the root account.', - parameters: { - type: 'params', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - cursor: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['accounts'], - properties: { - cursor: { - type: 'string', - }, - accounts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.signature.findRelatedAccounts#relatedAccount', - }, - }, - }, - }, - }, - }, - relatedAccount: { - type: 'object', - required: ['account'], - properties: { - account: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#accountView', - }, - similarities: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.signature.defs#sigDetail', - }, - }, - }, - }, - }, - }, - ToolsOzoneSignatureSearchAccounts: { - lexicon: 1, - id: 'tools.ozone.signature.searchAccounts', - defs: { - main: { - type: 'query', - description: - 'Search for accounts that match one or more threat signature values.', - parameters: { - type: 'params', - required: ['values'], - properties: { - values: { - type: 'array', - items: { - type: 'string', - }, - }, - cursor: { - type: 'string', - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['accounts'], - properties: { - cursor: { - type: 'string', - }, - accounts: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:com.atproto.admin.defs#accountView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneTeamAddMember: { - lexicon: 1, - id: 'tools.ozone.team.addMember', - defs: { - main: { - type: 'procedure', - description: 'Add a member to the ozone team. Requires admin role.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did', 'role'], - properties: { - did: { - type: 'string', - format: 'did', - }, - role: { - type: 'string', - knownValues: [ - 'tools.ozone.team.defs#roleAdmin', - 'tools.ozone.team.defs#roleModerator', - 'tools.ozone.team.defs#roleVerifier', - 'tools.ozone.team.defs#roleTriage', - ], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - }, - }, - errors: [ - { - name: 'MemberAlreadyExists', - description: 'Member already exists in the team.', - }, - ], - }, - }, - }, - ToolsOzoneTeamDefs: { - lexicon: 1, - id: 'tools.ozone.team.defs', - defs: { - member: { - type: 'object', - required: ['did', 'role'], - properties: { - did: { - type: 'string', - format: 'did', - }, - disabled: { - type: 'boolean', - }, - profile: { - type: 'ref', - ref: 'lex:app.bsky.actor.defs#profileViewDetailed', - }, - createdAt: { - type: 'string', - format: 'datetime', - }, - updatedAt: { - type: 'string', - format: 'datetime', - }, - lastUpdatedBy: { - type: 'string', - }, - role: { - type: 'string', - knownValues: [ - 'tools.ozone.team.defs#roleAdmin', - 'tools.ozone.team.defs#roleModerator', - 'tools.ozone.team.defs#roleTriage', - 'tools.ozone.team.defs#roleVerifier', - ], - }, - }, - }, - roleAdmin: { - type: 'token', - description: - 'Admin role. Highest level of access, can perform all actions.', - }, - roleModerator: { - type: 'token', - description: 'Moderator role. Can perform most actions.', - }, - roleTriage: { - type: 'token', - description: - 'Triage role. Mostly intended for monitoring and escalating issues.', - }, - roleVerifier: { - type: 'token', - description: 'Verifier role. Only allowed to issue verifications.', - }, - }, - }, - ToolsOzoneTeamDeleteMember: { - lexicon: 1, - id: 'tools.ozone.team.deleteMember', - defs: { - main: { - type: 'procedure', - description: 'Delete a member from ozone team. Requires admin role.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - }, - }, - }, - errors: [ - { - name: 'MemberNotFound', - description: 'The member being deleted does not exist', - }, - { - name: 'CannotDeleteSelf', - description: 'You can not delete yourself from the team', - }, - ], - }, - }, - }, - ToolsOzoneTeamListMembers: { - lexicon: 1, - id: 'tools.ozone.team.listMembers', - defs: { - main: { - type: 'query', - description: 'List all members with access to the ozone service.', - parameters: { - type: 'params', - properties: { - q: { - type: 'string', - }, - disabled: { - type: 'boolean', - }, - roles: { - type: 'array', - items: { - type: 'string', - }, - }, - limit: { - type: 'integer', - minimum: 1, - maximum: 100, - default: 50, - }, - cursor: { - type: 'string', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['members'], - properties: { - cursor: { - type: 'string', - }, - members: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneTeamUpdateMember: { - lexicon: 1, - id: 'tools.ozone.team.updateMember', - defs: { - main: { - type: 'procedure', - description: - 'Update a member in the ozone service. Requires admin role.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['did'], - properties: { - did: { - type: 'string', - format: 'did', - }, - disabled: { - type: 'boolean', - }, - role: { - type: 'string', - knownValues: [ - 'tools.ozone.team.defs#roleAdmin', - 'tools.ozone.team.defs#roleModerator', - 'tools.ozone.team.defs#roleVerifier', - 'tools.ozone.team.defs#roleTriage', - ], - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'ref', - ref: 'lex:tools.ozone.team.defs#member', - }, - }, - errors: [ - { - name: 'MemberNotFound', - description: 'The member being updated does not exist in the team', - }, - ], - }, - }, - }, - ToolsOzoneVerificationDefs: { - lexicon: 1, - id: 'tools.ozone.verification.defs', - defs: { - verificationView: { - type: 'object', - description: 'Verification data for the associated subject.', - required: [ - 'issuer', - 'uri', - 'subject', - 'handle', - 'displayName', - 'createdAt', - ], - properties: { - issuer: { - type: 'string', - description: 'The user who issued this verification.', - format: 'did', - }, - uri: { - type: 'string', - description: 'The AT-URI of the verification record.', - format: 'at-uri', - }, - subject: { - type: 'string', - format: 'did', - description: 'The subject of the verification.', - }, - handle: { - type: 'string', - description: - 'Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying.', - format: 'handle', - }, - displayName: { - type: 'string', - description: - 'Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying.', - }, - createdAt: { - type: 'string', - description: 'Timestamp when the verification was created.', - format: 'datetime', - }, - revokeReason: { - type: 'string', - description: - 'Describes the reason for revocation, also indicating that the verification is no longer valid.', - }, - revokedAt: { - type: 'string', - description: 'Timestamp when the verification was revoked.', - format: 'datetime', - }, - revokedBy: { - type: 'string', - description: 'The user who revoked this verification.', - format: 'did', - }, - subjectProfile: { - type: 'union', - refs: [], - }, - issuerProfile: { - type: 'union', - refs: [], - }, - subjectRepo: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#repoViewDetail', - 'lex:tools.ozone.moderation.defs#repoViewNotFound', - ], - }, - issuerRepo: { - type: 'union', - refs: [ - 'lex:tools.ozone.moderation.defs#repoViewDetail', - 'lex:tools.ozone.moderation.defs#repoViewNotFound', - ], - }, - }, - }, - }, - }, - ToolsOzoneVerificationGrantVerifications: { - lexicon: 1, - id: 'tools.ozone.verification.grantVerifications', - defs: { - main: { - type: 'procedure', - description: - 'Grant verifications to multiple subjects. Allows batch processing of up to 100 verifications at once.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['verifications'], - properties: { - verifications: { - type: 'array', - description: 'Array of verification requests to process', - maxLength: 100, - items: { - type: 'ref', - ref: 'lex:tools.ozone.verification.grantVerifications#verificationInput', - }, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['verifications', 'failedVerifications'], - properties: { - verifications: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.verification.defs#verificationView', - }, - }, - failedVerifications: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.verification.grantVerifications#grantError', - }, - }, - }, - }, - }, - }, - verificationInput: { - type: 'object', - required: ['subject', 'handle', 'displayName'], - properties: { - subject: { - type: 'string', - description: 'The did of the subject being verified', - format: 'did', - }, - handle: { - type: 'string', - description: - 'Handle of the subject the verification applies to at the moment of verifying.', - format: 'handle', - }, - displayName: { - type: 'string', - description: - 'Display name of the subject the verification applies to at the moment of verifying.', - }, - createdAt: { - type: 'string', - format: 'datetime', - description: - 'Timestamp for verification record. Defaults to current time when not specified.', - }, - }, - }, - grantError: { - type: 'object', - description: 'Error object for failed verifications.', - required: ['error', 'subject'], - properties: { - error: { - type: 'string', - description: 'Error message describing the reason for failure.', - }, - subject: { - type: 'string', - description: 'The did of the subject being verified', - format: 'did', - }, - }, - }, - }, - }, - ToolsOzoneVerificationListVerifications: { - lexicon: 1, - id: 'tools.ozone.verification.listVerifications', - defs: { - main: { - type: 'query', - description: 'List verifications', - parameters: { - type: 'params', - properties: { - cursor: { - type: 'string', - description: 'Pagination cursor', - }, - limit: { - type: 'integer', - description: 'Maximum number of results to return', - minimum: 1, - maximum: 100, - default: 50, - }, - createdAfter: { - type: 'string', - format: 'datetime', - description: - 'Filter to verifications created after this timestamp', - }, - createdBefore: { - type: 'string', - format: 'datetime', - description: - 'Filter to verifications created before this timestamp', - }, - issuers: { - type: 'array', - maxLength: 100, - description: 'Filter to verifications from specific issuers', - items: { - type: 'string', - format: 'did', - }, - }, - subjects: { - type: 'array', - description: 'Filter to specific verified DIDs', - maxLength: 100, - items: { - type: 'string', - format: 'did', - }, - }, - sortDirection: { - type: 'string', - description: 'Sort direction for creation date', - enum: ['asc', 'desc'], - default: 'desc', - }, - isRevoked: { - type: 'boolean', - description: - 'Filter to verifications that are revoked or not. By default, includes both.', - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['verifications'], - properties: { - cursor: { - type: 'string', - }, - verifications: { - type: 'array', - items: { - type: 'ref', - ref: 'lex:tools.ozone.verification.defs#verificationView', - }, - }, - }, - }, - }, - }, - }, - }, - ToolsOzoneVerificationRevokeVerifications: { - lexicon: 1, - id: 'tools.ozone.verification.revokeVerifications', - defs: { - main: { - type: 'procedure', - description: - 'Revoke previously granted verifications in batches of up to 100.', - input: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['uris'], - properties: { - uris: { - type: 'array', - description: 'Array of verification record uris to revoke', - maxLength: 100, - items: { - type: 'string', - description: - 'The AT-URI of the verification record to revoke.', - format: 'at-uri', - }, - }, - revokeReason: { - type: 'string', - description: - 'Reason for revoking the verification. This is optional and can be omitted if not needed.', - maxLength: 1000, - }, - }, - }, - }, - output: { - encoding: 'application/json', - schema: { - type: 'object', - required: ['revokedVerifications', 'failedRevocations'], - properties: { - revokedVerifications: { - type: 'array', - description: 'List of verification uris successfully revoked', - items: { - type: 'string', - format: 'at-uri', - }, - }, - failedRevocations: { - type: 'array', - description: - "List of verification uris that couldn't be revoked, including failure reasons", - items: { - type: 'ref', - ref: 'lex:tools.ozone.verification.revokeVerifications#revokeError', - }, - }, - }, - }, - }, - }, - revokeError: { - type: 'object', - description: 'Error object for failed revocations', - required: ['uri', 'error'], - properties: { - uri: { - type: 'string', - description: - 'The AT-URI of the verification record that failed to revoke.', - format: 'at-uri', - }, - error: { - type: 'string', - description: - 'Description of the error that occurred during revocation.', - }, - }, - }, - }, - }, -} as const satisfies Record -export const schemas = Object.values(schemaDict) satisfies LexiconDoc[] -export const lexicons: Lexicons = new Lexicons(schemas) - -export function validate( - v: unknown, - id: string, - hash: string, - requiredType: true, -): ValidationResult -export function validate( - v: unknown, - id: string, - hash: string, - requiredType?: false, -): ValidationResult -export function validate( - v: unknown, - id: string, - hash: string, - requiredType?: boolean, -): ValidationResult { - return (requiredType ? is$typed : maybe$typed)(v, id, hash) - ? lexicons.validate(`${id}#${hash}`, v) - : { - success: false, - error: new ValidationError( - `Must be an object with "${hash === 'main' ? id : `${id}#${hash}`}" $type property`, - ), - } -} - -export const ids = { - AppBskyActorDefs: 'app.bsky.actor.defs', - AppBskyActorGetPreferences: 'app.bsky.actor.getPreferences', - AppBskyActorGetProfile: 'app.bsky.actor.getProfile', - AppBskyActorGetProfiles: 'app.bsky.actor.getProfiles', - AppBskyActorGetSuggestions: 'app.bsky.actor.getSuggestions', - AppBskyActorProfile: 'app.bsky.actor.profile', - AppBskyActorPutPreferences: 'app.bsky.actor.putPreferences', - AppBskyActorSearchActors: 'app.bsky.actor.searchActors', - AppBskyActorSearchActorsTypeahead: 'app.bsky.actor.searchActorsTypeahead', - AppBskyActorStatus: 'app.bsky.actor.status', - AppBskyAgeassuranceBegin: 'app.bsky.ageassurance.begin', - AppBskyAgeassuranceDefs: 'app.bsky.ageassurance.defs', - AppBskyAgeassuranceGetConfig: 'app.bsky.ageassurance.getConfig', - AppBskyAgeassuranceGetState: 'app.bsky.ageassurance.getState', - AppBskyBookmarkCreateBookmark: 'app.bsky.bookmark.createBookmark', - AppBskyBookmarkDefs: 'app.bsky.bookmark.defs', - AppBskyBookmarkDeleteBookmark: 'app.bsky.bookmark.deleteBookmark', - AppBskyBookmarkGetBookmarks: 'app.bsky.bookmark.getBookmarks', - AppBskyContactDefs: 'app.bsky.contact.defs', - AppBskyContactDismissMatch: 'app.bsky.contact.dismissMatch', - AppBskyContactGetMatches: 'app.bsky.contact.getMatches', - AppBskyContactGetSyncStatus: 'app.bsky.contact.getSyncStatus', - AppBskyContactImportContacts: 'app.bsky.contact.importContacts', - AppBskyContactRemoveData: 'app.bsky.contact.removeData', - AppBskyContactSendNotification: 'app.bsky.contact.sendNotification', - AppBskyContactStartPhoneVerification: - 'app.bsky.contact.startPhoneVerification', - AppBskyContactVerifyPhone: 'app.bsky.contact.verifyPhone', - AppBskyDraftCreateDraft: 'app.bsky.draft.createDraft', - AppBskyDraftDefs: 'app.bsky.draft.defs', - AppBskyDraftDeleteDraft: 'app.bsky.draft.deleteDraft', - AppBskyDraftGetDrafts: 'app.bsky.draft.getDrafts', - AppBskyDraftUpdateDraft: 'app.bsky.draft.updateDraft', - AppBskyEmbedDefs: 'app.bsky.embed.defs', - AppBskyEmbedExternal: 'app.bsky.embed.external', - AppBskyEmbedImages: 'app.bsky.embed.images', - AppBskyEmbedRecord: 'app.bsky.embed.record', - AppBskyEmbedRecordWithMedia: 'app.bsky.embed.recordWithMedia', - AppBskyEmbedVideo: 'app.bsky.embed.video', - AppBskyFeedDefs: 'app.bsky.feed.defs', - AppBskyFeedDescribeFeedGenerator: 'app.bsky.feed.describeFeedGenerator', - AppBskyFeedGenerator: 'app.bsky.feed.generator', - AppBskyFeedGetActorFeeds: 'app.bsky.feed.getActorFeeds', - AppBskyFeedGetActorLikes: 'app.bsky.feed.getActorLikes', - AppBskyFeedGetAuthorFeed: 'app.bsky.feed.getAuthorFeed', - AppBskyFeedGetFeed: 'app.bsky.feed.getFeed', - AppBskyFeedGetFeedGenerator: 'app.bsky.feed.getFeedGenerator', - AppBskyFeedGetFeedGenerators: 'app.bsky.feed.getFeedGenerators', - AppBskyFeedGetFeedSkeleton: 'app.bsky.feed.getFeedSkeleton', - AppBskyFeedGetLikes: 'app.bsky.feed.getLikes', - AppBskyFeedGetListFeed: 'app.bsky.feed.getListFeed', - AppBskyFeedGetPostThread: 'app.bsky.feed.getPostThread', - AppBskyFeedGetPosts: 'app.bsky.feed.getPosts', - AppBskyFeedGetQuotes: 'app.bsky.feed.getQuotes', - AppBskyFeedGetRepostedBy: 'app.bsky.feed.getRepostedBy', - AppBskyFeedGetSuggestedFeeds: 'app.bsky.feed.getSuggestedFeeds', - AppBskyFeedGetTimeline: 'app.bsky.feed.getTimeline', - AppBskyFeedLike: 'app.bsky.feed.like', - AppBskyFeedPost: 'app.bsky.feed.post', - AppBskyFeedPostgate: 'app.bsky.feed.postgate', - AppBskyFeedRepost: 'app.bsky.feed.repost', - AppBskyFeedSearchPosts: 'app.bsky.feed.searchPosts', - AppBskyFeedSendInteractions: 'app.bsky.feed.sendInteractions', - AppBskyFeedThreadgate: 'app.bsky.feed.threadgate', - AppBskyGraphBlock: 'app.bsky.graph.block', - AppBskyGraphDefs: 'app.bsky.graph.defs', - AppBskyGraphFollow: 'app.bsky.graph.follow', - AppBskyGraphGetActorStarterPacks: 'app.bsky.graph.getActorStarterPacks', - AppBskyGraphGetBlocks: 'app.bsky.graph.getBlocks', - AppBskyGraphGetFollowers: 'app.bsky.graph.getFollowers', - AppBskyGraphGetFollows: 'app.bsky.graph.getFollows', - AppBskyGraphGetKnownFollowers: 'app.bsky.graph.getKnownFollowers', - AppBskyGraphGetList: 'app.bsky.graph.getList', - AppBskyGraphGetListBlocks: 'app.bsky.graph.getListBlocks', - AppBskyGraphGetListMutes: 'app.bsky.graph.getListMutes', - AppBskyGraphGetLists: 'app.bsky.graph.getLists', - AppBskyGraphGetListsWithMembership: 'app.bsky.graph.getListsWithMembership', - AppBskyGraphGetMutes: 'app.bsky.graph.getMutes', - AppBskyGraphGetRelationships: 'app.bsky.graph.getRelationships', - AppBskyGraphGetStarterPack: 'app.bsky.graph.getStarterPack', - AppBskyGraphGetStarterPacks: 'app.bsky.graph.getStarterPacks', - AppBskyGraphGetStarterPacksWithMembership: - 'app.bsky.graph.getStarterPacksWithMembership', - AppBskyGraphGetSuggestedFollowsByActor: - 'app.bsky.graph.getSuggestedFollowsByActor', - AppBskyGraphList: 'app.bsky.graph.list', - AppBskyGraphListblock: 'app.bsky.graph.listblock', - AppBskyGraphListitem: 'app.bsky.graph.listitem', - AppBskyGraphMuteActor: 'app.bsky.graph.muteActor', - AppBskyGraphMuteActorList: 'app.bsky.graph.muteActorList', - AppBskyGraphMuteThread: 'app.bsky.graph.muteThread', - AppBskyGraphSearchStarterPacks: 'app.bsky.graph.searchStarterPacks', - AppBskyGraphStarterpack: 'app.bsky.graph.starterpack', - AppBskyGraphUnmuteActor: 'app.bsky.graph.unmuteActor', - AppBskyGraphUnmuteActorList: 'app.bsky.graph.unmuteActorList', - AppBskyGraphUnmuteThread: 'app.bsky.graph.unmuteThread', - AppBskyGraphVerification: 'app.bsky.graph.verification', - AppBskyLabelerDefs: 'app.bsky.labeler.defs', - AppBskyLabelerGetServices: 'app.bsky.labeler.getServices', - AppBskyLabelerService: 'app.bsky.labeler.service', - AppBskyNotificationDeclaration: 'app.bsky.notification.declaration', - AppBskyNotificationDefs: 'app.bsky.notification.defs', - AppBskyNotificationGetPreferences: 'app.bsky.notification.getPreferences', - AppBskyNotificationGetUnreadCount: 'app.bsky.notification.getUnreadCount', - AppBskyNotificationListActivitySubscriptions: - 'app.bsky.notification.listActivitySubscriptions', - AppBskyNotificationListNotifications: - 'app.bsky.notification.listNotifications', - AppBskyNotificationPutActivitySubscription: - 'app.bsky.notification.putActivitySubscription', - AppBskyNotificationPutPreferences: 'app.bsky.notification.putPreferences', - AppBskyNotificationPutPreferencesV2: 'app.bsky.notification.putPreferencesV2', - AppBskyNotificationRegisterPush: 'app.bsky.notification.registerPush', - AppBskyNotificationUnregisterPush: 'app.bsky.notification.unregisterPush', - AppBskyNotificationUpdateSeen: 'app.bsky.notification.updateSeen', - AppBskyRichtextFacet: 'app.bsky.richtext.facet', - AppBskyUnspeccedDefs: 'app.bsky.unspecced.defs', - AppBskyUnspeccedGetAgeAssuranceState: - 'app.bsky.unspecced.getAgeAssuranceState', - AppBskyUnspeccedGetConfig: 'app.bsky.unspecced.getConfig', - AppBskyUnspeccedGetOnboardingSuggestedStarterPacks: - 'app.bsky.unspecced.getOnboardingSuggestedStarterPacks', - AppBskyUnspeccedGetOnboardingSuggestedStarterPacksSkeleton: - 'app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton', - AppBskyUnspeccedGetOnboardingSuggestedUsersSkeleton: - 'app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton', - AppBskyUnspeccedGetPopularFeedGenerators: - 'app.bsky.unspecced.getPopularFeedGenerators', - AppBskyUnspeccedGetPostThreadOtherV2: - 'app.bsky.unspecced.getPostThreadOtherV2', - AppBskyUnspeccedGetPostThreadV2: 'app.bsky.unspecced.getPostThreadV2', - AppBskyUnspeccedGetSuggestedFeeds: 'app.bsky.unspecced.getSuggestedFeeds', - AppBskyUnspeccedGetSuggestedFeedsSkeleton: - 'app.bsky.unspecced.getSuggestedFeedsSkeleton', - AppBskyUnspeccedGetSuggestedOnboardingUsers: - 'app.bsky.unspecced.getSuggestedOnboardingUsers', - AppBskyUnspeccedGetSuggestedStarterPacks: - 'app.bsky.unspecced.getSuggestedStarterPacks', - AppBskyUnspeccedGetSuggestedStarterPacksSkeleton: - 'app.bsky.unspecced.getSuggestedStarterPacksSkeleton', - AppBskyUnspeccedGetSuggestedUsers: 'app.bsky.unspecced.getSuggestedUsers', - AppBskyUnspeccedGetSuggestedUsersForDiscover: - 'app.bsky.unspecced.getSuggestedUsersForDiscover', - AppBskyUnspeccedGetSuggestedUsersForDiscoverSkeleton: - 'app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton', - AppBskyUnspeccedGetSuggestedUsersForExplore: - 'app.bsky.unspecced.getSuggestedUsersForExplore', - AppBskyUnspeccedGetSuggestedUsersForExploreSkeleton: - 'app.bsky.unspecced.getSuggestedUsersForExploreSkeleton', - AppBskyUnspeccedGetSuggestedUsersForSeeMore: - 'app.bsky.unspecced.getSuggestedUsersForSeeMore', - AppBskyUnspeccedGetSuggestedUsersForSeeMoreSkeleton: - 'app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton', - AppBskyUnspeccedGetSuggestedUsersSkeleton: - 'app.bsky.unspecced.getSuggestedUsersSkeleton', - AppBskyUnspeccedGetSuggestionsSkeleton: - 'app.bsky.unspecced.getSuggestionsSkeleton', - AppBskyUnspeccedGetTaggedSuggestions: - 'app.bsky.unspecced.getTaggedSuggestions', - AppBskyUnspeccedGetTrendingTopics: 'app.bsky.unspecced.getTrendingTopics', - AppBskyUnspeccedGetTrends: 'app.bsky.unspecced.getTrends', - AppBskyUnspeccedGetTrendsSkeleton: 'app.bsky.unspecced.getTrendsSkeleton', - AppBskyUnspeccedInitAgeAssurance: 'app.bsky.unspecced.initAgeAssurance', - AppBskyUnspeccedSearchActorsSkeleton: - 'app.bsky.unspecced.searchActorsSkeleton', - AppBskyUnspeccedSearchPostsSkeleton: 'app.bsky.unspecced.searchPostsSkeleton', - AppBskyUnspeccedSearchStarterPacksSkeleton: - 'app.bsky.unspecced.searchStarterPacksSkeleton', - AppBskyVideoDefs: 'app.bsky.video.defs', - AppBskyVideoGetJobStatus: 'app.bsky.video.getJobStatus', - AppBskyVideoGetUploadLimits: 'app.bsky.video.getUploadLimits', - AppBskyVideoUploadVideo: 'app.bsky.video.uploadVideo', - ChatBskyActorDeclaration: 'chat.bsky.actor.declaration', - ChatBskyActorDefs: 'chat.bsky.actor.defs', - ChatBskyActorDeleteAccount: 'chat.bsky.actor.deleteAccount', - ChatBskyActorExportAccountData: 'chat.bsky.actor.exportAccountData', - ChatBskyConvoAcceptConvo: 'chat.bsky.convo.acceptConvo', - ChatBskyConvoAddReaction: 'chat.bsky.convo.addReaction', - ChatBskyConvoDefs: 'chat.bsky.convo.defs', - ChatBskyConvoDeleteMessageForSelf: 'chat.bsky.convo.deleteMessageForSelf', - ChatBskyConvoGetConvo: 'chat.bsky.convo.getConvo', - ChatBskyConvoGetConvoAvailability: 'chat.bsky.convo.getConvoAvailability', - ChatBskyConvoGetConvoForMembers: 'chat.bsky.convo.getConvoForMembers', - ChatBskyConvoGetConvoMembers: 'chat.bsky.convo.getConvoMembers', - ChatBskyConvoGetLog: 'chat.bsky.convo.getLog', - ChatBskyConvoGetMessages: 'chat.bsky.convo.getMessages', - ChatBskyConvoLeaveConvo: 'chat.bsky.convo.leaveConvo', - ChatBskyConvoListConvoRequests: 'chat.bsky.convo.listConvoRequests', - ChatBskyConvoListConvos: 'chat.bsky.convo.listConvos', - ChatBskyConvoLockConvo: 'chat.bsky.convo.lockConvo', - ChatBskyConvoMuteConvo: 'chat.bsky.convo.muteConvo', - ChatBskyConvoRemoveReaction: 'chat.bsky.convo.removeReaction', - ChatBskyConvoSendMessage: 'chat.bsky.convo.sendMessage', - ChatBskyConvoSendMessageBatch: 'chat.bsky.convo.sendMessageBatch', - ChatBskyConvoUnlockConvo: 'chat.bsky.convo.unlockConvo', - ChatBskyConvoUnmuteConvo: 'chat.bsky.convo.unmuteConvo', - ChatBskyConvoUpdateAllRead: 'chat.bsky.convo.updateAllRead', - ChatBskyConvoUpdateRead: 'chat.bsky.convo.updateRead', - ChatBskyGroupAddMembers: 'chat.bsky.group.addMembers', - ChatBskyGroupApproveJoinRequest: 'chat.bsky.group.approveJoinRequest', - ChatBskyGroupCreateGroup: 'chat.bsky.group.createGroup', - ChatBskyGroupCreateJoinLink: 'chat.bsky.group.createJoinLink', - ChatBskyGroupDefs: 'chat.bsky.group.defs', - ChatBskyGroupDisableJoinLink: 'chat.bsky.group.disableJoinLink', - ChatBskyGroupEditGroup: 'chat.bsky.group.editGroup', - ChatBskyGroupEditJoinLink: 'chat.bsky.group.editJoinLink', - ChatBskyGroupEnableJoinLink: 'chat.bsky.group.enableJoinLink', - ChatBskyGroupGetJoinLinkPreview: 'chat.bsky.group.getJoinLinkPreview', - ChatBskyGroupListJoinRequests: 'chat.bsky.group.listJoinRequests', - ChatBskyGroupListMutualGroups: 'chat.bsky.group.listMutualGroups', - ChatBskyGroupRejectJoinRequest: 'chat.bsky.group.rejectJoinRequest', - ChatBskyGroupRemoveMembers: 'chat.bsky.group.removeMembers', - ChatBskyGroupRequestJoin: 'chat.bsky.group.requestJoin', - ChatBskyModerationGetActorMetadata: 'chat.bsky.moderation.getActorMetadata', - ChatBskyModerationGetMessageContext: 'chat.bsky.moderation.getMessageContext', - ChatBskyModerationSubscribeModEvents: - 'chat.bsky.moderation.subscribeModEvents', - ChatBskyModerationUpdateActorAccess: 'chat.bsky.moderation.updateActorAccess', - ComAtprotoAdminDefs: 'com.atproto.admin.defs', - ComAtprotoAdminDeleteAccount: 'com.atproto.admin.deleteAccount', - ComAtprotoAdminDisableAccountInvites: - 'com.atproto.admin.disableAccountInvites', - ComAtprotoAdminDisableInviteCodes: 'com.atproto.admin.disableInviteCodes', - ComAtprotoAdminEnableAccountInvites: 'com.atproto.admin.enableAccountInvites', - ComAtprotoAdminGetAccountInfo: 'com.atproto.admin.getAccountInfo', - ComAtprotoAdminGetAccountInfos: 'com.atproto.admin.getAccountInfos', - ComAtprotoAdminGetInviteCodes: 'com.atproto.admin.getInviteCodes', - ComAtprotoAdminGetSubjectStatus: 'com.atproto.admin.getSubjectStatus', - ComAtprotoAdminSearchAccounts: 'com.atproto.admin.searchAccounts', - ComAtprotoAdminSendEmail: 'com.atproto.admin.sendEmail', - ComAtprotoAdminUpdateAccountEmail: 'com.atproto.admin.updateAccountEmail', - ComAtprotoAdminUpdateAccountHandle: 'com.atproto.admin.updateAccountHandle', - ComAtprotoAdminUpdateAccountPassword: - 'com.atproto.admin.updateAccountPassword', - ComAtprotoAdminUpdateAccountSigningKey: - 'com.atproto.admin.updateAccountSigningKey', - ComAtprotoAdminUpdateSubjectStatus: 'com.atproto.admin.updateSubjectStatus', - ComAtprotoIdentityDefs: 'com.atproto.identity.defs', - ComAtprotoIdentityGetRecommendedDidCredentials: - 'com.atproto.identity.getRecommendedDidCredentials', - ComAtprotoIdentityRefreshIdentity: 'com.atproto.identity.refreshIdentity', - ComAtprotoIdentityRequestPlcOperationSignature: - 'com.atproto.identity.requestPlcOperationSignature', - ComAtprotoIdentityResolveDid: 'com.atproto.identity.resolveDid', - ComAtprotoIdentityResolveHandle: 'com.atproto.identity.resolveHandle', - ComAtprotoIdentityResolveIdentity: 'com.atproto.identity.resolveIdentity', - ComAtprotoIdentitySignPlcOperation: 'com.atproto.identity.signPlcOperation', - ComAtprotoIdentitySubmitPlcOperation: - 'com.atproto.identity.submitPlcOperation', - ComAtprotoIdentityUpdateHandle: 'com.atproto.identity.updateHandle', - ComAtprotoLabelDefs: 'com.atproto.label.defs', - ComAtprotoLabelQueryLabels: 'com.atproto.label.queryLabels', - ComAtprotoLabelSubscribeLabels: 'com.atproto.label.subscribeLabels', - ComAtprotoLexiconResolveLexicon: 'com.atproto.lexicon.resolveLexicon', - ComAtprotoLexiconSchema: 'com.atproto.lexicon.schema', - ComAtprotoModerationCreateReport: 'com.atproto.moderation.createReport', - ComAtprotoModerationDefs: 'com.atproto.moderation.defs', - ComAtprotoRepoApplyWrites: 'com.atproto.repo.applyWrites', - ComAtprotoRepoCreateRecord: 'com.atproto.repo.createRecord', - ComAtprotoRepoDefs: 'com.atproto.repo.defs', - ComAtprotoRepoDeleteRecord: 'com.atproto.repo.deleteRecord', - ComAtprotoRepoDescribeRepo: 'com.atproto.repo.describeRepo', - ComAtprotoRepoGetRecord: 'com.atproto.repo.getRecord', - ComAtprotoRepoImportRepo: 'com.atproto.repo.importRepo', - ComAtprotoRepoListMissingBlobs: 'com.atproto.repo.listMissingBlobs', - ComAtprotoRepoListRecords: 'com.atproto.repo.listRecords', - ComAtprotoRepoPutRecord: 'com.atproto.repo.putRecord', - ComAtprotoRepoStrongRef: 'com.atproto.repo.strongRef', - ComAtprotoRepoUploadBlob: 'com.atproto.repo.uploadBlob', - ComAtprotoServerActivateAccount: 'com.atproto.server.activateAccount', - ComAtprotoServerCheckAccountStatus: 'com.atproto.server.checkAccountStatus', - ComAtprotoServerConfirmEmail: 'com.atproto.server.confirmEmail', - ComAtprotoServerCreateAccount: 'com.atproto.server.createAccount', - ComAtprotoServerCreateAppPassword: 'com.atproto.server.createAppPassword', - ComAtprotoServerCreateInviteCode: 'com.atproto.server.createInviteCode', - ComAtprotoServerCreateInviteCodes: 'com.atproto.server.createInviteCodes', - ComAtprotoServerCreateSession: 'com.atproto.server.createSession', - ComAtprotoServerDeactivateAccount: 'com.atproto.server.deactivateAccount', - ComAtprotoServerDefs: 'com.atproto.server.defs', - ComAtprotoServerDeleteAccount: 'com.atproto.server.deleteAccount', - ComAtprotoServerDeleteSession: 'com.atproto.server.deleteSession', - ComAtprotoServerDescribeServer: 'com.atproto.server.describeServer', - ComAtprotoServerGetAccountInviteCodes: - 'com.atproto.server.getAccountInviteCodes', - ComAtprotoServerGetServiceAuth: 'com.atproto.server.getServiceAuth', - ComAtprotoServerGetSession: 'com.atproto.server.getSession', - ComAtprotoServerListAppPasswords: 'com.atproto.server.listAppPasswords', - ComAtprotoServerRefreshSession: 'com.atproto.server.refreshSession', - ComAtprotoServerRequestAccountDelete: - 'com.atproto.server.requestAccountDelete', - ComAtprotoServerRequestEmailConfirmation: - 'com.atproto.server.requestEmailConfirmation', - ComAtprotoServerRequestEmailUpdate: 'com.atproto.server.requestEmailUpdate', - ComAtprotoServerRequestPasswordReset: - 'com.atproto.server.requestPasswordReset', - ComAtprotoServerReserveSigningKey: 'com.atproto.server.reserveSigningKey', - ComAtprotoServerResetPassword: 'com.atproto.server.resetPassword', - ComAtprotoServerRevokeAppPassword: 'com.atproto.server.revokeAppPassword', - ComAtprotoServerUpdateEmail: 'com.atproto.server.updateEmail', - ComAtprotoSyncDefs: 'com.atproto.sync.defs', - ComAtprotoSyncGetBlob: 'com.atproto.sync.getBlob', - ComAtprotoSyncGetBlocks: 'com.atproto.sync.getBlocks', - ComAtprotoSyncGetCheckout: 'com.atproto.sync.getCheckout', - ComAtprotoSyncGetHead: 'com.atproto.sync.getHead', - ComAtprotoSyncGetHostStatus: 'com.atproto.sync.getHostStatus', - ComAtprotoSyncGetLatestCommit: 'com.atproto.sync.getLatestCommit', - ComAtprotoSyncGetRecord: 'com.atproto.sync.getRecord', - ComAtprotoSyncGetRepo: 'com.atproto.sync.getRepo', - ComAtprotoSyncGetRepoStatus: 'com.atproto.sync.getRepoStatus', - ComAtprotoSyncListBlobs: 'com.atproto.sync.listBlobs', - ComAtprotoSyncListHosts: 'com.atproto.sync.listHosts', - ComAtprotoSyncListRepos: 'com.atproto.sync.listRepos', - ComAtprotoSyncListReposByCollection: 'com.atproto.sync.listReposByCollection', - ComAtprotoSyncNotifyOfUpdate: 'com.atproto.sync.notifyOfUpdate', - ComAtprotoSyncRequestCrawl: 'com.atproto.sync.requestCrawl', - ComAtprotoSyncSubscribeRepos: 'com.atproto.sync.subscribeRepos', - ComAtprotoTempAddReservedHandle: 'com.atproto.temp.addReservedHandle', - ComAtprotoTempCheckHandleAvailability: - 'com.atproto.temp.checkHandleAvailability', - ComAtprotoTempCheckSignupQueue: 'com.atproto.temp.checkSignupQueue', - ComAtprotoTempDereferenceScope: 'com.atproto.temp.dereferenceScope', - ComAtprotoTempFetchLabels: 'com.atproto.temp.fetchLabels', - ComAtprotoTempRequestPhoneVerification: - 'com.atproto.temp.requestPhoneVerification', - ComAtprotoTempRevokeAccountCredentials: - 'com.atproto.temp.revokeAccountCredentials', - ComGermnetworkDeclaration: 'com.germnetwork.declaration', - ToolsOzoneCommunicationCreateTemplate: - 'tools.ozone.communication.createTemplate', - ToolsOzoneCommunicationDefs: 'tools.ozone.communication.defs', - ToolsOzoneCommunicationDeleteTemplate: - 'tools.ozone.communication.deleteTemplate', - ToolsOzoneCommunicationListTemplates: - 'tools.ozone.communication.listTemplates', - ToolsOzoneCommunicationUpdateTemplate: - 'tools.ozone.communication.updateTemplate', - ToolsOzoneHostingGetAccountHistory: 'tools.ozone.hosting.getAccountHistory', - ToolsOzoneModerationCancelScheduledActions: - 'tools.ozone.moderation.cancelScheduledActions', - ToolsOzoneModerationDefs: 'tools.ozone.moderation.defs', - ToolsOzoneModerationEmitEvent: 'tools.ozone.moderation.emitEvent', - ToolsOzoneModerationGetAccountTimeline: - 'tools.ozone.moderation.getAccountTimeline', - ToolsOzoneModerationGetEvent: 'tools.ozone.moderation.getEvent', - ToolsOzoneModerationGetRecord: 'tools.ozone.moderation.getRecord', - ToolsOzoneModerationGetRecords: 'tools.ozone.moderation.getRecords', - ToolsOzoneModerationGetRepo: 'tools.ozone.moderation.getRepo', - ToolsOzoneModerationGetReporterStats: - 'tools.ozone.moderation.getReporterStats', - ToolsOzoneModerationGetRepos: 'tools.ozone.moderation.getRepos', - ToolsOzoneModerationGetSubjects: 'tools.ozone.moderation.getSubjects', - ToolsOzoneModerationListScheduledActions: - 'tools.ozone.moderation.listScheduledActions', - ToolsOzoneModerationQueryEvents: 'tools.ozone.moderation.queryEvents', - ToolsOzoneModerationQueryStatuses: 'tools.ozone.moderation.queryStatuses', - ToolsOzoneModerationScheduleAction: 'tools.ozone.moderation.scheduleAction', - ToolsOzoneModerationSearchRepos: 'tools.ozone.moderation.searchRepos', - ToolsOzoneQueueAssignModerator: 'tools.ozone.queue.assignModerator', - ToolsOzoneQueueCreateQueue: 'tools.ozone.queue.createQueue', - ToolsOzoneQueueDefs: 'tools.ozone.queue.defs', - ToolsOzoneQueueDeleteQueue: 'tools.ozone.queue.deleteQueue', - ToolsOzoneQueueGetAssignments: 'tools.ozone.queue.getAssignments', - ToolsOzoneQueueListQueues: 'tools.ozone.queue.listQueues', - ToolsOzoneQueueRouteReports: 'tools.ozone.queue.routeReports', - ToolsOzoneQueueUnassignModerator: 'tools.ozone.queue.unassignModerator', - ToolsOzoneQueueUpdateQueue: 'tools.ozone.queue.updateQueue', - ToolsOzoneReportAssignModerator: 'tools.ozone.report.assignModerator', - ToolsOzoneReportCreateActivity: 'tools.ozone.report.createActivity', - ToolsOzoneReportDefs: 'tools.ozone.report.defs', - ToolsOzoneReportGetAssignments: 'tools.ozone.report.getAssignments', - ToolsOzoneReportGetHistoricalStats: 'tools.ozone.report.getHistoricalStats', - ToolsOzoneReportGetLatestReport: 'tools.ozone.report.getLatestReport', - ToolsOzoneReportGetLiveStats: 'tools.ozone.report.getLiveStats', - ToolsOzoneReportGetReport: 'tools.ozone.report.getReport', - ToolsOzoneReportListActivities: 'tools.ozone.report.listActivities', - ToolsOzoneReportQueryReports: 'tools.ozone.report.queryReports', - ToolsOzoneReportReassignQueue: 'tools.ozone.report.reassignQueue', - ToolsOzoneReportRefreshStats: 'tools.ozone.report.refreshStats', - ToolsOzoneReportUnassignModerator: 'tools.ozone.report.unassignModerator', - ToolsOzoneSafelinkAddRule: 'tools.ozone.safelink.addRule', - ToolsOzoneSafelinkDefs: 'tools.ozone.safelink.defs', - ToolsOzoneSafelinkQueryEvents: 'tools.ozone.safelink.queryEvents', - ToolsOzoneSafelinkQueryRules: 'tools.ozone.safelink.queryRules', - ToolsOzoneSafelinkRemoveRule: 'tools.ozone.safelink.removeRule', - ToolsOzoneSafelinkUpdateRule: 'tools.ozone.safelink.updateRule', - ToolsOzoneServerGetConfig: 'tools.ozone.server.getConfig', - ToolsOzoneSetAddValues: 'tools.ozone.set.addValues', - ToolsOzoneSetDefs: 'tools.ozone.set.defs', - ToolsOzoneSetDeleteSet: 'tools.ozone.set.deleteSet', - ToolsOzoneSetDeleteValues: 'tools.ozone.set.deleteValues', - ToolsOzoneSetGetValues: 'tools.ozone.set.getValues', - ToolsOzoneSetQuerySets: 'tools.ozone.set.querySets', - ToolsOzoneSetUpsertSet: 'tools.ozone.set.upsertSet', - ToolsOzoneSettingDefs: 'tools.ozone.setting.defs', - ToolsOzoneSettingListOptions: 'tools.ozone.setting.listOptions', - ToolsOzoneSettingRemoveOptions: 'tools.ozone.setting.removeOptions', - ToolsOzoneSettingUpsertOption: 'tools.ozone.setting.upsertOption', - ToolsOzoneSignatureDefs: 'tools.ozone.signature.defs', - ToolsOzoneSignatureFindCorrelation: 'tools.ozone.signature.findCorrelation', - ToolsOzoneSignatureFindRelatedAccounts: - 'tools.ozone.signature.findRelatedAccounts', - ToolsOzoneSignatureSearchAccounts: 'tools.ozone.signature.searchAccounts', - ToolsOzoneTeamAddMember: 'tools.ozone.team.addMember', - ToolsOzoneTeamDefs: 'tools.ozone.team.defs', - ToolsOzoneTeamDeleteMember: 'tools.ozone.team.deleteMember', - ToolsOzoneTeamListMembers: 'tools.ozone.team.listMembers', - ToolsOzoneTeamUpdateMember: 'tools.ozone.team.updateMember', - ToolsOzoneVerificationDefs: 'tools.ozone.verification.defs', - ToolsOzoneVerificationGrantVerifications: - 'tools.ozone.verification.grantVerifications', - ToolsOzoneVerificationListVerifications: - 'tools.ozone.verification.listVerifications', - ToolsOzoneVerificationRevokeVerifications: - 'tools.ozone.verification.revokeVerifications', -} as const diff --git a/packages/api/src/client/types/app/bsky/actor/defs.ts b/packages/api/src/client/types/app/bsky/actor/defs.ts deleted file mode 100644 index f8126db0b2e..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/defs.ts +++ /dev/null @@ -1,716 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as AppBskyGraphDefs from '../graph/defs.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' -import type * as AppBskyNotificationDefs from '../notification/defs.js' -import type * as AppBskyFeedThreadgate from '../feed/threadgate.js' -import type * as AppBskyFeedPostgate from '../feed/postgate.js' -import type * as AppBskyEmbedExternal from '../embed/external.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.defs' - -export interface ProfileViewBasic { - $type?: 'app.bsky.actor.defs#profileViewBasic' - did: string - handle: string - displayName?: string - pronouns?: string - avatar?: string - associated?: ProfileAssociated - viewer?: ViewerState - labels?: ComAtprotoLabelDefs.Label[] - createdAt?: string - verification?: VerificationState - status?: StatusView - /** Debug information for internal development */ - debug?: { [_ in string]: unknown } -} - -const hashProfileViewBasic = 'profileViewBasic' - -export function isProfileViewBasic(v: V) { - return is$typed(v, id, hashProfileViewBasic) -} - -export function validateProfileViewBasic(v: V) { - return validate(v, id, hashProfileViewBasic) -} - -export interface ProfileView { - $type?: 'app.bsky.actor.defs#profileView' - did: string - handle: string - displayName?: string - pronouns?: string - description?: string - avatar?: string - associated?: ProfileAssociated - indexedAt?: string - createdAt?: string - viewer?: ViewerState - labels?: ComAtprotoLabelDefs.Label[] - verification?: VerificationState - status?: StatusView - /** Debug information for internal development */ - debug?: { [_ in string]: unknown } -} - -const hashProfileView = 'profileView' - -export function isProfileView(v: V) { - return is$typed(v, id, hashProfileView) -} - -export function validateProfileView(v: V) { - return validate(v, id, hashProfileView) -} - -export interface ProfileViewDetailed { - $type?: 'app.bsky.actor.defs#profileViewDetailed' - did: string - handle: string - displayName?: string - description?: string - pronouns?: string - website?: string - avatar?: string - banner?: string - followersCount?: number - followsCount?: number - postsCount?: number - associated?: ProfileAssociated - joinedViaStarterPack?: AppBskyGraphDefs.StarterPackViewBasic - indexedAt?: string - createdAt?: string - viewer?: ViewerState - labels?: ComAtprotoLabelDefs.Label[] - pinnedPost?: ComAtprotoRepoStrongRef.Main - verification?: VerificationState - status?: StatusView - /** Debug information for internal development */ - debug?: { [_ in string]: unknown } -} - -const hashProfileViewDetailed = 'profileViewDetailed' - -export function isProfileViewDetailed(v: V) { - return is$typed(v, id, hashProfileViewDetailed) -} - -export function validateProfileViewDetailed(v: V) { - return validate(v, id, hashProfileViewDetailed) -} - -export interface ProfileAssociated { - $type?: 'app.bsky.actor.defs#profileAssociated' - lists?: number - feedgens?: number - starterPacks?: number - labeler?: boolean - chat?: ProfileAssociatedChat - activitySubscription?: ProfileAssociatedActivitySubscription - germ?: ProfileAssociatedGerm -} - -const hashProfileAssociated = 'profileAssociated' - -export function isProfileAssociated(v: V) { - return is$typed(v, id, hashProfileAssociated) -} - -export function validateProfileAssociated(v: V) { - return validate(v, id, hashProfileAssociated) -} - -export interface ProfileAssociatedChat { - $type?: 'app.bsky.actor.defs#profileAssociatedChat' - allowIncoming: 'all' | 'none' | 'following' | (string & {}) - allowGroupInvites?: 'all' | 'none' | 'following' | (string & {}) -} - -const hashProfileAssociatedChat = 'profileAssociatedChat' - -export function isProfileAssociatedChat(v: V) { - return is$typed(v, id, hashProfileAssociatedChat) -} - -export function validateProfileAssociatedChat(v: V) { - return validate(v, id, hashProfileAssociatedChat) -} - -export interface ProfileAssociatedGerm { - $type?: 'app.bsky.actor.defs#profileAssociatedGerm' - messageMeUrl: string - showButtonTo: 'usersIFollow' | 'everyone' | (string & {}) -} - -const hashProfileAssociatedGerm = 'profileAssociatedGerm' - -export function isProfileAssociatedGerm(v: V) { - return is$typed(v, id, hashProfileAssociatedGerm) -} - -export function validateProfileAssociatedGerm(v: V) { - return validate(v, id, hashProfileAssociatedGerm) -} - -export interface ProfileAssociatedActivitySubscription { - $type?: 'app.bsky.actor.defs#profileAssociatedActivitySubscription' - allowSubscriptions: 'followers' | 'mutuals' | 'none' | (string & {}) -} - -const hashProfileAssociatedActivitySubscription = - 'profileAssociatedActivitySubscription' - -export function isProfileAssociatedActivitySubscription(v: V) { - return is$typed(v, id, hashProfileAssociatedActivitySubscription) -} - -export function validateProfileAssociatedActivitySubscription(v: V) { - return validate( - v, - id, - hashProfileAssociatedActivitySubscription, - ) -} - -/** Metadata about the requesting account's relationship with the subject account. Only has meaningful content for authed requests. */ -export interface ViewerState { - $type?: 'app.bsky.actor.defs#viewerState' - muted?: boolean - mutedByList?: AppBskyGraphDefs.ListViewBasic - blockedBy?: boolean - blocking?: string - blockingByList?: AppBskyGraphDefs.ListViewBasic - following?: string - followedBy?: string - knownFollowers?: KnownFollowers - activitySubscription?: AppBskyNotificationDefs.ActivitySubscription -} - -const hashViewerState = 'viewerState' - -export function isViewerState(v: V) { - return is$typed(v, id, hashViewerState) -} - -export function validateViewerState(v: V) { - return validate(v, id, hashViewerState) -} - -/** The subject's followers whom you also follow */ -export interface KnownFollowers { - $type?: 'app.bsky.actor.defs#knownFollowers' - count: number - followers: ProfileViewBasic[] -} - -const hashKnownFollowers = 'knownFollowers' - -export function isKnownFollowers(v: V) { - return is$typed(v, id, hashKnownFollowers) -} - -export function validateKnownFollowers(v: V) { - return validate(v, id, hashKnownFollowers) -} - -/** Represents the verification information about the user this object is attached to. */ -export interface VerificationState { - $type?: 'app.bsky.actor.defs#verificationState' - /** All verifications issued by trusted verifiers on behalf of this user. Verifications by untrusted verifiers are not included. */ - verifications: VerificationView[] - /** The user's status as a verified account. */ - verifiedStatus: 'valid' | 'invalid' | 'none' | (string & {}) - /** The user's status as a trusted verifier. */ - trustedVerifierStatus: 'valid' | 'invalid' | 'none' | (string & {}) -} - -const hashVerificationState = 'verificationState' - -export function isVerificationState(v: V) { - return is$typed(v, id, hashVerificationState) -} - -export function validateVerificationState(v: V) { - return validate(v, id, hashVerificationState) -} - -/** An individual verification for an associated subject. */ -export interface VerificationView { - $type?: 'app.bsky.actor.defs#verificationView' - /** The user who issued this verification. */ - issuer: string - /** The AT-URI of the verification record. */ - uri: string - /** True if the verification passes validation, otherwise false. */ - isValid: boolean - /** Timestamp when the verification was created. */ - createdAt: string -} - -const hashVerificationView = 'verificationView' - -export function isVerificationView(v: V) { - return is$typed(v, id, hashVerificationView) -} - -export function validateVerificationView(v: V) { - return validate(v, id, hashVerificationView) -} - -export type Preferences = ( - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } -)[] - -export interface AdultContentPref { - $type?: 'app.bsky.actor.defs#adultContentPref' - enabled: boolean -} - -const hashAdultContentPref = 'adultContentPref' - -export function isAdultContentPref(v: V) { - return is$typed(v, id, hashAdultContentPref) -} - -export function validateAdultContentPref(v: V) { - return validate(v, id, hashAdultContentPref) -} - -export interface ContentLabelPref { - $type?: 'app.bsky.actor.defs#contentLabelPref' - /** Which labeler does this preference apply to? If undefined, applies globally. */ - labelerDid?: string - label: string - visibility: 'ignore' | 'show' | 'warn' | 'hide' | (string & {}) -} - -const hashContentLabelPref = 'contentLabelPref' - -export function isContentLabelPref(v: V) { - return is$typed(v, id, hashContentLabelPref) -} - -export function validateContentLabelPref(v: V) { - return validate(v, id, hashContentLabelPref) -} - -export interface SavedFeed { - $type?: 'app.bsky.actor.defs#savedFeed' - id: string - type: 'feed' | 'list' | 'timeline' | (string & {}) - value: string - pinned: boolean -} - -const hashSavedFeed = 'savedFeed' - -export function isSavedFeed(v: V) { - return is$typed(v, id, hashSavedFeed) -} - -export function validateSavedFeed(v: V) { - return validate(v, id, hashSavedFeed) -} - -export interface SavedFeedsPrefV2 { - $type?: 'app.bsky.actor.defs#savedFeedsPrefV2' - items: SavedFeed[] -} - -const hashSavedFeedsPrefV2 = 'savedFeedsPrefV2' - -export function isSavedFeedsPrefV2(v: V) { - return is$typed(v, id, hashSavedFeedsPrefV2) -} - -export function validateSavedFeedsPrefV2(v: V) { - return validate(v, id, hashSavedFeedsPrefV2) -} - -export interface SavedFeedsPref { - $type?: 'app.bsky.actor.defs#savedFeedsPref' - pinned: string[] - saved: string[] - timelineIndex?: number -} - -const hashSavedFeedsPref = 'savedFeedsPref' - -export function isSavedFeedsPref(v: V) { - return is$typed(v, id, hashSavedFeedsPref) -} - -export function validateSavedFeedsPref(v: V) { - return validate(v, id, hashSavedFeedsPref) -} - -export interface PersonalDetailsPref { - $type?: 'app.bsky.actor.defs#personalDetailsPref' - /** The birth date of account owner. */ - birthDate?: string -} - -const hashPersonalDetailsPref = 'personalDetailsPref' - -export function isPersonalDetailsPref(v: V) { - return is$typed(v, id, hashPersonalDetailsPref) -} - -export function validatePersonalDetailsPref(v: V) { - return validate(v, id, hashPersonalDetailsPref) -} - -/** Read-only preference containing value(s) inferred from the user's declared birthdate. Absence of this preference object in the response indicates that the user has not made a declaration. */ -export interface DeclaredAgePref { - $type?: 'app.bsky.actor.defs#declaredAgePref' - /** Indicates if the user has declared that they are over 13 years of age. */ - isOverAge13?: boolean - /** Indicates if the user has declared that they are over 16 years of age. */ - isOverAge16?: boolean - /** Indicates if the user has declared that they are over 18 years of age. */ - isOverAge18?: boolean -} - -const hashDeclaredAgePref = 'declaredAgePref' - -export function isDeclaredAgePref(v: V) { - return is$typed(v, id, hashDeclaredAgePref) -} - -export function validateDeclaredAgePref(v: V) { - return validate(v, id, hashDeclaredAgePref) -} - -export interface FeedViewPref { - $type?: 'app.bsky.actor.defs#feedViewPref' - /** The URI of the feed, or an identifier which describes the feed. */ - feed: string - /** Hide replies in the feed. */ - hideReplies?: boolean - /** Hide replies in the feed if they are not by followed users. */ - hideRepliesByUnfollowed: boolean - /** Hide replies in the feed if they do not have this number of likes. */ - hideRepliesByLikeCount?: number - /** Hide reposts in the feed. */ - hideReposts?: boolean - /** Hide quote posts in the feed. */ - hideQuotePosts?: boolean -} - -const hashFeedViewPref = 'feedViewPref' - -export function isFeedViewPref(v: V) { - return is$typed(v, id, hashFeedViewPref) -} - -export function validateFeedViewPref(v: V) { - return validate(v, id, hashFeedViewPref) -} - -export interface ThreadViewPref { - $type?: 'app.bsky.actor.defs#threadViewPref' - /** Sorting mode for threads. */ - sort?: - | 'oldest' - | 'newest' - | 'most-likes' - | 'random' - | 'hotness' - | (string & {}) -} - -const hashThreadViewPref = 'threadViewPref' - -export function isThreadViewPref(v: V) { - return is$typed(v, id, hashThreadViewPref) -} - -export function validateThreadViewPref(v: V) { - return validate(v, id, hashThreadViewPref) -} - -export interface InterestsPref { - $type?: 'app.bsky.actor.defs#interestsPref' - /** A list of tags which describe the account owner's interests gathered during onboarding. */ - tags: string[] -} - -const hashInterestsPref = 'interestsPref' - -export function isInterestsPref(v: V) { - return is$typed(v, id, hashInterestsPref) -} - -export function validateInterestsPref(v: V) { - return validate(v, id, hashInterestsPref) -} - -export type MutedWordTarget = 'content' | 'tag' | (string & {}) - -/** A word that the account owner has muted. */ -export interface MutedWord { - $type?: 'app.bsky.actor.defs#mutedWord' - id?: string - /** The muted word itself. */ - value: string - /** The intended targets of the muted word. */ - targets: MutedWordTarget[] - /** Groups of users to apply the muted word to. If undefined, applies to all users. */ - actorTarget: 'all' | 'exclude-following' | (string & {}) - /** The date and time at which the muted word will expire and no longer be applied. */ - expiresAt?: string -} - -const hashMutedWord = 'mutedWord' - -export function isMutedWord(v: V) { - return is$typed(v, id, hashMutedWord) -} - -export function validateMutedWord(v: V) { - return validate(v, id, hashMutedWord) -} - -export interface MutedWordsPref { - $type?: 'app.bsky.actor.defs#mutedWordsPref' - /** A list of words the account owner has muted. */ - items: MutedWord[] -} - -const hashMutedWordsPref = 'mutedWordsPref' - -export function isMutedWordsPref(v: V) { - return is$typed(v, id, hashMutedWordsPref) -} - -export function validateMutedWordsPref(v: V) { - return validate(v, id, hashMutedWordsPref) -} - -export interface HiddenPostsPref { - $type?: 'app.bsky.actor.defs#hiddenPostsPref' - /** A list of URIs of posts the account owner has hidden. */ - items: string[] -} - -const hashHiddenPostsPref = 'hiddenPostsPref' - -export function isHiddenPostsPref(v: V) { - return is$typed(v, id, hashHiddenPostsPref) -} - -export function validateHiddenPostsPref(v: V) { - return validate(v, id, hashHiddenPostsPref) -} - -export interface LabelersPref { - $type?: 'app.bsky.actor.defs#labelersPref' - labelers: LabelerPrefItem[] -} - -const hashLabelersPref = 'labelersPref' - -export function isLabelersPref(v: V) { - return is$typed(v, id, hashLabelersPref) -} - -export function validateLabelersPref(v: V) { - return validate(v, id, hashLabelersPref) -} - -export interface LabelerPrefItem { - $type?: 'app.bsky.actor.defs#labelerPrefItem' - did: string -} - -const hashLabelerPrefItem = 'labelerPrefItem' - -export function isLabelerPrefItem(v: V) { - return is$typed(v, id, hashLabelerPrefItem) -} - -export function validateLabelerPrefItem(v: V) { - return validate(v, id, hashLabelerPrefItem) -} - -/** A grab bag of state that's specific to the bsky.app program. Third-party apps shouldn't use this. */ -export interface BskyAppStatePref { - $type?: 'app.bsky.actor.defs#bskyAppStatePref' - activeProgressGuide?: BskyAppProgressGuide - /** An array of tokens which identify nudges (modals, popups, tours, highlight dots) that should be shown to the user. */ - queuedNudges?: string[] - /** Storage for NUXs the user has encountered. */ - nuxs?: Nux[] -} - -const hashBskyAppStatePref = 'bskyAppStatePref' - -export function isBskyAppStatePref(v: V) { - return is$typed(v, id, hashBskyAppStatePref) -} - -export function validateBskyAppStatePref(v: V) { - return validate(v, id, hashBskyAppStatePref) -} - -/** If set, an active progress guide. Once completed, can be set to undefined. Should have unspecced fields tracking progress. */ -export interface BskyAppProgressGuide { - $type?: 'app.bsky.actor.defs#bskyAppProgressGuide' - guide: string -} - -const hashBskyAppProgressGuide = 'bskyAppProgressGuide' - -export function isBskyAppProgressGuide(v: V) { - return is$typed(v, id, hashBskyAppProgressGuide) -} - -export function validateBskyAppProgressGuide(v: V) { - return validate(v, id, hashBskyAppProgressGuide) -} - -/** A new user experiences (NUX) storage object */ -export interface Nux { - $type?: 'app.bsky.actor.defs#nux' - id: string - completed: boolean - /** Arbitrary data for the NUX. The structure is defined by the NUX itself. Limited to 300 characters. */ - data?: string - /** The date and time at which the NUX will expire and should be considered completed. */ - expiresAt?: string -} - -const hashNux = 'nux' - -export function isNux(v: V) { - return is$typed(v, id, hashNux) -} - -export function validateNux(v: V) { - return validate(v, id, hashNux) -} - -/** Preferences for how verified accounts appear in the app. */ -export interface VerificationPrefs { - $type?: 'app.bsky.actor.defs#verificationPrefs' - /** Hide the blue check badges for verified accounts and trusted verifiers. */ - hideBadges: boolean -} - -const hashVerificationPrefs = 'verificationPrefs' - -export function isVerificationPrefs(v: V) { - return is$typed(v, id, hashVerificationPrefs) -} - -export function validateVerificationPrefs(v: V) { - return validate(v, id, hashVerificationPrefs) -} - -/** Preferences for live events. */ -export interface LiveEventPreferences { - $type?: 'app.bsky.actor.defs#liveEventPreferences' - /** A list of feed IDs that the user has hidden from live events. */ - hiddenFeedIds?: string[] - /** Whether to hide all feeds from live events. */ - hideAllFeeds: boolean -} - -const hashLiveEventPreferences = 'liveEventPreferences' - -export function isLiveEventPreferences(v: V) { - return is$typed(v, id, hashLiveEventPreferences) -} - -export function validateLiveEventPreferences(v: V) { - return validate(v, id, hashLiveEventPreferences) -} - -/** Default post interaction settings for the account. These values should be applied as default values when creating new posts. These refs should mirror the threadgate and postgate records exactly. */ -export interface PostInteractionSettingsPref { - $type?: 'app.bsky.actor.defs#postInteractionSettingsPref' - /** Matches threadgate record. List of rules defining who can reply to this users posts. If value is an empty array, no one can reply. If value is undefined, anyone can reply. */ - threadgateAllowRules?: ( - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] - /** Matches postgate record. List of rules defining who can embed this users posts. If value is an empty array or is undefined, no particular rules apply and anyone can embed. */ - postgateEmbeddingRules?: ( - | $Typed - | { $type: string } - )[] -} - -const hashPostInteractionSettingsPref = 'postInteractionSettingsPref' - -export function isPostInteractionSettingsPref(v: V) { - return is$typed(v, id, hashPostInteractionSettingsPref) -} - -export function validatePostInteractionSettingsPref(v: V) { - return validate( - v, - id, - hashPostInteractionSettingsPref, - ) -} - -export interface StatusView { - $type?: 'app.bsky.actor.defs#statusView' - uri?: string - cid?: string - /** The status for the account. */ - status: 'app.bsky.actor.status#live' | (string & {}) - record: { [_ in string]: unknown } - embed?: $Typed | { $type: string } - labels?: ComAtprotoLabelDefs.Label[] - /** The date when this status will expire. The application might choose to no longer return the status after expiration. */ - expiresAt?: string - /** True if the status is not expired, false if it is expired. Only present if expiration was set. */ - isActive?: boolean - /** True if the user's go-live access has been disabled by a moderator, false otherwise. */ - isDisabled?: boolean -} - -const hashStatusView = 'statusView' - -export function isStatusView(v: V) { - return is$typed(v, id, hashStatusView) -} - -export function validateStatusView(v: V) { - return validate(v, id, hashStatusView) -} diff --git a/packages/api/src/client/types/app/bsky/actor/getPreferences.ts b/packages/api/src/client/types/app/bsky/actor/getPreferences.ts deleted file mode 100644 index 9342002a179..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/getPreferences.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.getPreferences' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - preferences: AppBskyActorDefs.Preferences -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/getProfile.ts b/packages/api/src/client/types/app/bsky/actor/getProfile.ts deleted file mode 100644 index fd862cde8f1..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/getProfile.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.getProfile' - -export type QueryParams = { - /** Handle or DID of account to fetch profile of. */ - actor: string -} -export type InputSchema = undefined -export type OutputSchema = AppBskyActorDefs.ProfileViewDetailed - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/getProfiles.ts b/packages/api/src/client/types/app/bsky/actor/getProfiles.ts deleted file mode 100644 index fc5a1505be6..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/getProfiles.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.getProfiles' - -export type QueryParams = { - actors: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - profiles: AppBskyActorDefs.ProfileViewDetailed[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts b/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts deleted file mode 100644 index 8246c2e340f..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/getSuggestions.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.getSuggestions' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - actors: AppBskyActorDefs.ProfileView[] - /** DEPRECATED: use recIdStr instead. */ - recId?: number - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/profile.ts b/packages/api/src/client/types/app/bsky/actor/profile.ts deleted file mode 100644 index c1e1d1353d7..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/profile.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.profile' - -export interface Main { - $type: 'app.bsky.actor.profile' - displayName?: string - /** Free-form profile description text. */ - description?: string - /** Free-form pronouns text. */ - pronouns?: string - website?: string - /** Small image to be displayed next to posts from account. AKA, 'profile picture' */ - avatar?: BlobRef - /** Larger horizontal image to display behind profile view. */ - banner?: BlobRef - labels?: $Typed | { $type: string } - joinedViaStarterPack?: ComAtprotoRepoStrongRef.Main - pinnedPost?: ComAtprotoRepoStrongRef.Main - createdAt?: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate

(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/actor/putPreferences.ts b/packages/api/src/client/types/app/bsky/actor/putPreferences.ts deleted file mode 100644 index 75a32988495..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/putPreferences.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.putPreferences' - -export type QueryParams = {} - -export interface InputSchema { - preferences: AppBskyActorDefs.Preferences -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/searchActors.ts b/packages/api/src/client/types/app/bsky/actor/searchActors.ts deleted file mode 100644 index 9df611a2339..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/searchActors.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.searchActors' - -export type QueryParams = { - /** DEPRECATED: use 'q' instead. */ - term?: string - /** Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ - q?: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - actors: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts b/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts deleted file mode 100644 index 9c9ad7d1df5..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/searchActorsTypeahead.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.searchActorsTypeahead' - -export type QueryParams = { - /** DEPRECATED: use 'q' instead. */ - term?: string - /** Search query prefix; not a full query string. */ - q?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - actors: AppBskyActorDefs.ProfileViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/actor/status.ts b/packages/api/src/client/types/app/bsky/actor/status.ts deleted file mode 100644 index 70468ee6722..00000000000 --- a/packages/api/src/client/types/app/bsky/actor/status.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyEmbedExternal from '../embed/external.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.actor.status' - -export interface Main { - $type: 'app.bsky.actor.status' - /** The status for the account. */ - status: 'app.bsky.actor.status#live' | (string & {}) - embed?: $Typed | { $type: string } - /** The duration of the status in minutes. Applications can choose to impose minimum and maximum limits. */ - durationMinutes?: number - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} - -/** Advertises an account as currently offering live content. */ -export const LIVE = `${id}#live` diff --git a/packages/api/src/client/types/app/bsky/ageassurance/begin.ts b/packages/api/src/client/types/app/bsky/ageassurance/begin.ts deleted file mode 100644 index c56228319ed..00000000000 --- a/packages/api/src/client/types/app/bsky/ageassurance/begin.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyAgeassuranceDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.ageassurance.begin' - -export type QueryParams = {} - -export interface InputSchema { - /** The user's email address to receive Age Assurance instructions. */ - email: string - /** The user's preferred language for communication during the Age Assurance process. */ - language: string - /** An ISO 3166-1 alpha-2 code of the user's location. */ - countryCode: string - /** An optional ISO 3166-2 code of the user's region or state within the country. */ - regionCode?: string -} - -export type OutputSchema = AppBskyAgeassuranceDefs.State - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidEmailError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidTooLongError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidInitiationError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class RegionNotSupportedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidEmail') return new InvalidEmailError(e) - if (e.error === 'DidTooLong') return new DidTooLongError(e) - if (e.error === 'InvalidInitiation') return new InvalidInitiationError(e) - if (e.error === 'RegionNotSupported') return new RegionNotSupportedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/ageassurance/defs.ts b/packages/api/src/client/types/app/bsky/ageassurance/defs.ts deleted file mode 100644 index 83aa31a22e4..00000000000 --- a/packages/api/src/client/types/app/bsky/ageassurance/defs.ts +++ /dev/null @@ -1,303 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.ageassurance.defs' - -/** The access level granted based on Age Assurance data we've processed. */ -export type Access = 'unknown' | 'none' | 'safe' | 'full' | (string & {}) -/** The status of the Age Assurance process. */ -export type Status = - | 'unknown' - | 'pending' - | 'assured' - | 'blocked' - | (string & {}) - -/** The user's computed Age Assurance state. */ -export interface State { - $type?: 'app.bsky.ageassurance.defs#state' - /** The timestamp when this state was last updated. */ - lastInitiatedAt?: string - status: Status - access: Access -} - -const hashState = 'state' - -export function isState(v: V) { - return is$typed(v, id, hashState) -} - -export function validateState(v: V) { - return validate(v, id, hashState) -} - -/** Additional metadata needed to compute Age Assurance state client-side. */ -export interface StateMetadata { - $type?: 'app.bsky.ageassurance.defs#stateMetadata' - /** The account creation timestamp. */ - accountCreatedAt?: string -} - -const hashStateMetadata = 'stateMetadata' - -export function isStateMetadata(v: V) { - return is$typed(v, id, hashStateMetadata) -} - -export function validateStateMetadata(v: V) { - return validate(v, id, hashStateMetadata) -} - -export interface Config { - $type?: 'app.bsky.ageassurance.defs#config' - /** The per-region Age Assurance configuration. */ - regions: ConfigRegion[] -} - -const hashConfig = 'config' - -export function isConfig(v: V) { - return is$typed(v, id, hashConfig) -} - -export function validateConfig(v: V) { - return validate(v, id, hashConfig) -} - -/** The Age Assurance configuration for a specific region. */ -export interface ConfigRegion { - $type?: 'app.bsky.ageassurance.defs#configRegion' - /** The ISO 3166-1 alpha-2 country code this configuration applies to. */ - countryCode: string - /** The ISO 3166-2 region code this configuration applies to. If omitted, the configuration applies to the entire country. */ - regionCode?: string - /** The minimum age (as a whole integer) required to use Bluesky in this region. */ - minAccessAge: number - /** The ordered list of Age Assurance rules that apply to this region. Rules should be applied in order, and the first matching rule determines the access level granted. The rules array should always include a default rule as the last item. */ - rules: ( - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] -} - -const hashConfigRegion = 'configRegion' - -export function isConfigRegion(v: V) { - return is$typed(v, id, hashConfigRegion) -} - -export function validateConfigRegion(v: V) { - return validate(v, id, hashConfigRegion) -} - -/** Age Assurance rule that applies by default. */ -export interface ConfigRegionRuleDefault { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleDefault' - access: Access -} - -const hashConfigRegionRuleDefault = 'configRegionRuleDefault' - -export function isConfigRegionRuleDefault(v: V) { - return is$typed(v, id, hashConfigRegionRuleDefault) -} - -export function validateConfigRegionRuleDefault(v: V) { - return validate( - v, - id, - hashConfigRegionRuleDefault, - ) -} - -/** Age Assurance rule that applies if the user has declared themselves equal-to or over a certain age. */ -export interface ConfigRegionRuleIfDeclaredOverAge { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleIfDeclaredOverAge' - /** The age threshold as a whole integer. */ - age: number - access: Access -} - -const hashConfigRegionRuleIfDeclaredOverAge = - 'configRegionRuleIfDeclaredOverAge' - -export function isConfigRegionRuleIfDeclaredOverAge(v: V) { - return is$typed(v, id, hashConfigRegionRuleIfDeclaredOverAge) -} - -export function validateConfigRegionRuleIfDeclaredOverAge(v: V) { - return validate( - v, - id, - hashConfigRegionRuleIfDeclaredOverAge, - ) -} - -/** Age Assurance rule that applies if the user has declared themselves under a certain age. */ -export interface ConfigRegionRuleIfDeclaredUnderAge { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleIfDeclaredUnderAge' - /** The age threshold as a whole integer. */ - age: number - access: Access -} - -const hashConfigRegionRuleIfDeclaredUnderAge = - 'configRegionRuleIfDeclaredUnderAge' - -export function isConfigRegionRuleIfDeclaredUnderAge(v: V) { - return is$typed(v, id, hashConfigRegionRuleIfDeclaredUnderAge) -} - -export function validateConfigRegionRuleIfDeclaredUnderAge(v: V) { - return validate( - v, - id, - hashConfigRegionRuleIfDeclaredUnderAge, - ) -} - -/** Age Assurance rule that applies if the user has been assured to be equal-to or over a certain age. */ -export interface ConfigRegionRuleIfAssuredOverAge { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleIfAssuredOverAge' - /** The age threshold as a whole integer. */ - age: number - access: Access -} - -const hashConfigRegionRuleIfAssuredOverAge = 'configRegionRuleIfAssuredOverAge' - -export function isConfigRegionRuleIfAssuredOverAge(v: V) { - return is$typed(v, id, hashConfigRegionRuleIfAssuredOverAge) -} - -export function validateConfigRegionRuleIfAssuredOverAge(v: V) { - return validate( - v, - id, - hashConfigRegionRuleIfAssuredOverAge, - ) -} - -/** Age Assurance rule that applies if the user has been assured to be under a certain age. */ -export interface ConfigRegionRuleIfAssuredUnderAge { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleIfAssuredUnderAge' - /** The age threshold as a whole integer. */ - age: number - access: Access -} - -const hashConfigRegionRuleIfAssuredUnderAge = - 'configRegionRuleIfAssuredUnderAge' - -export function isConfigRegionRuleIfAssuredUnderAge(v: V) { - return is$typed(v, id, hashConfigRegionRuleIfAssuredUnderAge) -} - -export function validateConfigRegionRuleIfAssuredUnderAge(v: V) { - return validate( - v, - id, - hashConfigRegionRuleIfAssuredUnderAge, - ) -} - -/** Age Assurance rule that applies if the account is equal-to or newer than a certain date. */ -export interface ConfigRegionRuleIfAccountNewerThan { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleIfAccountNewerThan' - /** The date threshold as a datetime string. */ - date: string - access: Access -} - -const hashConfigRegionRuleIfAccountNewerThan = - 'configRegionRuleIfAccountNewerThan' - -export function isConfigRegionRuleIfAccountNewerThan(v: V) { - return is$typed(v, id, hashConfigRegionRuleIfAccountNewerThan) -} - -export function validateConfigRegionRuleIfAccountNewerThan(v: V) { - return validate( - v, - id, - hashConfigRegionRuleIfAccountNewerThan, - ) -} - -/** Age Assurance rule that applies if the account is older than a certain date. */ -export interface ConfigRegionRuleIfAccountOlderThan { - $type?: 'app.bsky.ageassurance.defs#configRegionRuleIfAccountOlderThan' - /** The date threshold as a datetime string. */ - date: string - access: Access -} - -const hashConfigRegionRuleIfAccountOlderThan = - 'configRegionRuleIfAccountOlderThan' - -export function isConfigRegionRuleIfAccountOlderThan(v: V) { - return is$typed(v, id, hashConfigRegionRuleIfAccountOlderThan) -} - -export function validateConfigRegionRuleIfAccountOlderThan(v: V) { - return validate( - v, - id, - hashConfigRegionRuleIfAccountOlderThan, - ) -} - -/** Object used to store Age Assurance data in stash. */ -export interface Event { - $type?: 'app.bsky.ageassurance.defs#event' - /** The date and time of this write operation. */ - createdAt: string - /** The unique identifier for this instance of the Age Assurance flow, in UUID format. */ - attemptId: string - /** The status of the Age Assurance process. */ - status: 'unknown' | 'pending' | 'assured' | 'blocked' | (string & {}) - /** The access level granted based on Age Assurance data we've processed. */ - access: 'unknown' | 'none' | 'safe' | 'full' | (string & {}) - /** The ISO 3166-1 alpha-2 country code provided when beginning the Age Assurance flow. */ - countryCode: string - /** The ISO 3166-2 region code provided when beginning the Age Assurance flow. */ - regionCode?: string - /** The email used for Age Assurance. */ - email?: string - /** The IP address used when initiating the Age Assurance flow. */ - initIp?: string - /** The user agent used when initiating the Age Assurance flow. */ - initUa?: string - /** The IP address used when completing the Age Assurance flow. */ - completeIp?: string - /** The user agent used when completing the Age Assurance flow. */ - completeUa?: string -} - -const hashEvent = 'event' - -export function isEvent(v: V) { - return is$typed(v, id, hashEvent) -} - -export function validateEvent(v: V) { - return validate(v, id, hashEvent) -} diff --git a/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts b/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts deleted file mode 100644 index 2181372250e..00000000000 --- a/packages/api/src/client/types/app/bsky/ageassurance/getConfig.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyAgeassuranceDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.ageassurance.getConfig' - -export type QueryParams = {} -export type InputSchema = undefined -export type OutputSchema = AppBskyAgeassuranceDefs.Config - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/ageassurance/getState.ts b/packages/api/src/client/types/app/bsky/ageassurance/getState.ts deleted file mode 100644 index 4bc5792ce8a..00000000000 --- a/packages/api/src/client/types/app/bsky/ageassurance/getState.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyAgeassuranceDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.ageassurance.getState' - -export type QueryParams = { - countryCode: string - regionCode?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - state: AppBskyAgeassuranceDefs.State - metadata: AppBskyAgeassuranceDefs.StateMetadata -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts b/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts deleted file mode 100644 index 794c41b0d41..00000000000 --- a/packages/api/src/client/types/app/bsky/bookmark/createBookmark.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.bookmark.createBookmark' - -export type QueryParams = {} - -export interface InputSchema { - uri: string - cid: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export class UnsupportedCollectionError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'UnsupportedCollection') - return new UnsupportedCollectionError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/bookmark/defs.ts b/packages/api/src/client/types/app/bsky/bookmark/defs.ts deleted file mode 100644 index 37df96d86d6..00000000000 --- a/packages/api/src/client/types/app/bsky/bookmark/defs.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.bookmark.defs' - -/** Object used to store bookmark data in stash. */ -export interface Bookmark { - $type?: 'app.bsky.bookmark.defs#bookmark' - subject: ComAtprotoRepoStrongRef.Main -} - -const hashBookmark = 'bookmark' - -export function isBookmark(v: V) { - return is$typed(v, id, hashBookmark) -} - -export function validateBookmark(v: V) { - return validate(v, id, hashBookmark) -} - -export interface BookmarkView { - $type?: 'app.bsky.bookmark.defs#bookmarkView' - subject: ComAtprotoRepoStrongRef.Main - createdAt?: string - item: - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashBookmarkView = 'bookmarkView' - -export function isBookmarkView(v: V) { - return is$typed(v, id, hashBookmarkView) -} - -export function validateBookmarkView(v: V) { - return validate(v, id, hashBookmarkView) -} diff --git a/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts b/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts deleted file mode 100644 index fd150411608..00000000000 --- a/packages/api/src/client/types/app/bsky/bookmark/deleteBookmark.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.bookmark.deleteBookmark' - -export type QueryParams = {} - -export interface InputSchema { - uri: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export class UnsupportedCollectionError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'UnsupportedCollection') - return new UnsupportedCollectionError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts b/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts deleted file mode 100644 index 354c424edfc..00000000000 --- a/packages/api/src/client/types/app/bsky/bookmark/getBookmarks.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyBookmarkDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.bookmark.getBookmarks' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - bookmarks: AppBskyBookmarkDefs.BookmarkView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/defs.ts b/packages/api/src/client/types/app/bsky/contact/defs.ts deleted file mode 100644 index 7c0ef6b5c5c..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/defs.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.defs' - -/** Associates a profile with the positional index of the contact import input in the call to `app.bsky.contact.importContacts`, so clients can know which phone caused a particular match. */ -export interface MatchAndContactIndex { - $type?: 'app.bsky.contact.defs#matchAndContactIndex' - match: AppBskyActorDefs.ProfileView - /** The index of this match in the import contact input. */ - contactIndex: number -} - -const hashMatchAndContactIndex = 'matchAndContactIndex' - -export function isMatchAndContactIndex(v: V) { - return is$typed(v, id, hashMatchAndContactIndex) -} - -export function validateMatchAndContactIndex(v: V) { - return validate(v, id, hashMatchAndContactIndex) -} - -export interface SyncStatus { - $type?: 'app.bsky.contact.defs#syncStatus' - /** Last date when contacts where imported. */ - syncedAt: string - /** Number of existing contact matches resulting of the user imports and of their imported contacts having imported the user. Matches stop being counted when the user either follows the matched contact or dismisses the match. */ - matchesCount: number -} - -const hashSyncStatus = 'syncStatus' - -export function isSyncStatus(v: V) { - return is$typed(v, id, hashSyncStatus) -} - -export function validateSyncStatus(v: V) { - return validate(v, id, hashSyncStatus) -} - -/** A stash object to be sent via bsync representing a notification to be created. */ -export interface Notification { - $type?: 'app.bsky.contact.defs#notification' - /** The DID of who this notification comes from. */ - from: string - /** The DID of who this notification should go to. */ - to: string -} - -const hashNotification = 'notification' - -export function isNotification(v: V) { - return is$typed(v, id, hashNotification) -} - -export function validateNotification(v: V) { - return validate(v, id, hashNotification) -} diff --git a/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts b/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts deleted file mode 100644 index e43cb13f2b7..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/dismissMatch.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.dismissMatch' - -export type QueryParams = {} - -export interface InputSchema { - /** The subject's DID to dismiss the match with. */ - subject: string -} - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/getMatches.ts b/packages/api/src/client/types/app/bsky/contact/getMatches.ts deleted file mode 100644 index d88f943b4af..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/getMatches.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.getMatches' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - matches: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidLimitError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidCursorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InvalidLimit') return new InvalidLimitError(e) - if (e.error === 'InvalidCursor') return new InvalidCursorError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts b/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts deleted file mode 100644 index 4a064aa8dcb..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/getSyncStatus.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyContactDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.getSyncStatus' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - syncStatus?: AppBskyContactDefs.SyncStatus -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/importContacts.ts b/packages/api/src/client/types/app/bsky/contact/importContacts.ts deleted file mode 100644 index f11f2074e50..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/importContacts.ts +++ /dev/null @@ -1,86 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyContactDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.importContacts' - -export type QueryParams = {} - -export interface InputSchema { - /** JWT to authenticate the call. Use the JWT received as a response to the call to `app.bsky.contact.verifyPhone`. */ - token: string - /** List of phone numbers in global E.164 format (e.g., '+12125550123'). Phone numbers that cannot be normalized into a valid phone number will be discarded. Should not repeat the 'phone' input used in `app.bsky.contact.verifyPhone`. */ - contacts: string[] -} - -export interface OutputSchema { - /** The users that matched during import and their indexes on the input contacts, so the client can correlate with its local list. */ - matchesAndContactIndexes: AppBskyContactDefs.MatchAndContactIndex[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidContactsError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class TooManyContactsError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidTokenError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InvalidContacts') return new InvalidContactsError(e) - if (e.error === 'TooManyContacts') return new TooManyContactsError(e) - if (e.error === 'InvalidToken') return new InvalidTokenError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/removeData.ts b/packages/api/src/client/types/app/bsky/contact/removeData.ts deleted file mode 100644 index 2a5c6162883..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/removeData.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.removeData' - -export type QueryParams = {} - -export interface InputSchema {} - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/sendNotification.ts b/packages/api/src/client/types/app/bsky/contact/sendNotification.ts deleted file mode 100644 index e0fbffd98e7..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/sendNotification.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.sendNotification' - -export type QueryParams = {} - -export interface InputSchema { - /** The DID of who this notification comes from. */ - from: string - /** The DID of who this notification should go to. */ - to: string -} - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts b/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts deleted file mode 100644 index ff8d530c158..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/startPhoneVerification.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.startPhoneVerification' - -export type QueryParams = {} - -export interface InputSchema { - /** The phone number to receive the code via SMS. */ - phone: string -} - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class RateLimitExceededError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidPhoneError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'RateLimitExceeded') return new RateLimitExceededError(e) - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InvalidPhone') return new InvalidPhoneError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts b/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts deleted file mode 100644 index b5b6d0ef785..00000000000 --- a/packages/api/src/client/types/app/bsky/contact/verifyPhone.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.contact.verifyPhone' - -export type QueryParams = {} - -export interface InputSchema { - /** The phone number to verify. Should be the same as the one passed to `app.bsky.contact.startPhoneVerification`. */ - phone: string - /** The code received via SMS as a result of the call to `app.bsky.contact.startPhoneVerification`. */ - code: string -} - -export interface OutputSchema { - /** JWT to be used in a call to `app.bsky.contact.importContacts`. It is only valid for a single call. */ - token: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class RateLimitExceededError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidDidError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidPhoneError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidCodeError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InternalError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'RateLimitExceeded') return new RateLimitExceededError(e) - if (e.error === 'InvalidDid') return new InvalidDidError(e) - if (e.error === 'InvalidPhone') return new InvalidPhoneError(e) - if (e.error === 'InvalidCode') return new InvalidCodeError(e) - if (e.error === 'InternalError') return new InternalError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/draft/createDraft.ts b/packages/api/src/client/types/app/bsky/draft/createDraft.ts deleted file mode 100644 index 05d4d6c4c92..00000000000 --- a/packages/api/src/client/types/app/bsky/draft/createDraft.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyDraftDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.draft.createDraft' - -export type QueryParams = {} - -export interface InputSchema { - draft: AppBskyDraftDefs.Draft -} - -export interface OutputSchema { - /** The ID of the created draft. */ - id: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class DraftLimitReachedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'DraftLimitReached') return new DraftLimitReachedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/draft/defs.ts b/packages/api/src/client/types/app/bsky/draft/defs.ts deleted file mode 100644 index 63601154d69..00000000000 --- a/packages/api/src/client/types/app/bsky/draft/defs.ts +++ /dev/null @@ -1,212 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedPostgate from '../feed/postgate.js' -import type * as AppBskyFeedThreadgate from '../feed/threadgate.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.draft.defs' - -/** A draft with an identifier, used to store drafts in private storage (stash). */ -export interface DraftWithId { - $type?: 'app.bsky.draft.defs#draftWithId' - /** A TID to be used as a draft identifier. */ - id: string - draft: Draft -} - -const hashDraftWithId = 'draftWithId' - -export function isDraftWithId(v: V) { - return is$typed(v, id, hashDraftWithId) -} - -export function validateDraftWithId(v: V) { - return validate(v, id, hashDraftWithId) -} - -/** A draft containing an array of draft posts. */ -export interface Draft { - $type?: 'app.bsky.draft.defs#draft' - /** UUIDv4 identifier of the device that created this draft. */ - deviceId?: string - /** The device and/or platform on which the draft was created. */ - deviceName?: string - /** Array of draft posts that compose this draft. */ - posts: DraftPost[] - /** Indicates human language of posts primary text content. */ - langs?: string[] - /** Embedding rules for the postgates to be created when this draft is published. */ - postgateEmbeddingRules?: ( - | $Typed - | { $type: string } - )[] - /** Allow-rules for the threadgate to be created when this draft is published. */ - threadgateAllow?: ( - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] -} - -const hashDraft = 'draft' - -export function isDraft(v: V) { - return is$typed(v, id, hashDraft) -} - -export function validateDraft(v: V) { - return validate(v, id, hashDraft) -} - -/** One of the posts that compose a draft. */ -export interface DraftPost { - $type?: 'app.bsky.draft.defs#draftPost' - /** The primary post content. It has a higher limit than post contents to allow storing a larger text that can later be refined into smaller posts. */ - text: string - labels?: $Typed | { $type: string } - embedImages?: DraftEmbedImage[] - embedVideos?: DraftEmbedVideo[] - embedExternals?: DraftEmbedExternal[] - embedRecords?: DraftEmbedRecord[] -} - -const hashDraftPost = 'draftPost' - -export function isDraftPost(v: V) { - return is$typed(v, id, hashDraftPost) -} - -export function validateDraftPost(v: V) { - return validate(v, id, hashDraftPost) -} - -/** View to present drafts data to users. */ -export interface DraftView { - $type?: 'app.bsky.draft.defs#draftView' - /** A TID to be used as a draft identifier. */ - id: string - draft: Draft - /** The time the draft was created. */ - createdAt: string - /** The time the draft was last updated. */ - updatedAt: string -} - -const hashDraftView = 'draftView' - -export function isDraftView(v: V) { - return is$typed(v, id, hashDraftView) -} - -export function validateDraftView(v: V) { - return validate(v, id, hashDraftView) -} - -export interface DraftEmbedLocalRef { - $type?: 'app.bsky.draft.defs#draftEmbedLocalRef' - /** Local, on-device ref to file to be embedded. Embeds are currently device-bound for drafts. */ - path: string -} - -const hashDraftEmbedLocalRef = 'draftEmbedLocalRef' - -export function isDraftEmbedLocalRef(v: V) { - return is$typed(v, id, hashDraftEmbedLocalRef) -} - -export function validateDraftEmbedLocalRef(v: V) { - return validate(v, id, hashDraftEmbedLocalRef) -} - -export interface DraftEmbedCaption { - $type?: 'app.bsky.draft.defs#draftEmbedCaption' - lang: string - content: string -} - -const hashDraftEmbedCaption = 'draftEmbedCaption' - -export function isDraftEmbedCaption(v: V) { - return is$typed(v, id, hashDraftEmbedCaption) -} - -export function validateDraftEmbedCaption(v: V) { - return validate(v, id, hashDraftEmbedCaption) -} - -export interface DraftEmbedImage { - $type?: 'app.bsky.draft.defs#draftEmbedImage' - localRef: DraftEmbedLocalRef - alt?: string -} - -const hashDraftEmbedImage = 'draftEmbedImage' - -export function isDraftEmbedImage(v: V) { - return is$typed(v, id, hashDraftEmbedImage) -} - -export function validateDraftEmbedImage(v: V) { - return validate(v, id, hashDraftEmbedImage) -} - -export interface DraftEmbedVideo { - $type?: 'app.bsky.draft.defs#draftEmbedVideo' - localRef: DraftEmbedLocalRef - alt?: string - captions?: DraftEmbedCaption[] -} - -const hashDraftEmbedVideo = 'draftEmbedVideo' - -export function isDraftEmbedVideo(v: V) { - return is$typed(v, id, hashDraftEmbedVideo) -} - -export function validateDraftEmbedVideo(v: V) { - return validate(v, id, hashDraftEmbedVideo) -} - -export interface DraftEmbedExternal { - $type?: 'app.bsky.draft.defs#draftEmbedExternal' - uri: string -} - -const hashDraftEmbedExternal = 'draftEmbedExternal' - -export function isDraftEmbedExternal(v: V) { - return is$typed(v, id, hashDraftEmbedExternal) -} - -export function validateDraftEmbedExternal(v: V) { - return validate(v, id, hashDraftEmbedExternal) -} - -export interface DraftEmbedRecord { - $type?: 'app.bsky.draft.defs#draftEmbedRecord' - record: ComAtprotoRepoStrongRef.Main -} - -const hashDraftEmbedRecord = 'draftEmbedRecord' - -export function isDraftEmbedRecord(v: V) { - return is$typed(v, id, hashDraftEmbedRecord) -} - -export function validateDraftEmbedRecord(v: V) { - return validate(v, id, hashDraftEmbedRecord) -} diff --git a/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts b/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts deleted file mode 100644 index 5539a259250..00000000000 --- a/packages/api/src/client/types/app/bsky/draft/deleteDraft.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.draft.deleteDraft' - -export type QueryParams = {} - -export interface InputSchema { - id: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/draft/getDrafts.ts b/packages/api/src/client/types/app/bsky/draft/getDrafts.ts deleted file mode 100644 index 8418aa3bfbd..00000000000 --- a/packages/api/src/client/types/app/bsky/draft/getDrafts.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyDraftDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.draft.getDrafts' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - drafts: AppBskyDraftDefs.DraftView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/draft/updateDraft.ts b/packages/api/src/client/types/app/bsky/draft/updateDraft.ts deleted file mode 100644 index 07fcca574b1..00000000000 --- a/packages/api/src/client/types/app/bsky/draft/updateDraft.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyDraftDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.draft.updateDraft' - -export type QueryParams = {} - -export interface InputSchema { - draft: AppBskyDraftDefs.DraftWithId -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/embed/defs.ts b/packages/api/src/client/types/app/bsky/embed/defs.ts deleted file mode 100644 index ce60f5c9cb6..00000000000 --- a/packages/api/src/client/types/app/bsky/embed/defs.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.embed.defs' - -/** width:height represents an aspect ratio. It may be approximate, and may not correspond to absolute dimensions in any given unit. */ -export interface AspectRatio { - $type?: 'app.bsky.embed.defs#aspectRatio' - width: number - height: number -} - -const hashAspectRatio = 'aspectRatio' - -export function isAspectRatio(v: V) { - return is$typed(v, id, hashAspectRatio) -} - -export function validateAspectRatio(v: V) { - return validate(v, id, hashAspectRatio) -} diff --git a/packages/api/src/client/types/app/bsky/embed/external.ts b/packages/api/src/client/types/app/bsky/embed/external.ts deleted file mode 100644 index b757ecd7b79..00000000000 --- a/packages/api/src/client/types/app/bsky/embed/external.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.embed.external' - -/** A representation of some externally linked content (eg, a URL and 'card'), embedded in a Bluesky record (eg, a post). */ -export interface Main { - $type?: 'app.bsky.embed.external' - external: External -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain) -} - -export interface External { - $type?: 'app.bsky.embed.external#external' - uri: string - title: string - description: string - thumb?: BlobRef - /** The URI of the Atmosphere record representing this external content, if it exists. Example: a site.standard.document record. */ - associatedRecords?: ComAtprotoRepoStrongRef.Main[] -} - -const hashExternal = 'external' - -export function isExternal(v: V) { - return is$typed(v, id, hashExternal) -} - -export function validateExternal(v: V) { - return validate(v, id, hashExternal) -} - -export interface View { - $type?: 'app.bsky.embed.external#view' - external: ViewExternal -} - -const hashView = 'view' - -export function isView(v: V) { - return is$typed(v, id, hashView) -} - -export function validateView(v: V) { - return validate(v, id, hashView) -} - -export interface ViewExternal { - $type?: 'app.bsky.embed.external#viewExternal' - uri: string - title: string - description: string - thumb?: string -} - -const hashViewExternal = 'viewExternal' - -export function isViewExternal(v: V) { - return is$typed(v, id, hashViewExternal) -} - -export function validateViewExternal(v: V) { - return validate(v, id, hashViewExternal) -} diff --git a/packages/api/src/client/types/app/bsky/embed/images.ts b/packages/api/src/client/types/app/bsky/embed/images.ts deleted file mode 100644 index 64dfb1ef064..00000000000 --- a/packages/api/src/client/types/app/bsky/embed/images.ts +++ /dev/null @@ -1,86 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyEmbedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.embed.images' - -export interface Main { - $type?: 'app.bsky.embed.images' - images: Image[] -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain) -} - -export interface Image { - $type?: 'app.bsky.embed.images#image' - /** The raw image file. May be up to 2 MB, formerly limited to 1 MB. */ - image: BlobRef - /** Alt text description of the image, for accessibility. */ - alt: string - aspectRatio?: AppBskyEmbedDefs.AspectRatio -} - -const hashImage = 'image' - -export function isImage(v: V) { - return is$typed(v, id, hashImage) -} - -export function validateImage(v: V) { - return validate(v, id, hashImage) -} - -export interface View { - $type?: 'app.bsky.embed.images#view' - images: ViewImage[] -} - -const hashView = 'view' - -export function isView(v: V) { - return is$typed(v, id, hashView) -} - -export function validateView(v: V) { - return validate(v, id, hashView) -} - -export interface ViewImage { - $type?: 'app.bsky.embed.images#viewImage' - /** Fully-qualified URL where a thumbnail of the image can be fetched. For example, CDN location provided by the App View. */ - thumb: string - /** Fully-qualified URL where a large version of the image can be fetched. May or may not be the exact original blob. For example, CDN location provided by the App View. */ - fullsize: string - /** Alt text description of the image, for accessibility. */ - alt: string - aspectRatio?: AppBskyEmbedDefs.AspectRatio -} - -const hashViewImage = 'viewImage' - -export function isViewImage(v: V) { - return is$typed(v, id, hashViewImage) -} - -export function validateViewImage(v: V) { - return validate(v, id, hashViewImage) -} diff --git a/packages/api/src/client/types/app/bsky/embed/record.ts b/packages/api/src/client/types/app/bsky/embed/record.ts deleted file mode 100644 index e3be3bbd33d..00000000000 --- a/packages/api/src/client/types/app/bsky/embed/record.ts +++ /dev/null @@ -1,146 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' -import type * as AppBskyGraphDefs from '../graph/defs.js' -import type * as AppBskyLabelerDefs from '../labeler/defs.js' -import type * as AppBskyActorDefs from '../actor/defs.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as AppBskyEmbedImages from './images.js' -import type * as AppBskyEmbedVideo from './video.js' -import type * as AppBskyEmbedExternal from './external.js' -import type * as AppBskyEmbedRecordWithMedia from './recordWithMedia.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.embed.record' - -export interface Main { - $type?: 'app.bsky.embed.record' - record: ComAtprotoRepoStrongRef.Main -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain) -} - -export interface View { - $type?: 'app.bsky.embed.record#view' - record: - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashView = 'view' - -export function isView(v: V) { - return is$typed(v, id, hashView) -} - -export function validateView(v: V) { - return validate(v, id, hashView) -} - -export interface ViewRecord { - $type?: 'app.bsky.embed.record#viewRecord' - uri: string - cid: string - author: AppBskyActorDefs.ProfileViewBasic - /** The record data itself. */ - value: { [_ in string]: unknown } - labels?: ComAtprotoLabelDefs.Label[] - replyCount?: number - repostCount?: number - likeCount?: number - quoteCount?: number - embeds?: ( - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] - indexedAt: string -} - -const hashViewRecord = 'viewRecord' - -export function isViewRecord(v: V) { - return is$typed(v, id, hashViewRecord) -} - -export function validateViewRecord(v: V) { - return validate(v, id, hashViewRecord) -} - -export interface ViewNotFound { - $type?: 'app.bsky.embed.record#viewNotFound' - uri: string - notFound: true -} - -const hashViewNotFound = 'viewNotFound' - -export function isViewNotFound(v: V) { - return is$typed(v, id, hashViewNotFound) -} - -export function validateViewNotFound(v: V) { - return validate(v, id, hashViewNotFound) -} - -export interface ViewBlocked { - $type?: 'app.bsky.embed.record#viewBlocked' - uri: string - blocked: true - author: AppBskyFeedDefs.BlockedAuthor -} - -const hashViewBlocked = 'viewBlocked' - -export function isViewBlocked(v: V) { - return is$typed(v, id, hashViewBlocked) -} - -export function validateViewBlocked(v: V) { - return validate(v, id, hashViewBlocked) -} - -export interface ViewDetached { - $type?: 'app.bsky.embed.record#viewDetached' - uri: string - detached: true -} - -const hashViewDetached = 'viewDetached' - -export function isViewDetached(v: V) { - return is$typed(v, id, hashViewDetached) -} - -export function validateViewDetached(v: V) { - return validate(v, id, hashViewDetached) -} diff --git a/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts b/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts deleted file mode 100644 index c422dbfa3d3..00000000000 --- a/packages/api/src/client/types/app/bsky/embed/recordWithMedia.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyEmbedRecord from './record.js' -import type * as AppBskyEmbedImages from './images.js' -import type * as AppBskyEmbedVideo from './video.js' -import type * as AppBskyEmbedExternal from './external.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.embed.recordWithMedia' - -export interface Main { - $type?: 'app.bsky.embed.recordWithMedia' - record: AppBskyEmbedRecord.Main - media: - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain) -} - -export interface View { - $type?: 'app.bsky.embed.recordWithMedia#view' - record: AppBskyEmbedRecord.View - media: - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashView = 'view' - -export function isView(v: V) { - return is$typed(v, id, hashView) -} - -export function validateView(v: V) { - return validate(v, id, hashView) -} diff --git a/packages/api/src/client/types/app/bsky/embed/video.ts b/packages/api/src/client/types/app/bsky/embed/video.ts deleted file mode 100644 index 4e5eb1e6a27..00000000000 --- a/packages/api/src/client/types/app/bsky/embed/video.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyEmbedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.embed.video' - -export interface Main { - $type?: 'app.bsky.embed.video' - /** The mp4 video file. May be up to 100mb, formerly limited to 50mb. */ - video: BlobRef - captions?: Caption[] - /** Alt text description of the video, for accessibility. */ - alt?: string - aspectRatio?: AppBskyEmbedDefs.AspectRatio - /** A hint to the client about how to present the video. */ - presentation?: 'default' | 'gif' | (string & {}) -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain) -} - -export interface Caption { - $type?: 'app.bsky.embed.video#caption' - lang: string - file: BlobRef -} - -const hashCaption = 'caption' - -export function isCaption(v: V) { - return is$typed(v, id, hashCaption) -} - -export function validateCaption(v: V) { - return validate(v, id, hashCaption) -} - -export interface View { - $type?: 'app.bsky.embed.video#view' - cid: string - playlist: string - thumbnail?: string - alt?: string - aspectRatio?: AppBskyEmbedDefs.AspectRatio - /** A hint to the client about how to present the video. */ - presentation?: 'default' | 'gif' | (string & {}) -} - -const hashView = 'view' - -export function isView(v: V) { - return is$typed(v, id, hashView) -} - -export function validateView(v: V) { - return validate(v, id, hashView) -} diff --git a/packages/api/src/client/types/app/bsky/feed/defs.ts b/packages/api/src/client/types/app/bsky/feed/defs.ts deleted file mode 100644 index ed7bdef7078..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/defs.ts +++ /dev/null @@ -1,428 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' -import type * as AppBskyEmbedImages from '../embed/images.js' -import type * as AppBskyEmbedVideo from '../embed/video.js' -import type * as AppBskyEmbedExternal from '../embed/external.js' -import type * as AppBskyEmbedRecord from '../embed/record.js' -import type * as AppBskyEmbedRecordWithMedia from '../embed/recordWithMedia.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as AppBskyRichtextFacet from '../richtext/facet.js' -import type * as AppBskyGraphDefs from '../graph/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.defs' - -export interface PostView { - $type?: 'app.bsky.feed.defs#postView' - uri: string - cid: string - author: AppBskyActorDefs.ProfileViewBasic - record: { [_ in string]: unknown } - embed?: - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - bookmarkCount?: number - replyCount?: number - repostCount?: number - likeCount?: number - quoteCount?: number - indexedAt: string - viewer?: ViewerState - labels?: ComAtprotoLabelDefs.Label[] - threadgate?: ThreadgateView - /** Debug information for internal development */ - debug?: { [_ in string]: unknown } -} - -const hashPostView = 'postView' - -export function isPostView(v: V) { - return is$typed(v, id, hashPostView) -} - -export function validatePostView(v: V) { - return validate(v, id, hashPostView) -} - -/** Metadata about the requesting account's relationship with the subject content. Only has meaningful content for authed requests. */ -export interface ViewerState { - $type?: 'app.bsky.feed.defs#viewerState' - repost?: string - like?: string - bookmarked?: boolean - threadMuted?: boolean - replyDisabled?: boolean - embeddingDisabled?: boolean - pinned?: boolean -} - -const hashViewerState = 'viewerState' - -export function isViewerState(v: V) { - return is$typed(v, id, hashViewerState) -} - -export function validateViewerState(v: V) { - return validate(v, id, hashViewerState) -} - -/** Metadata about this post within the context of the thread it is in. */ -export interface ThreadContext { - $type?: 'app.bsky.feed.defs#threadContext' - rootAuthorLike?: string -} - -const hashThreadContext = 'threadContext' - -export function isThreadContext(v: V) { - return is$typed(v, id, hashThreadContext) -} - -export function validateThreadContext(v: V) { - return validate(v, id, hashThreadContext) -} - -export interface FeedViewPost { - $type?: 'app.bsky.feed.defs#feedViewPost' - post: PostView - reply?: ReplyRef - reason?: $Typed | $Typed | { $type: string } - /** Context provided by feed generator that may be passed back alongside interactions. */ - feedContext?: string - /** Unique identifier per request that may be passed back alongside interactions. */ - reqId?: string -} - -const hashFeedViewPost = 'feedViewPost' - -export function isFeedViewPost(v: V) { - return is$typed(v, id, hashFeedViewPost) -} - -export function validateFeedViewPost(v: V) { - return validate(v, id, hashFeedViewPost) -} - -export interface ReplyRef { - $type?: 'app.bsky.feed.defs#replyRef' - root: - | $Typed - | $Typed - | $Typed - | { $type: string } - parent: - | $Typed - | $Typed - | $Typed - | { $type: string } - grandparentAuthor?: AppBskyActorDefs.ProfileViewBasic -} - -const hashReplyRef = 'replyRef' - -export function isReplyRef(v: V) { - return is$typed(v, id, hashReplyRef) -} - -export function validateReplyRef(v: V) { - return validate(v, id, hashReplyRef) -} - -export interface ReasonRepost { - $type?: 'app.bsky.feed.defs#reasonRepost' - by: AppBskyActorDefs.ProfileViewBasic - uri?: string - cid?: string - indexedAt: string -} - -const hashReasonRepost = 'reasonRepost' - -export function isReasonRepost(v: V) { - return is$typed(v, id, hashReasonRepost) -} - -export function validateReasonRepost(v: V) { - return validate(v, id, hashReasonRepost) -} - -export interface ReasonPin { - $type?: 'app.bsky.feed.defs#reasonPin' -} - -const hashReasonPin = 'reasonPin' - -export function isReasonPin(v: V) { - return is$typed(v, id, hashReasonPin) -} - -export function validateReasonPin(v: V) { - return validate(v, id, hashReasonPin) -} - -export interface ThreadViewPost { - $type?: 'app.bsky.feed.defs#threadViewPost' - post: PostView - parent?: - | $Typed - | $Typed - | $Typed - | { $type: string } - replies?: ( - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] - threadContext?: ThreadContext -} - -const hashThreadViewPost = 'threadViewPost' - -export function isThreadViewPost(v: V) { - return is$typed(v, id, hashThreadViewPost) -} - -export function validateThreadViewPost(v: V) { - return validate(v, id, hashThreadViewPost) -} - -export interface NotFoundPost { - $type?: 'app.bsky.feed.defs#notFoundPost' - uri: string - notFound: true -} - -const hashNotFoundPost = 'notFoundPost' - -export function isNotFoundPost(v: V) { - return is$typed(v, id, hashNotFoundPost) -} - -export function validateNotFoundPost(v: V) { - return validate(v, id, hashNotFoundPost) -} - -export interface BlockedPost { - $type?: 'app.bsky.feed.defs#blockedPost' - uri: string - blocked: true - author: BlockedAuthor -} - -const hashBlockedPost = 'blockedPost' - -export function isBlockedPost(v: V) { - return is$typed(v, id, hashBlockedPost) -} - -export function validateBlockedPost(v: V) { - return validate(v, id, hashBlockedPost) -} - -export interface BlockedAuthor { - $type?: 'app.bsky.feed.defs#blockedAuthor' - did: string - viewer?: AppBskyActorDefs.ViewerState -} - -const hashBlockedAuthor = 'blockedAuthor' - -export function isBlockedAuthor(v: V) { - return is$typed(v, id, hashBlockedAuthor) -} - -export function validateBlockedAuthor(v: V) { - return validate(v, id, hashBlockedAuthor) -} - -export interface GeneratorView { - $type?: 'app.bsky.feed.defs#generatorView' - uri: string - cid: string - did: string - creator: AppBskyActorDefs.ProfileView - displayName: string - description?: string - descriptionFacets?: AppBskyRichtextFacet.Main[] - avatar?: string - likeCount?: number - acceptsInteractions?: boolean - labels?: ComAtprotoLabelDefs.Label[] - viewer?: GeneratorViewerState - contentMode?: - | 'app.bsky.feed.defs#contentModeUnspecified' - | 'app.bsky.feed.defs#contentModeVideo' - | (string & {}) - indexedAt: string -} - -const hashGeneratorView = 'generatorView' - -export function isGeneratorView(v: V) { - return is$typed(v, id, hashGeneratorView) -} - -export function validateGeneratorView(v: V) { - return validate(v, id, hashGeneratorView) -} - -export interface GeneratorViewerState { - $type?: 'app.bsky.feed.defs#generatorViewerState' - like?: string -} - -const hashGeneratorViewerState = 'generatorViewerState' - -export function isGeneratorViewerState(v: V) { - return is$typed(v, id, hashGeneratorViewerState) -} - -export function validateGeneratorViewerState(v: V) { - return validate(v, id, hashGeneratorViewerState) -} - -export interface SkeletonFeedPost { - $type?: 'app.bsky.feed.defs#skeletonFeedPost' - post: string - reason?: - | $Typed - | $Typed - | { $type: string } - /** Context that will be passed through to client and may be passed to feed generator back alongside interactions. */ - feedContext?: string -} - -const hashSkeletonFeedPost = 'skeletonFeedPost' - -export function isSkeletonFeedPost(v: V) { - return is$typed(v, id, hashSkeletonFeedPost) -} - -export function validateSkeletonFeedPost(v: V) { - return validate(v, id, hashSkeletonFeedPost) -} - -export interface SkeletonReasonRepost { - $type?: 'app.bsky.feed.defs#skeletonReasonRepost' - repost: string -} - -const hashSkeletonReasonRepost = 'skeletonReasonRepost' - -export function isSkeletonReasonRepost(v: V) { - return is$typed(v, id, hashSkeletonReasonRepost) -} - -export function validateSkeletonReasonRepost(v: V) { - return validate(v, id, hashSkeletonReasonRepost) -} - -export interface SkeletonReasonPin { - $type?: 'app.bsky.feed.defs#skeletonReasonPin' -} - -const hashSkeletonReasonPin = 'skeletonReasonPin' - -export function isSkeletonReasonPin(v: V) { - return is$typed(v, id, hashSkeletonReasonPin) -} - -export function validateSkeletonReasonPin(v: V) { - return validate(v, id, hashSkeletonReasonPin) -} - -export interface ThreadgateView { - $type?: 'app.bsky.feed.defs#threadgateView' - uri?: string - cid?: string - record?: { [_ in string]: unknown } - lists?: AppBskyGraphDefs.ListViewBasic[] -} - -const hashThreadgateView = 'threadgateView' - -export function isThreadgateView(v: V) { - return is$typed(v, id, hashThreadgateView) -} - -export function validateThreadgateView(v: V) { - return validate(v, id, hashThreadgateView) -} - -export interface Interaction { - $type?: 'app.bsky.feed.defs#interaction' - item?: string - event?: - | 'app.bsky.feed.defs#requestLess' - | 'app.bsky.feed.defs#requestMore' - | 'app.bsky.feed.defs#clickthroughItem' - | 'app.bsky.feed.defs#clickthroughAuthor' - | 'app.bsky.feed.defs#clickthroughReposter' - | 'app.bsky.feed.defs#clickthroughEmbed' - | 'app.bsky.feed.defs#interactionSeen' - | 'app.bsky.feed.defs#interactionLike' - | 'app.bsky.feed.defs#interactionRepost' - | 'app.bsky.feed.defs#interactionReply' - | 'app.bsky.feed.defs#interactionQuote' - | 'app.bsky.feed.defs#interactionShare' - | (string & {}) - /** Context on a feed item that was originally supplied by the feed generator on getFeedSkeleton. */ - feedContext?: string - /** Unique identifier per request that may be passed back alongside interactions. */ - reqId?: string -} - -const hashInteraction = 'interaction' - -export function isInteraction(v: V) { - return is$typed(v, id, hashInteraction) -} - -export function validateInteraction(v: V) { - return validate(v, id, hashInteraction) -} - -/** Request that less content like the given feed item be shown in the feed */ -export const REQUESTLESS = `${id}#requestLess` -/** Request that more content like the given feed item be shown in the feed */ -export const REQUESTMORE = `${id}#requestMore` -/** User clicked through to the feed item */ -export const CLICKTHROUGHITEM = `${id}#clickthroughItem` -/** User clicked through to the author of the feed item */ -export const CLICKTHROUGHAUTHOR = `${id}#clickthroughAuthor` -/** User clicked through to the reposter of the feed item */ -export const CLICKTHROUGHREPOSTER = `${id}#clickthroughReposter` -/** User clicked through to the embedded content of the feed item */ -export const CLICKTHROUGHEMBED = `${id}#clickthroughEmbed` -/** Declares the feed generator returns any types of posts. */ -export const CONTENTMODEUNSPECIFIED = `${id}#contentModeUnspecified` -/** Declares the feed generator returns posts containing app.bsky.embed.video embeds. */ -export const CONTENTMODEVIDEO = `${id}#contentModeVideo` -/** Feed item was seen by user */ -export const INTERACTIONSEEN = `${id}#interactionSeen` -/** User liked the feed item */ -export const INTERACTIONLIKE = `${id}#interactionLike` -/** User reposted the feed item */ -export const INTERACTIONREPOST = `${id}#interactionRepost` -/** User replied to the feed item */ -export const INTERACTIONREPLY = `${id}#interactionReply` -/** User quoted the feed item */ -export const INTERACTIONQUOTE = `${id}#interactionQuote` -/** User shared the feed item */ -export const INTERACTIONSHARE = `${id}#interactionShare` diff --git a/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts b/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts deleted file mode 100644 index 76c13d974ce..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/describeFeedGenerator.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.describeFeedGenerator' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - did: string - feeds: Feed[] - links?: Links -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface Feed { - $type?: 'app.bsky.feed.describeFeedGenerator#feed' - uri: string -} - -const hashFeed = 'feed' - -export function isFeed(v: V) { - return is$typed(v, id, hashFeed) -} - -export function validateFeed(v: V) { - return validate(v, id, hashFeed) -} - -export interface Links { - $type?: 'app.bsky.feed.describeFeedGenerator#links' - privacyPolicy?: string - termsOfService?: string -} - -const hashLinks = 'links' - -export function isLinks(v: V) { - return is$typed(v, id, hashLinks) -} - -export function validateLinks(v: V) { - return validate(v, id, hashLinks) -} diff --git a/packages/api/src/client/types/app/bsky/feed/generator.ts b/packages/api/src/client/types/app/bsky/feed/generator.ts deleted file mode 100644 index 6665819ff65..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/generator.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyRichtextFacet from '../richtext/facet.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.generator' - -export interface Main { - $type: 'app.bsky.feed.generator' - did: string - displayName: string - description?: string - descriptionFacets?: AppBskyRichtextFacet.Main[] - avatar?: BlobRef - /** Declaration that a feed accepts feedback interactions from a client through app.bsky.feed.sendInteractions */ - acceptsInteractions?: boolean - labels?: $Typed | { $type: string } - contentMode?: - | 'app.bsky.feed.defs#contentModeUnspecified' - | 'app.bsky.feed.defs#contentModeVideo' - | (string & {}) - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts b/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts deleted file mode 100644 index 8f8070d3484..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getActorFeeds.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getActorFeeds' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feeds: AppBskyFeedDefs.GeneratorView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts b/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts deleted file mode 100644 index d3d36b69bd3..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getActorLikes.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getActorLikes' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feed: AppBskyFeedDefs.FeedViewPost[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class BlockedActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class BlockedByActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'BlockedByActor') return new BlockedByActorError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts b/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts deleted file mode 100644 index 71b3e3278f1..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getAuthorFeed.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getAuthorFeed' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string - /** Combinations of post/repost types to include in response. */ - filter?: - | 'posts_with_replies' - | 'posts_no_replies' - | 'posts_with_media' - | 'posts_and_author_threads' - | 'posts_with_video' - | (string & {}) - includePins?: boolean -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feed: AppBskyFeedDefs.FeedViewPost[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class BlockedActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class BlockedByActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'BlockedByActor') return new BlockedByActorError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getFeed.ts b/packages/api/src/client/types/app/bsky/feed/getFeed.ts deleted file mode 100644 index 7b246fabf6e..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getFeed.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getFeed' - -export type QueryParams = { - feed: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feed: AppBskyFeedDefs.FeedViewPost[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class UnknownFeedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'UnknownFeed') return new UnknownFeedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts b/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts deleted file mode 100644 index 2ebc2723643..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getFeedGenerator.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getFeedGenerator' - -export type QueryParams = { - /** AT-URI of the feed generator record. */ - feed: string -} -export type InputSchema = undefined - -export interface OutputSchema { - view: AppBskyFeedDefs.GeneratorView - /** Indicates whether the feed generator service has been online recently, or else seems to be inactive. */ - isOnline: boolean - /** Indicates whether the feed generator service is compatible with the record declaration. */ - isValid: boolean -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts b/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts deleted file mode 100644 index dbcd173e839..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getFeedGenerators.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getFeedGenerators' - -export type QueryParams = { - feeds: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - feeds: AppBskyFeedDefs.GeneratorView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts b/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts deleted file mode 100644 index 99d4f9c7a17..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getFeedSkeleton.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getFeedSkeleton' - -export type QueryParams = { - /** Reference to feed generator record describing the specific feed being requested. */ - feed: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feed: AppBskyFeedDefs.SkeletonFeedPost[] - /** Unique identifier per request that may be passed back alongside interactions. */ - reqId?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class UnknownFeedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'UnknownFeed') return new UnknownFeedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getLikes.ts b/packages/api/src/client/types/app/bsky/feed/getLikes.ts deleted file mode 100644 index 7ed854bc469..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getLikes.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getLikes' - -export type QueryParams = { - /** AT-URI of the subject (eg, a post record). */ - uri: string - /** CID of the subject record (aka, specific version of record), to filter likes. */ - cid?: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - uri: string - cid?: string - cursor?: string - likes: Like[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface Like { - $type?: 'app.bsky.feed.getLikes#like' - indexedAt: string - createdAt: string - actor: AppBskyActorDefs.ProfileView -} - -const hashLike = 'like' - -export function isLike(v: V) { - return is$typed(v, id, hashLike) -} - -export function validateLike(v: V) { - return validate(v, id, hashLike) -} diff --git a/packages/api/src/client/types/app/bsky/feed/getListFeed.ts b/packages/api/src/client/types/app/bsky/feed/getListFeed.ts deleted file mode 100644 index 02003bd228b..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getListFeed.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getListFeed' - -export type QueryParams = { - /** Reference (AT-URI) to the list record. */ - list: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feed: AppBskyFeedDefs.FeedViewPost[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class UnknownListError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'UnknownList') return new UnknownListError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getPostThread.ts b/packages/api/src/client/types/app/bsky/feed/getPostThread.ts deleted file mode 100644 index 52ccdda9fd1..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getPostThread.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getPostThread' - -export type QueryParams = { - /** Reference (AT-URI) to post record. */ - uri: string - /** How many levels of reply depth should be included in response. */ - depth?: number - /** How many levels of parent (and grandparent, etc) post to include. */ - parentHeight?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - thread: - | $Typed - | $Typed - | $Typed - | { $type: string } - threadgate?: AppBskyFeedDefs.ThreadgateView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class NotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'NotFound') return new NotFoundError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getPosts.ts b/packages/api/src/client/types/app/bsky/feed/getPosts.ts deleted file mode 100644 index c0efda870fe..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getPosts.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getPosts' - -export type QueryParams = { - /** List of post AT-URIs to return hydrated views for. */ - uris: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - posts: AppBskyFeedDefs.PostView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getQuotes.ts b/packages/api/src/client/types/app/bsky/feed/getQuotes.ts deleted file mode 100644 index c5e16a5167e..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getQuotes.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getQuotes' - -export type QueryParams = { - /** Reference (AT-URI) of post record */ - uri: string - /** If supplied, filters to quotes of specific version (by CID) of the post record. */ - cid?: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - uri: string - cid?: string - cursor?: string - posts: AppBskyFeedDefs.PostView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts b/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts deleted file mode 100644 index 38b900c9391..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getRepostedBy.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getRepostedBy' - -export type QueryParams = { - /** Reference (AT-URI) of post record */ - uri: string - /** If supplied, filters to reposts of specific version (by CID) of the post record. */ - cid?: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - uri: string - cid?: string - cursor?: string - repostedBy: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts b/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts deleted file mode 100644 index e0b2bc9d4f5..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getSuggestedFeeds.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getSuggestedFeeds' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feeds: AppBskyFeedDefs.GeneratorView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/getTimeline.ts b/packages/api/src/client/types/app/bsky/feed/getTimeline.ts deleted file mode 100644 index 95188f84fbe..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/getTimeline.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.getTimeline' - -export type QueryParams = { - /** Variant 'algorithm' for timeline. Implementation-specific. NOTE: most feed flexibility has been moved to feed generator mechanism. */ - algorithm?: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feed: AppBskyFeedDefs.FeedViewPost[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/like.ts b/packages/api/src/client/types/app/bsky/feed/like.ts deleted file mode 100644 index c1828114464..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/like.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.like' - -export interface Main { - $type: 'app.bsky.feed.like' - subject: ComAtprotoRepoStrongRef.Main - createdAt: string - via?: ComAtprotoRepoStrongRef.Main - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/feed/post.ts b/packages/api/src/client/types/app/bsky/feed/post.ts deleted file mode 100644 index 86824d08d2a..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/post.ts +++ /dev/null @@ -1,117 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyRichtextFacet from '../richtext/facet.js' -import type * as AppBskyEmbedImages from '../embed/images.js' -import type * as AppBskyEmbedVideo from '../embed/video.js' -import type * as AppBskyEmbedExternal from '../embed/external.js' -import type * as AppBskyEmbedRecord from '../embed/record.js' -import type * as AppBskyEmbedRecordWithMedia from '../embed/recordWithMedia.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.post' - -export interface Main { - $type: 'app.bsky.feed.post' - /** The primary post content. May be an empty string, if there are embeds. */ - text: string - /** DEPRECATED: replaced by app.bsky.richtext.facet. */ - entities?: Entity[] - /** Annotations of text (mentions, URLs, hashtags, etc) */ - facets?: AppBskyRichtextFacet.Main[] - reply?: ReplyRef - embed?: - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - /** Indicates human language of post primary text content. */ - langs?: string[] - labels?: $Typed | { $type: string } - /** Additional hashtags, in addition to any included in post text and facets. */ - tags?: string[] - /** Client-declared timestamp when this post was originally created. */ - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} - -export interface ReplyRef { - $type?: 'app.bsky.feed.post#replyRef' - root: ComAtprotoRepoStrongRef.Main - parent: ComAtprotoRepoStrongRef.Main -} - -const hashReplyRef = 'replyRef' - -export function isReplyRef(v: V) { - return is$typed(v, id, hashReplyRef) -} - -export function validateReplyRef(v: V) { - return validate(v, id, hashReplyRef) -} - -/** Deprecated: use facets instead. */ -export interface Entity { - $type?: 'app.bsky.feed.post#entity' - index: TextSlice - /** Expected values are 'mention' and 'link'. */ - type: string - value: string -} - -const hashEntity = 'entity' - -export function isEntity(v: V) { - return is$typed(v, id, hashEntity) -} - -export function validateEntity(v: V) { - return validate(v, id, hashEntity) -} - -/** Deprecated. Use app.bsky.richtext instead -- A text segment. Start is inclusive, end is exclusive. Indices are for utf16-encoded strings. */ -export interface TextSlice { - $type?: 'app.bsky.feed.post#textSlice' - start: number - end: number -} - -const hashTextSlice = 'textSlice' - -export function isTextSlice(v: V) { - return is$typed(v, id, hashTextSlice) -} - -export function validateTextSlice(v: V) { - return validate(v, id, hashTextSlice) -} diff --git a/packages/api/src/client/types/app/bsky/feed/postgate.ts b/packages/api/src/client/types/app/bsky/feed/postgate.ts deleted file mode 100644 index c5cb2a262a6..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/postgate.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.postgate' - -export interface Main { - $type: 'app.bsky.feed.postgate' - createdAt: string - /** Reference (AT-URI) to the post record. */ - post: string - /** List of AT-URIs embedding this post that the author has detached from. */ - detachedEmbeddingUris?: string[] - /** List of rules defining who can embed this post. If value is an empty array or is undefined, no particular rules apply and anyone can embed. */ - embeddingRules?: ($Typed | { $type: string })[] - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} - -/** Disables embedding of this post. */ -export interface DisableRule { - $type?: 'app.bsky.feed.postgate#disableRule' -} - -const hashDisableRule = 'disableRule' - -export function isDisableRule(v: V) { - return is$typed(v, id, hashDisableRule) -} - -export function validateDisableRule(v: V) { - return validate(v, id, hashDisableRule) -} diff --git a/packages/api/src/client/types/app/bsky/feed/repost.ts b/packages/api/src/client/types/app/bsky/feed/repost.ts deleted file mode 100644 index 5d2eacc85b7..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/repost.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.repost' - -export interface Main { - $type: 'app.bsky.feed.repost' - subject: ComAtprotoRepoStrongRef.Main - createdAt: string - via?: ComAtprotoRepoStrongRef.Main - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/feed/searchPosts.ts b/packages/api/src/client/types/app/bsky/feed/searchPosts.ts deleted file mode 100644 index 54ea4ac4303..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/searchPosts.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.searchPosts' - -export type QueryParams = { - /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ - q: string - /** Specifies the ranking order of results. */ - sort?: 'top' | 'latest' | (string & {}) - /** Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD). */ - since?: string - /** Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD). */ - until?: string - /** Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions. */ - mentions?: string - /** Filter to posts by the given account. Handles are resolved to DID before query-time. */ - author?: string - /** Filter to posts in the given language. Expected to be based on post language field, though server may override language detection. */ - lang?: string - /** Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization. */ - domain?: string - /** Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching. */ - url?: string - /** Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching. */ - tag?: string[] - limit?: number - /** Optional pagination mechanism; may not necessarily allow scrolling through entire result set. */ - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ - hitsTotal?: number - posts: AppBskyFeedDefs.PostView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class BadQueryStringError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'BadQueryString') return new BadQueryStringError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts b/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts deleted file mode 100644 index f83ae4ff094..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/sendInteractions.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.sendInteractions' - -export type QueryParams = {} - -export interface InputSchema { - feed?: string - interactions: AppBskyFeedDefs.Interaction[] -} - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/feed/threadgate.ts b/packages/api/src/client/types/app/bsky/feed/threadgate.ts deleted file mode 100644 index dffbef78961..00000000000 --- a/packages/api/src/client/types/app/bsky/feed/threadgate.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.feed.threadgate' - -export interface Main { - $type: 'app.bsky.feed.threadgate' - /** Reference (AT-URI) to the post record. */ - post: string - /** List of rules defining who can reply to this post. If value is an empty array, no one can reply. If value is undefined, anyone can reply. */ - allow?: ( - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] - createdAt: string - /** List of hidden reply URIs. */ - hiddenReplies?: string[] - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} - -/** Allow replies from actors mentioned in your post. */ -export interface MentionRule { - $type?: 'app.bsky.feed.threadgate#mentionRule' -} - -const hashMentionRule = 'mentionRule' - -export function isMentionRule(v: V) { - return is$typed(v, id, hashMentionRule) -} - -export function validateMentionRule(v: V) { - return validate(v, id, hashMentionRule) -} - -/** Allow replies from actors who follow you. */ -export interface FollowerRule { - $type?: 'app.bsky.feed.threadgate#followerRule' -} - -const hashFollowerRule = 'followerRule' - -export function isFollowerRule(v: V) { - return is$typed(v, id, hashFollowerRule) -} - -export function validateFollowerRule(v: V) { - return validate(v, id, hashFollowerRule) -} - -/** Allow replies from actors you follow. */ -export interface FollowingRule { - $type?: 'app.bsky.feed.threadgate#followingRule' -} - -const hashFollowingRule = 'followingRule' - -export function isFollowingRule(v: V) { - return is$typed(v, id, hashFollowingRule) -} - -export function validateFollowingRule(v: V) { - return validate(v, id, hashFollowingRule) -} - -/** Allow replies from actors on a list. */ -export interface ListRule { - $type?: 'app.bsky.feed.threadgate#listRule' - list: string -} - -const hashListRule = 'listRule' - -export function isListRule(v: V) { - return is$typed(v, id, hashListRule) -} - -export function validateListRule(v: V) { - return validate(v, id, hashListRule) -} diff --git a/packages/api/src/client/types/app/bsky/graph/block.ts b/packages/api/src/client/types/app/bsky/graph/block.ts deleted file mode 100644 index b122acfde9d..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/block.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.block' - -export interface Main { - $type: 'app.bsky.graph.block' - /** DID of the account to be blocked. */ - subject: string - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/graph/defs.ts b/packages/api/src/client/types/app/bsky/graph/defs.ts deleted file mode 100644 index 53391588313..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/defs.ts +++ /dev/null @@ -1,206 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as AppBskyActorDefs from '../actor/defs.js' -import type * as AppBskyRichtextFacet from '../richtext/facet.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.defs' - -export interface ListViewBasic { - $type?: 'app.bsky.graph.defs#listViewBasic' - uri: string - cid: string - name: string - purpose: ListPurpose - avatar?: string - listItemCount?: number - labels?: ComAtprotoLabelDefs.Label[] - viewer?: ListViewerState - indexedAt?: string -} - -const hashListViewBasic = 'listViewBasic' - -export function isListViewBasic(v: V) { - return is$typed(v, id, hashListViewBasic) -} - -export function validateListViewBasic(v: V) { - return validate(v, id, hashListViewBasic) -} - -export interface ListView { - $type?: 'app.bsky.graph.defs#listView' - uri: string - cid: string - creator: AppBskyActorDefs.ProfileView - name: string - purpose: ListPurpose - description?: string - descriptionFacets?: AppBskyRichtextFacet.Main[] - avatar?: string - listItemCount?: number - labels?: ComAtprotoLabelDefs.Label[] - viewer?: ListViewerState - indexedAt: string -} - -const hashListView = 'listView' - -export function isListView(v: V) { - return is$typed(v, id, hashListView) -} - -export function validateListView(v: V) { - return validate(v, id, hashListView) -} - -export interface ListItemView { - $type?: 'app.bsky.graph.defs#listItemView' - uri: string - subject: AppBskyActorDefs.ProfileView -} - -const hashListItemView = 'listItemView' - -export function isListItemView(v: V) { - return is$typed(v, id, hashListItemView) -} - -export function validateListItemView(v: V) { - return validate(v, id, hashListItemView) -} - -export interface StarterPackView { - $type?: 'app.bsky.graph.defs#starterPackView' - uri: string - cid: string - record: { [_ in string]: unknown } - creator: AppBskyActorDefs.ProfileViewBasic - list?: ListViewBasic - listItemsSample?: ListItemView[] - feeds?: AppBskyFeedDefs.GeneratorView[] - joinedWeekCount?: number - joinedAllTimeCount?: number - labels?: ComAtprotoLabelDefs.Label[] - indexedAt: string -} - -const hashStarterPackView = 'starterPackView' - -export function isStarterPackView(v: V) { - return is$typed(v, id, hashStarterPackView) -} - -export function validateStarterPackView(v: V) { - return validate(v, id, hashStarterPackView) -} - -export interface StarterPackViewBasic { - $type?: 'app.bsky.graph.defs#starterPackViewBasic' - uri: string - cid: string - record: { [_ in string]: unknown } - creator: AppBskyActorDefs.ProfileViewBasic - listItemCount?: number - joinedWeekCount?: number - joinedAllTimeCount?: number - labels?: ComAtprotoLabelDefs.Label[] - indexedAt: string -} - -const hashStarterPackViewBasic = 'starterPackViewBasic' - -export function isStarterPackViewBasic(v: V) { - return is$typed(v, id, hashStarterPackViewBasic) -} - -export function validateStarterPackViewBasic(v: V) { - return validate(v, id, hashStarterPackViewBasic) -} - -export type ListPurpose = - | 'app.bsky.graph.defs#modlist' - | 'app.bsky.graph.defs#curatelist' - | 'app.bsky.graph.defs#referencelist' - | (string & {}) - -/** A list of actors to apply an aggregate moderation action (mute/block) on. */ -export const MODLIST = `${id}#modlist` -/** A list of actors used for curation purposes such as list feeds or interaction gating. */ -export const CURATELIST = `${id}#curatelist` -/** A list of actors used for only for reference purposes such as within a starter pack. */ -export const REFERENCELIST = `${id}#referencelist` - -export interface ListViewerState { - $type?: 'app.bsky.graph.defs#listViewerState' - muted?: boolean - blocked?: string -} - -const hashListViewerState = 'listViewerState' - -export function isListViewerState(v: V) { - return is$typed(v, id, hashListViewerState) -} - -export function validateListViewerState(v: V) { - return validate(v, id, hashListViewerState) -} - -/** indicates that a handle or DID could not be resolved */ -export interface NotFoundActor { - $type?: 'app.bsky.graph.defs#notFoundActor' - actor: string - notFound: true -} - -const hashNotFoundActor = 'notFoundActor' - -export function isNotFoundActor(v: V) { - return is$typed(v, id, hashNotFoundActor) -} - -export function validateNotFoundActor(v: V) { - return validate(v, id, hashNotFoundActor) -} - -/** lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object) */ -export interface Relationship { - $type?: 'app.bsky.graph.defs#relationship' - did: string - /** if the actor follows this DID, this is the AT-URI of the follow record */ - following?: string - /** if the actor is followed by this DID, contains the AT-URI of the follow record */ - followedBy?: string - /** if the actor blocks this DID, this is the AT-URI of the block record */ - blocking?: string - /** if the actor is blocked by this DID, contains the AT-URI of the block record */ - blockedBy?: string - /** if the actor blocks this DID via a block list, this is the AT-URI of the listblock record */ - blockingByList?: string - /** if the actor is blocked by this DID via a block list, contains the AT-URI of the listblock record */ - blockedByList?: string -} - -const hashRelationship = 'relationship' - -export function isRelationship(v: V) { - return is$typed(v, id, hashRelationship) -} - -export function validateRelationship(v: V) { - return validate(v, id, hashRelationship) -} diff --git a/packages/api/src/client/types/app/bsky/graph/follow.ts b/packages/api/src/client/types/app/bsky/graph/follow.ts deleted file mode 100644 index fccf753c310..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/follow.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoRepoStrongRef from '../../../com/atproto/repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.follow' - -export interface Main { - $type: 'app.bsky.graph.follow' - subject: string - createdAt: string - via?: ComAtprotoRepoStrongRef.Main - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts deleted file mode 100644 index 23941f7d09a..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getActorStarterPacks.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getActorStarterPacks' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - starterPacks: AppBskyGraphDefs.StarterPackViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getBlocks.ts b/packages/api/src/client/types/app/bsky/graph/getBlocks.ts deleted file mode 100644 index cd01a9ae646..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getBlocks.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getBlocks' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - blocks: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getFollowers.ts b/packages/api/src/client/types/app/bsky/graph/getFollowers.ts deleted file mode 100644 index a88c9a6a0bf..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getFollowers.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getFollowers' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - subject: AppBskyActorDefs.ProfileView - cursor?: string - followers: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getFollows.ts b/packages/api/src/client/types/app/bsky/graph/getFollows.ts deleted file mode 100644 index 839b24fa88b..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getFollows.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getFollows' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - subject: AppBskyActorDefs.ProfileView - cursor?: string - follows: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts b/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts deleted file mode 100644 index b39a72a5054..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getKnownFollowers.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getKnownFollowers' - -export type QueryParams = { - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - subject: AppBskyActorDefs.ProfileView - cursor?: string - followers: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getList.ts b/packages/api/src/client/types/app/bsky/graph/getList.ts deleted file mode 100644 index 38c2346c320..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getList.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getList' - -export type QueryParams = { - /** Reference (AT-URI) of the list record to hydrate. */ - list: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - list: AppBskyGraphDefs.ListView - items: AppBskyGraphDefs.ListItemView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts b/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts deleted file mode 100644 index 0044705f5a3..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getListBlocks.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getListBlocks' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - lists: AppBskyGraphDefs.ListView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getListMutes.ts b/packages/api/src/client/types/app/bsky/graph/getListMutes.ts deleted file mode 100644 index 99dca005b87..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getListMutes.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getListMutes' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - lists: AppBskyGraphDefs.ListView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getLists.ts b/packages/api/src/client/types/app/bsky/graph/getLists.ts deleted file mode 100644 index 8020a745d0d..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getLists.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getLists' - -export type QueryParams = { - /** The account (actor) to enumerate lists from. */ - actor: string - limit?: number - cursor?: string - /** Optional filter by list purpose. If not specified, all supported types are returned. */ - purposes?: 'modlist' | 'curatelist' | (string & {})[] -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - lists: AppBskyGraphDefs.ListView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts b/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts deleted file mode 100644 index 855b1964333..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getListsWithMembership.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getListsWithMembership' - -export type QueryParams = { - /** The account (actor) to check for membership. */ - actor: string - limit?: number - cursor?: string - /** Optional filter by list purpose. If not specified, all supported types are returned. */ - purposes?: 'modlist' | 'curatelist' | (string & {})[] -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - listsWithMembership: ListWithMembership[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -/** A list and an optional list item indicating membership of a target user to that list. */ -export interface ListWithMembership { - $type?: 'app.bsky.graph.getListsWithMembership#listWithMembership' - list: AppBskyGraphDefs.ListView - listItem?: AppBskyGraphDefs.ListItemView -} - -const hashListWithMembership = 'listWithMembership' - -export function isListWithMembership(v: V) { - return is$typed(v, id, hashListWithMembership) -} - -export function validateListWithMembership(v: V) { - return validate(v, id, hashListWithMembership) -} diff --git a/packages/api/src/client/types/app/bsky/graph/getMutes.ts b/packages/api/src/client/types/app/bsky/graph/getMutes.ts deleted file mode 100644 index e5a3efe36fe..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getMutes.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getMutes' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - mutes: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getRelationships.ts b/packages/api/src/client/types/app/bsky/graph/getRelationships.ts deleted file mode 100644 index 0bced3161db..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getRelationships.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getRelationships' - -export type QueryParams = { - /** Primary account requesting relationships for. */ - actor: string - /** List of 'other' accounts to be related back to the primary. */ - others?: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - actor?: string - relationships: ( - | $Typed - | $Typed - | { $type: string } - )[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class ActorNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'ActorNotFound') return new ActorNotFoundError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts deleted file mode 100644 index 2642b12f15d..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPack.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getStarterPack' - -export type QueryParams = { - /** Reference (AT-URI) of the starter pack record. */ - starterPack: string -} -export type InputSchema = undefined - -export interface OutputSchema { - starterPack: AppBskyGraphDefs.StarterPackView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts deleted file mode 100644 index 3ae48f3fb63..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPacks.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getStarterPacks' - -export type QueryParams = { - uris: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - starterPacks: AppBskyGraphDefs.StarterPackViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts b/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts deleted file mode 100644 index 34fa0513e75..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getStarterPacksWithMembership.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getStarterPacksWithMembership' - -export type QueryParams = { - /** The account (actor) to check for membership. */ - actor: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - starterPacksWithMembership: StarterPackWithMembership[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -/** A starter pack and an optional list item indicating membership of a target user to that starter pack. */ -export interface StarterPackWithMembership { - $type?: 'app.bsky.graph.getStarterPacksWithMembership#starterPackWithMembership' - starterPack: AppBskyGraphDefs.StarterPackView - listItem?: AppBskyGraphDefs.ListItemView -} - -const hashStarterPackWithMembership = 'starterPackWithMembership' - -export function isStarterPackWithMembership(v: V) { - return is$typed(v, id, hashStarterPackWithMembership) -} - -export function validateStarterPackWithMembership(v: V) { - return validate( - v, - id, - hashStarterPackWithMembership, - ) -} diff --git a/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts b/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts deleted file mode 100644 index 360f0cdf3c1..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/getSuggestedFollowsByActor.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.getSuggestedFollowsByActor' - -export type QueryParams = { - actor: string -} -export type InputSchema = undefined - -export interface OutputSchema { - suggestions: AppBskyActorDefs.ProfileView[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string - /** DEPRECATED, unused. Previously: if true, response has fallen-back to generic results, and is not scoped using relativeToDid */ - isFallback: boolean - /** DEPRECATED: use recIdStr instead. */ - recId?: number -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/list.ts b/packages/api/src/client/types/app/bsky/graph/list.ts deleted file mode 100644 index a3128fab25c..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/list.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' -import type * as AppBskyRichtextFacet from '../richtext/facet.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.list' - -export interface Main { - $type: 'app.bsky.graph.list' - purpose: AppBskyGraphDefs.ListPurpose - /** Display name for list; can not be empty. */ - name: string - description?: string - descriptionFacets?: AppBskyRichtextFacet.Main[] - avatar?: BlobRef - labels?: $Typed | { $type: string } - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/graph/listblock.ts b/packages/api/src/client/types/app/bsky/graph/listblock.ts deleted file mode 100644 index 4874dcc4e4e..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/listblock.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.listblock' - -export interface Main { - $type: 'app.bsky.graph.listblock' - /** Reference (AT-URI) to the mod list record. */ - subject: string - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/graph/listitem.ts b/packages/api/src/client/types/app/bsky/graph/listitem.ts deleted file mode 100644 index a4c88aeecef..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/listitem.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.listitem' - -export interface Main { - $type: 'app.bsky.graph.listitem' - /** The account which is included on the list. */ - subject: string - /** Reference (AT-URI) to the list record (app.bsky.graph.list). */ - list: string - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/graph/muteActor.ts b/packages/api/src/client/types/app/bsky/graph/muteActor.ts deleted file mode 100644 index fb18bbd5dbb..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/muteActor.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.muteActor' - -export type QueryParams = {} - -export interface InputSchema { - actor: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/muteActorList.ts b/packages/api/src/client/types/app/bsky/graph/muteActorList.ts deleted file mode 100644 index a4204091ce3..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/muteActorList.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.muteActorList' - -export type QueryParams = {} - -export interface InputSchema { - list: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/muteThread.ts b/packages/api/src/client/types/app/bsky/graph/muteThread.ts deleted file mode 100644 index 6b8bd438964..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/muteThread.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.muteThread' - -export type QueryParams = {} - -export interface InputSchema { - root: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts b/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts deleted file mode 100644 index fa9cafe9334..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/searchStarterPacks.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.searchStarterPacks' - -export type QueryParams = { - /** Search query string. Syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ - q: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - starterPacks: AppBskyGraphDefs.StarterPackViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/starterpack.ts b/packages/api/src/client/types/app/bsky/graph/starterpack.ts deleted file mode 100644 index c120fe5203a..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/starterpack.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyRichtextFacet from '../richtext/facet.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.starterpack' - -export interface Main { - $type: 'app.bsky.graph.starterpack' - /** Display name for starter pack; can not be empty. */ - name: string - description?: string - descriptionFacets?: AppBskyRichtextFacet.Main[] - /** Reference (AT-URI) to the list record. */ - list: string - feeds?: FeedItem[] - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} - -export interface FeedItem { - $type?: 'app.bsky.graph.starterpack#feedItem' - uri: string -} - -const hashFeedItem = 'feedItem' - -export function isFeedItem(v: V) { - return is$typed(v, id, hashFeedItem) -} - -export function validateFeedItem(v: V) { - return validate(v, id, hashFeedItem) -} diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts b/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts deleted file mode 100644 index a10fd9a3c71..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/unmuteActor.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.unmuteActor' - -export type QueryParams = {} - -export interface InputSchema { - actor: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts b/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts deleted file mode 100644 index fd403150acd..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/unmuteActorList.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.unmuteActorList' - -export type QueryParams = {} - -export interface InputSchema { - list: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts b/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts deleted file mode 100644 index 8861d222258..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/unmuteThread.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.unmuteThread' - -export type QueryParams = {} - -export interface InputSchema { - root: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/graph/verification.ts b/packages/api/src/client/types/app/bsky/graph/verification.ts deleted file mode 100644 index 31ec934af93..00000000000 --- a/packages/api/src/client/types/app/bsky/graph/verification.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.graph.verification' - -export interface Main { - $type: 'app.bsky.graph.verification' - /** DID of the subject the verification applies to. */ - subject: string - /** Handle of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current handle matches the one at the time of verifying. */ - handle: string - /** Display name of the subject the verification applies to at the moment of verifying, which might not be the same at the time of viewing. The verification is only valid if the current displayName matches the one at the time of verifying. */ - displayName: string - /** Date of when the verification was created. */ - createdAt: string - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/labeler/defs.ts b/packages/api/src/client/types/app/bsky/labeler/defs.ts deleted file mode 100644 index 72caf1bd23a..00000000000 --- a/packages/api/src/client/types/app/bsky/labeler/defs.ts +++ /dev/null @@ -1,100 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.labeler.defs' - -export interface LabelerView { - $type?: 'app.bsky.labeler.defs#labelerView' - uri: string - cid: string - creator: AppBskyActorDefs.ProfileView - likeCount?: number - viewer?: LabelerViewerState - indexedAt: string - labels?: ComAtprotoLabelDefs.Label[] -} - -const hashLabelerView = 'labelerView' - -export function isLabelerView(v: V) { - return is$typed(v, id, hashLabelerView) -} - -export function validateLabelerView(v: V) { - return validate(v, id, hashLabelerView) -} - -export interface LabelerViewDetailed { - $type?: 'app.bsky.labeler.defs#labelerViewDetailed' - uri: string - cid: string - creator: AppBskyActorDefs.ProfileView - policies: LabelerPolicies - likeCount?: number - viewer?: LabelerViewerState - indexedAt: string - labels?: ComAtprotoLabelDefs.Label[] - /** The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed. */ - reasonTypes?: ComAtprotoModerationDefs.ReasonType[] - /** The set of subject types (account, record, etc) this service accepts reports on. */ - subjectTypes?: ComAtprotoModerationDefs.SubjectType[] - /** Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type. */ - subjectCollections?: string[] -} - -const hashLabelerViewDetailed = 'labelerViewDetailed' - -export function isLabelerViewDetailed(v: V) { - return is$typed(v, id, hashLabelerViewDetailed) -} - -export function validateLabelerViewDetailed(v: V) { - return validate(v, id, hashLabelerViewDetailed) -} - -export interface LabelerViewerState { - $type?: 'app.bsky.labeler.defs#labelerViewerState' - like?: string -} - -const hashLabelerViewerState = 'labelerViewerState' - -export function isLabelerViewerState(v: V) { - return is$typed(v, id, hashLabelerViewerState) -} - -export function validateLabelerViewerState(v: V) { - return validate(v, id, hashLabelerViewerState) -} - -export interface LabelerPolicies { - $type?: 'app.bsky.labeler.defs#labelerPolicies' - /** The label values which this labeler publishes. May include global or custom labels. */ - labelValues: ComAtprotoLabelDefs.LabelValue[] - /** Label values created by this labeler and scoped exclusively to it. Labels defined here will override global label definitions for this labeler. */ - labelValueDefinitions?: ComAtprotoLabelDefs.LabelValueDefinition[] -} - -const hashLabelerPolicies = 'labelerPolicies' - -export function isLabelerPolicies(v: V) { - return is$typed(v, id, hashLabelerPolicies) -} - -export function validateLabelerPolicies(v: V) { - return validate(v, id, hashLabelerPolicies) -} diff --git a/packages/api/src/client/types/app/bsky/labeler/getServices.ts b/packages/api/src/client/types/app/bsky/labeler/getServices.ts deleted file mode 100644 index 7c367c831c1..00000000000 --- a/packages/api/src/client/types/app/bsky/labeler/getServices.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyLabelerDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.labeler.getServices' - -export type QueryParams = { - dids: string[] - detailed?: boolean -} -export type InputSchema = undefined - -export interface OutputSchema { - views: ( - | $Typed - | $Typed - | { $type: string } - )[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/labeler/service.ts b/packages/api/src/client/types/app/bsky/labeler/service.ts deleted file mode 100644 index e1d013a1fc3..00000000000 --- a/packages/api/src/client/types/app/bsky/labeler/service.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyLabelerDefs from './defs.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' -import type * as ComAtprotoModerationDefs from '../../../com/atproto/moderation/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.labeler.service' - -export interface Main { - $type: 'app.bsky.labeler.service' - policies: AppBskyLabelerDefs.LabelerPolicies - labels?: $Typed | { $type: string } - createdAt: string - /** The set of report reason 'codes' which are in-scope for this service to review and action. These usually align to policy categories. If not defined (distinct from empty array), all reason types are allowed. */ - reasonTypes?: ComAtprotoModerationDefs.ReasonType[] - /** The set of subject types (account, record, etc) this service accepts reports on. */ - subjectTypes?: ComAtprotoModerationDefs.SubjectType[] - /** Set of record types (collection NSIDs) which can be reported to this service. If not defined (distinct from empty array), default is any record type. */ - subjectCollections?: string[] - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/notification/declaration.ts b/packages/api/src/client/types/app/bsky/notification/declaration.ts deleted file mode 100644 index 4fbb7e09e81..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/declaration.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.declaration' - -export interface Main { - $type: 'app.bsky.notification.declaration' - /** A declaration of the user's preference for allowing activity subscriptions from other users. Absence of a record implies 'followers'. */ - allowSubscriptions: 'followers' | 'mutuals' | 'none' | (string & {}) - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/app/bsky/notification/defs.ts b/packages/api/src/client/types/app/bsky/notification/defs.ts deleted file mode 100644 index 20c308e8676..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/defs.ts +++ /dev/null @@ -1,142 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.defs' - -export interface RecordDeleted { - $type?: 'app.bsky.notification.defs#recordDeleted' -} - -const hashRecordDeleted = 'recordDeleted' - -export function isRecordDeleted(v: V) { - return is$typed(v, id, hashRecordDeleted) -} - -export function validateRecordDeleted(v: V) { - return validate(v, id, hashRecordDeleted) -} - -export interface ChatPreference { - $type?: 'app.bsky.notification.defs#chatPreference' - include: 'all' | 'accepted' | (string & {}) - push: boolean -} - -const hashChatPreference = 'chatPreference' - -export function isChatPreference(v: V) { - return is$typed(v, id, hashChatPreference) -} - -export function validateChatPreference(v: V) { - return validate(v, id, hashChatPreference) -} - -export interface FilterablePreference { - $type?: 'app.bsky.notification.defs#filterablePreference' - include: 'all' | 'follows' | (string & {}) - list: boolean - push: boolean -} - -const hashFilterablePreference = 'filterablePreference' - -export function isFilterablePreference(v: V) { - return is$typed(v, id, hashFilterablePreference) -} - -export function validateFilterablePreference(v: V) { - return validate(v, id, hashFilterablePreference) -} - -export interface Preference { - $type?: 'app.bsky.notification.defs#preference' - list: boolean - push: boolean -} - -const hashPreference = 'preference' - -export function isPreference(v: V) { - return is$typed(v, id, hashPreference) -} - -export function validatePreference(v: V) { - return validate(v, id, hashPreference) -} - -export interface Preferences { - $type?: 'app.bsky.notification.defs#preferences' - chat: ChatPreference - follow: FilterablePreference - like: FilterablePreference - likeViaRepost: FilterablePreference - mention: FilterablePreference - quote: FilterablePreference - reply: FilterablePreference - repost: FilterablePreference - repostViaRepost: FilterablePreference - starterpackJoined: Preference - subscribedPost: Preference - unverified: Preference - verified: Preference -} - -const hashPreferences = 'preferences' - -export function isPreferences(v: V) { - return is$typed(v, id, hashPreferences) -} - -export function validatePreferences(v: V) { - return validate(v, id, hashPreferences) -} - -export interface ActivitySubscription { - $type?: 'app.bsky.notification.defs#activitySubscription' - post: boolean - reply: boolean -} - -const hashActivitySubscription = 'activitySubscription' - -export function isActivitySubscription(v: V) { - return is$typed(v, id, hashActivitySubscription) -} - -export function validateActivitySubscription(v: V) { - return validate(v, id, hashActivitySubscription) -} - -/** Object used to store activity subscription data in stash. */ -export interface SubjectActivitySubscription { - $type?: 'app.bsky.notification.defs#subjectActivitySubscription' - subject: string - activitySubscription: ActivitySubscription -} - -const hashSubjectActivitySubscription = 'subjectActivitySubscription' - -export function isSubjectActivitySubscription(v: V) { - return is$typed(v, id, hashSubjectActivitySubscription) -} - -export function validateSubjectActivitySubscription(v: V) { - return validate( - v, - id, - hashSubjectActivitySubscription, - ) -} diff --git a/packages/api/src/client/types/app/bsky/notification/getPreferences.ts b/packages/api/src/client/types/app/bsky/notification/getPreferences.ts deleted file mode 100644 index 3ddbd34e22f..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/getPreferences.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyNotificationDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.getPreferences' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - preferences: AppBskyNotificationDefs.Preferences -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts b/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts deleted file mode 100644 index 5ed40355efe..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/getUnreadCount.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.getUnreadCount' - -export type QueryParams = { - priority?: boolean - seenAt?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - count: number -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts b/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts deleted file mode 100644 index c5fb891b87d..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/listActivitySubscriptions.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.listActivitySubscriptions' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - subscriptions: AppBskyActorDefs.ProfileView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/listNotifications.ts b/packages/api/src/client/types/app/bsky/notification/listNotifications.ts deleted file mode 100644 index d5ec78833e7..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/listNotifications.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.listNotifications' - -export type QueryParams = { - /** Notification reasons to include in response. */ - reasons?: string[] - limit?: number - priority?: boolean - cursor?: string - seenAt?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - notifications: Notification[] - priority?: boolean - seenAt?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface Notification { - $type?: 'app.bsky.notification.listNotifications#notification' - uri: string - cid: string - author: AppBskyActorDefs.ProfileView - /** The reason why this notification was delivered - e.g. your post was liked, or you received a new follower. */ - reason: - | 'like' - | 'repost' - | 'follow' - | 'mention' - | 'reply' - | 'quote' - | 'starterpack-joined' - | 'verified' - | 'unverified' - | 'like-via-repost' - | 'repost-via-repost' - | 'subscribed-post' - | 'contact-match' - | (string & {}) - reasonSubject?: string - record: { [_ in string]: unknown } - isRead: boolean - indexedAt: string - labels?: ComAtprotoLabelDefs.Label[] -} - -const hashNotification = 'notification' - -export function isNotification(v: V) { - return is$typed(v, id, hashNotification) -} - -export function validateNotification(v: V) { - return validate(v, id, hashNotification) -} diff --git a/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts b/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts deleted file mode 100644 index 85e2e3da083..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/putActivitySubscription.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyNotificationDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.putActivitySubscription' - -export type QueryParams = {} - -export interface InputSchema { - subject: string - activitySubscription: AppBskyNotificationDefs.ActivitySubscription -} - -export interface OutputSchema { - subject: string - activitySubscription?: AppBskyNotificationDefs.ActivitySubscription -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/putPreferences.ts b/packages/api/src/client/types/app/bsky/notification/putPreferences.ts deleted file mode 100644 index ae5439ab4ab..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/putPreferences.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.putPreferences' - -export type QueryParams = {} - -export interface InputSchema { - priority: boolean -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts b/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts deleted file mode 100644 index 07ae037368c..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/putPreferencesV2.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyNotificationDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.putPreferencesV2' - -export type QueryParams = {} - -export interface InputSchema { - chat?: AppBskyNotificationDefs.ChatPreference - follow?: AppBskyNotificationDefs.FilterablePreference - like?: AppBskyNotificationDefs.FilterablePreference - likeViaRepost?: AppBskyNotificationDefs.FilterablePreference - mention?: AppBskyNotificationDefs.FilterablePreference - quote?: AppBskyNotificationDefs.FilterablePreference - reply?: AppBskyNotificationDefs.FilterablePreference - repost?: AppBskyNotificationDefs.FilterablePreference - repostViaRepost?: AppBskyNotificationDefs.FilterablePreference - starterpackJoined?: AppBskyNotificationDefs.Preference - subscribedPost?: AppBskyNotificationDefs.Preference - unverified?: AppBskyNotificationDefs.Preference - verified?: AppBskyNotificationDefs.Preference -} - -export interface OutputSchema { - preferences: AppBskyNotificationDefs.Preferences -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/registerPush.ts b/packages/api/src/client/types/app/bsky/notification/registerPush.ts deleted file mode 100644 index 5d79e765648..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/registerPush.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.registerPush' - -export type QueryParams = {} - -export interface InputSchema { - serviceDid: string - token: string - platform: 'ios' | 'android' | 'web' | (string & {}) - appId: string - /** Set to true when the actor is age restricted */ - ageRestricted?: boolean -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts b/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts deleted file mode 100644 index 3910431d229..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/unregisterPush.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.unregisterPush' - -export type QueryParams = {} - -export interface InputSchema { - serviceDid: string - token: string - platform: 'ios' | 'android' | 'web' | (string & {}) - appId: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/notification/updateSeen.ts b/packages/api/src/client/types/app/bsky/notification/updateSeen.ts deleted file mode 100644 index 4a59718dae1..00000000000 --- a/packages/api/src/client/types/app/bsky/notification/updateSeen.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.notification.updateSeen' - -export type QueryParams = {} - -export interface InputSchema { - seenAt: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/richtext/facet.ts b/packages/api/src/client/types/app/bsky/richtext/facet.ts deleted file mode 100644 index 80182f7a4c1..00000000000 --- a/packages/api/src/client/types/app/bsky/richtext/facet.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.richtext.facet' - -/** Annotation of a sub-string within rich text. */ -export interface Main { - $type?: 'app.bsky.richtext.facet' - index: ByteSlice - features: ($Typed | $Typed | $Typed | { $type: string })[] -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain) -} - -/** Facet feature for mention of another account. The text is usually a handle, including a '@' prefix, but the facet reference is a DID. */ -export interface Mention { - $type?: 'app.bsky.richtext.facet#mention' - did: string -} - -const hashMention = 'mention' - -export function isMention(v: V) { - return is$typed(v, id, hashMention) -} - -export function validateMention(v: V) { - return validate(v, id, hashMention) -} - -/** Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL. */ -export interface Link { - $type?: 'app.bsky.richtext.facet#link' - uri: string -} - -const hashLink = 'link' - -export function isLink(v: V) { - return is$typed(v, id, hashLink) -} - -export function validateLink(v: V) { - return validate(v, id, hashLink) -} - -/** Facet feature for a hashtag. The text usually includes a '#' prefix, but the facet reference should not (except in the case of 'double hash tags'). */ -export interface Tag { - $type?: 'app.bsky.richtext.facet#tag' - tag: string -} - -const hashTag = 'tag' - -export function isTag(v: V) { - return is$typed(v, id, hashTag) -} - -export function validateTag(v: V) { - return validate(v, id, hashTag) -} - -/** Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets. */ -export interface ByteSlice { - $type?: 'app.bsky.richtext.facet#byteSlice' - byteStart: number - byteEnd: number -} - -const hashByteSlice = 'byteSlice' - -export function isByteSlice(v: V) { - return is$typed(v, id, hashByteSlice) -} - -export function validateByteSlice(v: V) { - return validate(v, id, hashByteSlice) -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/defs.ts b/packages/api/src/client/types/app/bsky/unspecced/defs.ts deleted file mode 100644 index 0c793da4d57..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/defs.ts +++ /dev/null @@ -1,250 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.defs' - -export interface SkeletonSearchPost { - $type?: 'app.bsky.unspecced.defs#skeletonSearchPost' - uri: string -} - -const hashSkeletonSearchPost = 'skeletonSearchPost' - -export function isSkeletonSearchPost(v: V) { - return is$typed(v, id, hashSkeletonSearchPost) -} - -export function validateSkeletonSearchPost(v: V) { - return validate(v, id, hashSkeletonSearchPost) -} - -export interface SkeletonSearchActor { - $type?: 'app.bsky.unspecced.defs#skeletonSearchActor' - did: string -} - -const hashSkeletonSearchActor = 'skeletonSearchActor' - -export function isSkeletonSearchActor(v: V) { - return is$typed(v, id, hashSkeletonSearchActor) -} - -export function validateSkeletonSearchActor(v: V) { - return validate(v, id, hashSkeletonSearchActor) -} - -export interface SkeletonSearchStarterPack { - $type?: 'app.bsky.unspecced.defs#skeletonSearchStarterPack' - uri: string -} - -const hashSkeletonSearchStarterPack = 'skeletonSearchStarterPack' - -export function isSkeletonSearchStarterPack(v: V) { - return is$typed(v, id, hashSkeletonSearchStarterPack) -} - -export function validateSkeletonSearchStarterPack(v: V) { - return validate( - v, - id, - hashSkeletonSearchStarterPack, - ) -} - -export interface TrendingTopic { - $type?: 'app.bsky.unspecced.defs#trendingTopic' - topic: string - displayName?: string - description?: string - link: string -} - -const hashTrendingTopic = 'trendingTopic' - -export function isTrendingTopic(v: V) { - return is$typed(v, id, hashTrendingTopic) -} - -export function validateTrendingTopic(v: V) { - return validate(v, id, hashTrendingTopic) -} - -export interface SkeletonTrend { - $type?: 'app.bsky.unspecced.defs#skeletonTrend' - topic: string - displayName: string - link: string - startedAt: string - postCount: number - status?: 'hot' | (string & {}) - category?: string - dids: string[] -} - -const hashSkeletonTrend = 'skeletonTrend' - -export function isSkeletonTrend(v: V) { - return is$typed(v, id, hashSkeletonTrend) -} - -export function validateSkeletonTrend(v: V) { - return validate(v, id, hashSkeletonTrend) -} - -export interface TrendView { - $type?: 'app.bsky.unspecced.defs#trendView' - topic: string - displayName: string - link: string - startedAt: string - postCount: number - status?: 'hot' | (string & {}) - category?: string - actors: AppBskyActorDefs.ProfileViewBasic[] -} - -const hashTrendView = 'trendView' - -export function isTrendView(v: V) { - return is$typed(v, id, hashTrendView) -} - -export function validateTrendView(v: V) { - return validate(v, id, hashTrendView) -} - -export interface ThreadItemPost { - $type?: 'app.bsky.unspecced.defs#threadItemPost' - post: AppBskyFeedDefs.PostView - /** This post has more parents that were not present in the response. This is just a boolean, without the number of parents. */ - moreParents: boolean - /** This post has more replies that were not present in the response. This is a numeric value, which is best-effort and might not be accurate. */ - moreReplies: number - /** This post is part of a contiguous thread by the OP from the thread root. Many different OP threads can happen in the same thread. */ - opThread: boolean - /** The threadgate created by the author indicates this post as a reply to be hidden for everyone consuming the thread. */ - hiddenByThreadgate: boolean - /** This is by an account muted by the viewer requesting it. */ - mutedByViewer: boolean -} - -const hashThreadItemPost = 'threadItemPost' - -export function isThreadItemPost(v: V) { - return is$typed(v, id, hashThreadItemPost) -} - -export function validateThreadItemPost(v: V) { - return validate(v, id, hashThreadItemPost) -} - -export interface ThreadItemNoUnauthenticated { - $type?: 'app.bsky.unspecced.defs#threadItemNoUnauthenticated' -} - -const hashThreadItemNoUnauthenticated = 'threadItemNoUnauthenticated' - -export function isThreadItemNoUnauthenticated(v: V) { - return is$typed(v, id, hashThreadItemNoUnauthenticated) -} - -export function validateThreadItemNoUnauthenticated(v: V) { - return validate( - v, - id, - hashThreadItemNoUnauthenticated, - ) -} - -export interface ThreadItemNotFound { - $type?: 'app.bsky.unspecced.defs#threadItemNotFound' -} - -const hashThreadItemNotFound = 'threadItemNotFound' - -export function isThreadItemNotFound(v: V) { - return is$typed(v, id, hashThreadItemNotFound) -} - -export function validateThreadItemNotFound(v: V) { - return validate(v, id, hashThreadItemNotFound) -} - -export interface ThreadItemBlocked { - $type?: 'app.bsky.unspecced.defs#threadItemBlocked' - author: AppBskyFeedDefs.BlockedAuthor -} - -const hashThreadItemBlocked = 'threadItemBlocked' - -export function isThreadItemBlocked(v: V) { - return is$typed(v, id, hashThreadItemBlocked) -} - -export function validateThreadItemBlocked(v: V) { - return validate(v, id, hashThreadItemBlocked) -} - -/** The computed state of the age assurance process, returned to the user in question on certain authenticated requests. */ -export interface AgeAssuranceState { - $type?: 'app.bsky.unspecced.defs#ageAssuranceState' - /** The timestamp when this state was last updated. */ - lastInitiatedAt?: string - /** The status of the age assurance process. */ - status: 'unknown' | 'pending' | 'assured' | 'blocked' | (string & {}) -} - -const hashAgeAssuranceState = 'ageAssuranceState' - -export function isAgeAssuranceState(v: V) { - return is$typed(v, id, hashAgeAssuranceState) -} - -export function validateAgeAssuranceState(v: V) { - return validate(v, id, hashAgeAssuranceState) -} - -/** Object used to store age assurance data in stash. */ -export interface AgeAssuranceEvent { - $type?: 'app.bsky.unspecced.defs#ageAssuranceEvent' - /** The date and time of this write operation. */ - createdAt: string - /** The status of the age assurance process. */ - status: 'unknown' | 'pending' | 'assured' | (string & {}) - /** The unique identifier for this instance of the age assurance flow, in UUID format. */ - attemptId: string - /** The email used for AA. */ - email?: string - /** The IP address used when initiating the AA flow. */ - initIp?: string - /** The user agent used when initiating the AA flow. */ - initUa?: string - /** The IP address used when completing the AA flow. */ - completeIp?: string - /** The user agent used when completing the AA flow. */ - completeUa?: string -} - -const hashAgeAssuranceEvent = 'ageAssuranceEvent' - -export function isAgeAssuranceEvent(v: V) { - return is$typed(v, id, hashAgeAssuranceEvent) -} - -export function validateAgeAssuranceEvent(v: V) { - return validate(v, id, hashAgeAssuranceEvent) -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts b/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts deleted file mode 100644 index 757de98bc09..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getAgeAssuranceState.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getAgeAssuranceState' - -export type QueryParams = {} -export type InputSchema = undefined -export type OutputSchema = AppBskyUnspeccedDefs.AgeAssuranceState - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts b/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts deleted file mode 100644 index e0711cee01f..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getConfig.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getConfig' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - checkEmailConfirmed?: boolean - liveNow?: LiveNowConfig[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface LiveNowConfig { - $type?: 'app.bsky.unspecced.getConfig#liveNowConfig' - did: string - domains: string[] -} - -const hashLiveNowConfig = 'liveNowConfig' - -export function isLiveNowConfig(v: V) { - return is$typed(v, id, hashLiveNowConfig) -} - -export function validateLiveNowConfig(v: V) { - return validate(v, id, hashLiveNowConfig) -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts deleted file mode 100644 index 714cb2c5036..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from '../graph/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getOnboardingSuggestedStarterPacks' - -export type QueryParams = { - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - starterPacks: AppBskyGraphDefs.StarterPackView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts deleted file mode 100644 index 7cd517312ed..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getOnboardingSuggestedStarterPacksSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - starterPacks: string[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts deleted file mode 100644 index 45db98e0b54..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getOnboardingSuggestedUsersSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - dids: string[] - /** DEPRECATED: use recIdStr instead. */ - recId?: string - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts b/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts deleted file mode 100644 index 7146d0964b9..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getPopularFeedGenerators.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getPopularFeedGenerators' - -export type QueryParams = { - limit?: number - cursor?: string - query?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - feeds: AppBskyFeedDefs.GeneratorView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts b/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts deleted file mode 100644 index ef0787a2cc0..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadOtherV2.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getPostThreadOtherV2' - -export type QueryParams = { - /** Reference (AT-URI) to post record. This is the anchor post. */ - anchor: string -} -export type InputSchema = undefined - -export interface OutputSchema { - /** A flat list of other thread items. The depth of each item is indicated by the depth property inside the item. */ - thread: ThreadItem[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface ThreadItem { - $type?: 'app.bsky.unspecced.getPostThreadOtherV2#threadItem' - uri: string - /** The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths. */ - depth: number - value: $Typed | { $type: string } -} - -const hashThreadItem = 'threadItem' - -export function isThreadItem(v: V) { - return is$typed(v, id, hashThreadItem) -} - -export function validateThreadItem(v: V) { - return validate(v, id, hashThreadItem) -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts b/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts deleted file mode 100644 index 54e5c92b320..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getPostThreadV2.ts +++ /dev/null @@ -1,78 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getPostThreadV2' - -export type QueryParams = { - /** Reference (AT-URI) to post record. This is the anchor post, and the thread will be built around it. It can be any post in the tree, not necessarily a root post. */ - anchor: string - /** Whether to include parents above the anchor. */ - above?: boolean - /** How many levels of replies to include below the anchor. */ - below?: number - /** Maximum of replies to include at each level of the thread, except for the direct replies to the anchor, which are (NOTE: currently, during unspecced phase) all returned (NOTE: later they might be paginated). */ - branchingFactor?: number - /** Sorting for the thread replies. */ - sort?: 'newest' | 'oldest' | 'top' | (string & {}) -} -export type InputSchema = undefined - -export interface OutputSchema { - /** A flat list of thread items. The depth of each item is indicated by the depth property inside the item. */ - thread: ThreadItem[] - threadgate?: AppBskyFeedDefs.ThreadgateView - /** Whether this thread has additional replies. If true, a call can be made to the `getPostThreadOtherV2` endpoint to retrieve them. */ - hasOtherReplies: boolean -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface ThreadItem { - $type?: 'app.bsky.unspecced.getPostThreadV2#threadItem' - uri: string - /** The nesting level of this item in the thread. Depth 0 means the anchor item. Items above have negative depths, items below have positive depths. */ - depth: number - value: - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashThreadItem = 'threadItem' - -export function isThreadItem(v: V) { - return is$typed(v, id, hashThreadItem) -} - -export function validateThreadItem(v: V) { - return validate(v, id, hashThreadItem) -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts deleted file mode 100644 index 712c98a1f73..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeeds.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyFeedDefs from '../feed/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedFeeds' - -export type QueryParams = { - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - feeds: AppBskyFeedDefs.GeneratorView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts deleted file mode 100644 index 96ddb90b1ab..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedFeedsSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - feeds: string[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts deleted file mode 100644 index 5f03d799806..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedOnboardingUsers' - -export type QueryParams = { - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - actors: AppBskyActorDefs.ProfileView[] - /** DEPRECATED: use recIdStr instead. */ - recId?: string - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts deleted file mode 100644 index 338285115a8..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacks.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyGraphDefs from '../graph/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedStarterPacks' - -export type QueryParams = { - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - starterPacks: AppBskyGraphDefs.StarterPackView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts deleted file mode 100644 index f0f3c0da365..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedStarterPacksSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - starterPacks: string[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts deleted file mode 100644 index dbd017e87f8..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsers.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsers' - -export type QueryParams = { - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - actors: AppBskyActorDefs.ProfileView[] - /** DEPRECATED: use recIdStr instead. */ - recId?: string - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts deleted file mode 100644 index 42ba1958394..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersForDiscover' - -export type QueryParams = { - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - actors: AppBskyActorDefs.ProfileView[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts deleted file mode 100644 index e7a99c5518a..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersForDiscoverSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - dids: string[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts deleted file mode 100644 index 646b21ba04a..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersForExplore' - -export type QueryParams = { - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - actors: AppBskyActorDefs.ProfileView[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts deleted file mode 100644 index e4dcbae8598..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersForExploreSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - dids: string[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts deleted file mode 100644 index f51a6cc143c..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersForSeeMore' - -export type QueryParams = { - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - actors: AppBskyActorDefs.ProfileView[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts deleted file mode 100644 index 553630fa8e4..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersForSeeMoreSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - dids: string[] - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts deleted file mode 100644 index 3b4ae11c7d7..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestedUsersSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - /** Category of users to get suggestions for. */ - category?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - dids: string[] - /** DEPRECATED: use recIdStr instead. */ - recId?: string - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts deleted file mode 100644 index d8dfbb42bb9..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getSuggestionsSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. */ - viewer?: string - limit?: number - cursor?: string - /** DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer. */ - relativeToDid?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - actors: AppBskyUnspeccedDefs.SkeletonSearchActor[] - /** DID of the account these suggestions are relative to. If this is returned undefined, suggestions are based on the viewer. */ - relativeToDid?: string - /** DEPRECATED: use recIdStr instead. */ - recId?: number - /** Snowflake for this recommendation, use when submitting recommendation events. */ - recIdStr?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts b/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts deleted file mode 100644 index 1d89dacd366..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getTaggedSuggestions.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getTaggedSuggestions' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - suggestions: Suggestion[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface Suggestion { - $type?: 'app.bsky.unspecced.getTaggedSuggestions#suggestion' - tag: string - subjectType: 'actor' | 'feed' | (string & {}) - subject: string -} - -const hashSuggestion = 'suggestion' - -export function isSuggestion(v: V) { - return is$typed(v, id, hashSuggestion) -} - -export function validateSuggestion(v: V) { - return validate(v, id, hashSuggestion) -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts deleted file mode 100644 index 5ec36b93bd4..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrendingTopics.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getTrendingTopics' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. */ - viewer?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - topics: AppBskyUnspeccedDefs.TrendingTopic[] - suggested: AppBskyUnspeccedDefs.TrendingTopic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts deleted file mode 100644 index 998f60113a3..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrends.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getTrends' - -export type QueryParams = { - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - trends: AppBskyUnspeccedDefs.TrendView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts deleted file mode 100644 index e2945c984fb..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/getTrendsSkeleton.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.getTrendsSkeleton' - -export type QueryParams = { - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - trends: AppBskyUnspeccedDefs.SkeletonTrend[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts b/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts deleted file mode 100644 index a3d78b8e8c2..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/initAgeAssurance.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.initAgeAssurance' - -export type QueryParams = {} - -export interface InputSchema { - /** The user's email address to receive assurance instructions. */ - email: string - /** The user's preferred language for communication during the assurance process. */ - language: string - /** An ISO 3166-1 alpha-2 code of the user's location. */ - countryCode: string -} - -export type OutputSchema = AppBskyUnspeccedDefs.AgeAssuranceState - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidEmailError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidTooLongError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidInitiationError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidEmail') return new InvalidEmailError(e) - if (e.error === 'DidTooLong') return new DidTooLongError(e) - if (e.error === 'InvalidInitiation') return new InvalidInitiationError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts deleted file mode 100644 index 8e71f43c5cf..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/searchActorsSkeleton.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.searchActorsSkeleton' - -export type QueryParams = { - /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. For typeahead search, only simple term match is supported, not full syntax. */ - q: string - /** DID of the account making the request (not included for public/unauthenticated queries). Used to boost followed accounts in ranking. */ - viewer?: string - /** If true, acts as fast/simple 'typeahead' query. */ - typeahead?: boolean - limit?: number - /** Optional pagination mechanism; may not necessarily allow scrolling through entire result set. */ - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ - hitsTotal?: number - actors: AppBskyUnspeccedDefs.SkeletonSearchActor[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class BadQueryStringError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'BadQueryString') return new BadQueryStringError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts deleted file mode 100644 index 319f4b0d5c9..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/searchPostsSkeleton.ts +++ /dev/null @@ -1,78 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.searchPostsSkeleton' - -export type QueryParams = { - /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ - q: string - /** Specifies the ranking order of results. */ - sort?: 'top' | 'latest' | (string & {}) - /** Filter results for posts after the indicated datetime (inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYYY-MM-DD). */ - since?: string - /** Filter results for posts before the indicated datetime (not inclusive). Expected to use 'sortAt' timestamp, which may not match 'createdAt'. Can be a datetime, or just an ISO date (YYY-MM-DD). */ - until?: string - /** Filter to posts which mention the given account. Handles are resolved to DID before query-time. Only matches rich-text facet mentions. */ - mentions?: string - /** Filter to posts by the given account. Handles are resolved to DID before query-time. */ - author?: string - /** Filter to posts in the given language. Expected to be based on post language field, though server may override language detection. */ - lang?: string - /** Filter to posts with URLs (facet links or embeds) linking to the given domain (hostname). Server may apply hostname normalization. */ - domain?: string - /** Filter to posts with links (facet links or embeds) pointing to this URL. Server may apply URL normalization or fuzzy matching. */ - url?: string - /** Filter to posts with the given tag (hashtag), based on rich-text facet or tag field. Do not include the hash (#) prefix. Multiple tags can be specified, with 'AND' matching. */ - tag?: string[] - /** DID of the account making the request (not included for public/unauthenticated queries). Used for 'from:me' queries. */ - viewer?: string - limit?: number - /** Optional pagination mechanism; may not necessarily allow scrolling through entire result set. */ - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ - hitsTotal?: number - posts: AppBskyUnspeccedDefs.SkeletonSearchPost[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class BadQueryStringError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'BadQueryString') return new BadQueryStringError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts b/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts deleted file mode 100644 index 18bf0b95b26..00000000000 --- a/packages/api/src/client/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyUnspeccedDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.unspecced.searchStarterPacksSkeleton' - -export type QueryParams = { - /** Search query string; syntax, phrase, boolean, and faceting is unspecified, but Lucene query syntax is recommended. */ - q: string - /** DID of the account making the request (not included for public/unauthenticated queries). */ - viewer?: string - limit?: number - /** Optional pagination mechanism; may not necessarily allow scrolling through entire result set. */ - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - /** Count of search hits. Optional, may be rounded/truncated, and may not be possible to paginate through all hits. */ - hitsTotal?: number - starterPacks: AppBskyUnspeccedDefs.SkeletonSearchStarterPack[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class BadQueryStringError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'BadQueryString') return new BadQueryStringError(e) - } - - return e -} diff --git a/packages/api/src/client/types/app/bsky/video/defs.ts b/packages/api/src/client/types/app/bsky/video/defs.ts deleted file mode 100644 index cd61c727c59..00000000000 --- a/packages/api/src/client/types/app/bsky/video/defs.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.video.defs' - -export interface JobStatus { - $type?: 'app.bsky.video.defs#jobStatus' - jobId: string - did: string - /** The state of the video processing job. All values not listed as a known value indicate that the job is in process. */ - state: 'JOB_STATE_COMPLETED' | 'JOB_STATE_FAILED' | (string & {}) - /** Progress within the current processing state. */ - progress?: number - blob?: BlobRef - error?: string - message?: string -} - -const hashJobStatus = 'jobStatus' - -export function isJobStatus(v: V) { - return is$typed(v, id, hashJobStatus) -} - -export function validateJobStatus(v: V) { - return validate(v, id, hashJobStatus) -} diff --git a/packages/api/src/client/types/app/bsky/video/getJobStatus.ts b/packages/api/src/client/types/app/bsky/video/getJobStatus.ts deleted file mode 100644 index d96b351e378..00000000000 --- a/packages/api/src/client/types/app/bsky/video/getJobStatus.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyVideoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.video.getJobStatus' - -export type QueryParams = { - jobId: string -} -export type InputSchema = undefined - -export interface OutputSchema { - jobStatus: AppBskyVideoDefs.JobStatus -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts b/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts deleted file mode 100644 index 7fcfbaea23d..00000000000 --- a/packages/api/src/client/types/app/bsky/video/getUploadLimits.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.video.getUploadLimits' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - canUpload: boolean - remainingDailyVideos?: number - remainingDailyBytes?: number - message?: string - error?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/app/bsky/video/uploadVideo.ts b/packages/api/src/client/types/app/bsky/video/uploadVideo.ts deleted file mode 100644 index 7e13e34e309..00000000000 --- a/packages/api/src/client/types/app/bsky/video/uploadVideo.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyVideoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'app.bsky.video.uploadVideo' - -export type QueryParams = {} -export type InputSchema = string | Uint8Array | Blob - -export interface OutputSchema { - jobStatus: AppBskyVideoDefs.JobStatus -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'video/mp4' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/actor/declaration.ts b/packages/api/src/client/types/chat/bsky/actor/declaration.ts deleted file mode 100644 index b909abaca13..00000000000 --- a/packages/api/src/client/types/chat/bsky/actor/declaration.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.actor.declaration' - -export interface Main { - $type: 'chat.bsky.actor.declaration' - allowIncoming: 'all' | 'none' | 'following' | (string & {}) - /** [NOTE: This is under active development and should be considered unstable while this note is here]. Declaration about group chat invitation preferences for the record owner. */ - allowGroupInvites?: 'all' | 'none' | 'following' | (string & {}) - [k: string]: unknown -} - -const hashMain = 'main' - -export function isMain(v: V) { - return is$typed(v, id, hashMain) -} - -export function validateMain(v: V) { - return validate
(v, id, hashMain, true) -} - -export { - type Main as Record, - isMain as isRecord, - validateMain as validateRecord, -} diff --git a/packages/api/src/client/types/chat/bsky/actor/defs.ts b/packages/api/src/client/types/chat/bsky/actor/defs.ts deleted file mode 100644 index 76d4f4772d1..00000000000 --- a/packages/api/src/client/types/chat/bsky/actor/defs.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyActorDefs from '../../../app/bsky/actor/defs.js' -import type * as ComAtprotoLabelDefs from '../../../com/atproto/label/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.actor.defs' - -export type MemberRole = 'owner' | 'standard' | (string & {}) - -export interface ProfileViewBasic { - $type?: 'chat.bsky.actor.defs#profileViewBasic' - did: string - handle: string - displayName?: string - avatar?: string - associated?: AppBskyActorDefs.ProfileAssociated - viewer?: AppBskyActorDefs.ViewerState - labels?: ComAtprotoLabelDefs.Label[] - createdAt?: string - /** Set to true when the actor cannot actively participate in conversations */ - chatDisabled?: boolean - verification?: AppBskyActorDefs.VerificationState - kind?: - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashProfileViewBasic = 'profileViewBasic' - -export function isProfileViewBasic(v: V) { - return is$typed(v, id, hashProfileViewBasic) -} - -export function validateProfileViewBasic(v: V) { - return validate(v, id, hashProfileViewBasic) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. */ -export interface DirectConvoMember { - $type?: 'chat.bsky.actor.defs#directConvoMember' -} - -const hashDirectConvoMember = 'directConvoMember' - -export function isDirectConvoMember(v: V) { - return is$typed(v, id, hashDirectConvoMember) -} - -export function validateDirectConvoMember(v: V) { - return validate(v, id, hashDirectConvoMember) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. A current group convo member. */ -export interface GroupConvoMember { - $type?: 'chat.bsky.actor.defs#groupConvoMember' - addedBy?: ProfileViewBasic - role: MemberRole -} - -const hashGroupConvoMember = 'groupConvoMember' - -export function isGroupConvoMember(v: V) { - return is$typed(v, id, hashGroupConvoMember) -} - -export function validateGroupConvoMember(v: V) { - return validate(v, id, hashGroupConvoMember) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. A past group convo member. */ -export interface PastGroupConvoMember { - $type?: 'chat.bsky.actor.defs#pastGroupConvoMember' -} - -const hashPastGroupConvoMember = 'pastGroupConvoMember' - -export function isPastGroupConvoMember(v: V) { - return is$typed(v, id, hashPastGroupConvoMember) -} - -export function validatePastGroupConvoMember(v: V) { - return validate(v, id, hashPastGroupConvoMember) -} diff --git a/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts b/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts deleted file mode 100644 index 484ac36a69a..00000000000 --- a/packages/api/src/client/types/chat/bsky/actor/deleteAccount.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.actor.deleteAccount' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts b/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts deleted file mode 100644 index 2b564168bfd..00000000000 --- a/packages/api/src/client/types/chat/bsky/actor/exportAccountData.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.actor.exportAccountData' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: Uint8Array -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts b/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts deleted file mode 100644 index a41ffbb8529..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/acceptConvo.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.acceptConvo' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - /** Rev when the convo was accepted. If not present, the convo was already accepted. */ - rev?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/addReaction.ts b/packages/api/src/client/types/chat/bsky/convo/addReaction.ts deleted file mode 100644 index fc296071398..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/addReaction.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.addReaction' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - messageId: string - value: string -} - -export interface OutputSchema { - message: ChatBskyConvoDefs.MessageView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionNotAllowedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionMessageDeletedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionLimitReachedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionInvalidValueError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'ReactionNotAllowed') return new ReactionNotAllowedError(e) - if (e.error === 'ReactionMessageDeleted') - return new ReactionMessageDeletedError(e) - if (e.error === 'ReactionLimitReached') - return new ReactionLimitReachedError(e) - if (e.error === 'ReactionInvalidValue') - return new ReactionInvalidValueError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/defs.ts b/packages/api/src/client/types/chat/bsky/convo/defs.ts deleted file mode 100644 index c598b0b56d3..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/defs.ts +++ /dev/null @@ -1,1058 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as AppBskyRichtextFacet from '../../../app/bsky/richtext/facet.js' -import type * as AppBskyEmbedRecord from '../../../app/bsky/embed/record.js' -import type * as ChatBskyActorDefs from '../actor/defs.js' -import type * as ChatBskyGroupDefs from '../group/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.defs' - -export type ConvoKind = 'direct' | 'group' | (string & {}) -export type ConvoLockStatus = - | 'unlocked' - | 'locked' - | 'locked-permanently' - | (string & {}) -export type ConvoStatus = 'request' | 'accepted' | (string & {}) - -export interface ConvoRef { - $type?: 'chat.bsky.convo.defs#convoRef' - did: string - convoId: string -} - -const hashConvoRef = 'convoRef' - -export function isConvoRef(v: V) { - return is$typed(v, id, hashConvoRef) -} - -export function validateConvoRef(v: V) { - return validate(v, id, hashConvoRef) -} - -export interface MessageRef { - $type?: 'chat.bsky.convo.defs#messageRef' - did: string - convoId: string - messageId: string -} - -const hashMessageRef = 'messageRef' - -export function isMessageRef(v: V) { - return is$typed(v, id, hashMessageRef) -} - -export function validateMessageRef(v: V) { - return validate(v, id, hashMessageRef) -} - -export interface MessageInput { - $type?: 'chat.bsky.convo.defs#messageInput' - text: string - /** Annotations of text (mentions, URLs, hashtags, etc) */ - facets?: AppBskyRichtextFacet.Main[] - embed?: $Typed | { $type: string } -} - -const hashMessageInput = 'messageInput' - -export function isMessageInput(v: V) { - return is$typed(v, id, hashMessageInput) -} - -export function validateMessageInput(v: V) { - return validate(v, id, hashMessageInput) -} - -export interface MessageView { - $type?: 'chat.bsky.convo.defs#messageView' - id: string - rev: string - text: string - /** Annotations of text (mentions, URLs, hashtags, etc) */ - facets?: AppBskyRichtextFacet.Main[] - embed?: $Typed | { $type: string } - /** Reactions to this message, in ascending order of creation time. */ - reactions?: ReactionView[] - sender: MessageViewSender - sentAt: string -} - -const hashMessageView = 'messageView' - -export function isMessageView(v: V) { - return is$typed(v, id, hashMessageView) -} - -export function validateMessageView(v: V) { - return validate(v, id, hashMessageView) -} - -export interface SystemMessageReferredUser { - $type?: 'chat.bsky.convo.defs#systemMessageReferredUser' - did: string -} - -const hashSystemMessageReferredUser = 'systemMessageReferredUser' - -export function isSystemMessageReferredUser(v: V) { - return is$typed(v, id, hashSystemMessageReferredUser) -} - -export function validateSystemMessageReferredUser(v: V) { - return validate( - v, - id, - hashSystemMessageReferredUser, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. */ -export interface SystemMessageView { - $type?: 'chat.bsky.convo.defs#systemMessageView' - id: string - rev: string - sentAt: string - data: - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashSystemMessageView = 'systemMessageView' - -export function isSystemMessageView(v: V) { - return is$typed(v, id, hashSystemMessageView) -} - -export function validateSystemMessageView(v: V) { - return validate(v, id, hashSystemMessageView) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was added to the group convo. */ -export interface SystemMessageDataAddMember { - $type?: 'chat.bsky.convo.defs#systemMessageDataAddMember' - member: SystemMessageReferredUser - role: ChatBskyActorDefs.MemberRole - addedBy: SystemMessageReferredUser -} - -const hashSystemMessageDataAddMember = 'systemMessageDataAddMember' - -export function isSystemMessageDataAddMember(v: V) { - return is$typed(v, id, hashSystemMessageDataAddMember) -} - -export function validateSystemMessageDataAddMember(v: V) { - return validate( - v, - id, - hashSystemMessageDataAddMember, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user was removed from the group convo. */ -export interface SystemMessageDataRemoveMember { - $type?: 'chat.bsky.convo.defs#systemMessageDataRemoveMember' - member: SystemMessageReferredUser - removedBy: SystemMessageReferredUser -} - -const hashSystemMessageDataRemoveMember = 'systemMessageDataRemoveMember' - -export function isSystemMessageDataRemoveMember(v: V) { - return is$typed(v, id, hashSystemMessageDataRemoveMember) -} - -export function validateSystemMessageDataRemoveMember(v: V) { - return validate( - v, - id, - hashSystemMessageDataRemoveMember, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user joined the group convo via join link. */ -export interface SystemMessageDataMemberJoin { - $type?: 'chat.bsky.convo.defs#systemMessageDataMemberJoin' - member: SystemMessageReferredUser - role: ChatBskyActorDefs.MemberRole - approvedBy?: SystemMessageReferredUser -} - -const hashSystemMessageDataMemberJoin = 'systemMessageDataMemberJoin' - -export function isSystemMessageDataMemberJoin(v: V) { - return is$typed(v, id, hashSystemMessageDataMemberJoin) -} - -export function validateSystemMessageDataMemberJoin(v: V) { - return validate( - v, - id, - hashSystemMessageDataMemberJoin, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating a user voluntarily left the group convo. */ -export interface SystemMessageDataMemberLeave { - $type?: 'chat.bsky.convo.defs#systemMessageDataMemberLeave' - member: SystemMessageReferredUser -} - -const hashSystemMessageDataMemberLeave = 'systemMessageDataMemberLeave' - -export function isSystemMessageDataMemberLeave(v: V) { - return is$typed(v, id, hashSystemMessageDataMemberLeave) -} - -export function validateSystemMessageDataMemberLeave(v: V) { - return validate( - v, - id, - hashSystemMessageDataMemberLeave, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked. */ -export interface SystemMessageDataLockConvo { - $type?: 'chat.bsky.convo.defs#systemMessageDataLockConvo' - lockedBy: SystemMessageReferredUser -} - -const hashSystemMessageDataLockConvo = 'systemMessageDataLockConvo' - -export function isSystemMessageDataLockConvo(v: V) { - return is$typed(v, id, hashSystemMessageDataLockConvo) -} - -export function validateSystemMessageDataLockConvo(v: V) { - return validate( - v, - id, - hashSystemMessageDataLockConvo, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was unlocked. */ -export interface SystemMessageDataUnlockConvo { - $type?: 'chat.bsky.convo.defs#systemMessageDataUnlockConvo' - unlockedBy: SystemMessageReferredUser -} - -const hashSystemMessageDataUnlockConvo = 'systemMessageDataUnlockConvo' - -export function isSystemMessageDataUnlockConvo(v: V) { - return is$typed(v, id, hashSystemMessageDataUnlockConvo) -} - -export function validateSystemMessageDataUnlockConvo(v: V) { - return validate( - v, - id, - hashSystemMessageDataUnlockConvo, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group convo was locked permanently. */ -export interface SystemMessageDataLockConvoPermanently { - $type?: 'chat.bsky.convo.defs#systemMessageDataLockConvoPermanently' - lockedBy: SystemMessageReferredUser -} - -const hashSystemMessageDataLockConvoPermanently = - 'systemMessageDataLockConvoPermanently' - -export function isSystemMessageDataLockConvoPermanently(v: V) { - return is$typed(v, id, hashSystemMessageDataLockConvoPermanently) -} - -export function validateSystemMessageDataLockConvoPermanently(v: V) { - return validate( - v, - id, - hashSystemMessageDataLockConvoPermanently, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group info was edited. */ -export interface SystemMessageDataEditGroup { - $type?: 'chat.bsky.convo.defs#systemMessageDataEditGroup' - /** Group name that was replaced. */ - oldName?: string - /** Group name that replaced the old. */ - newName?: string -} - -const hashSystemMessageDataEditGroup = 'systemMessageDataEditGroup' - -export function isSystemMessageDataEditGroup(v: V) { - return is$typed(v, id, hashSystemMessageDataEditGroup) -} - -export function validateSystemMessageDataEditGroup(v: V) { - return validate( - v, - id, - hashSystemMessageDataEditGroup, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was created. */ -export interface SystemMessageDataCreateJoinLink { - $type?: 'chat.bsky.convo.defs#systemMessageDataCreateJoinLink' -} - -const hashSystemMessageDataCreateJoinLink = 'systemMessageDataCreateJoinLink' - -export function isSystemMessageDataCreateJoinLink(v: V) { - return is$typed(v, id, hashSystemMessageDataCreateJoinLink) -} - -export function validateSystemMessageDataCreateJoinLink(v: V) { - return validate( - v, - id, - hashSystemMessageDataCreateJoinLink, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was edited. */ -export interface SystemMessageDataEditJoinLink { - $type?: 'chat.bsky.convo.defs#systemMessageDataEditJoinLink' -} - -const hashSystemMessageDataEditJoinLink = 'systemMessageDataEditJoinLink' - -export function isSystemMessageDataEditJoinLink(v: V) { - return is$typed(v, id, hashSystemMessageDataEditJoinLink) -} - -export function validateSystemMessageDataEditJoinLink(v: V) { - return validate( - v, - id, - hashSystemMessageDataEditJoinLink, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was enabled. */ -export interface SystemMessageDataEnableJoinLink { - $type?: 'chat.bsky.convo.defs#systemMessageDataEnableJoinLink' -} - -const hashSystemMessageDataEnableJoinLink = 'systemMessageDataEnableJoinLink' - -export function isSystemMessageDataEnableJoinLink(v: V) { - return is$typed(v, id, hashSystemMessageDataEnableJoinLink) -} - -export function validateSystemMessageDataEnableJoinLink(v: V) { - return validate( - v, - id, - hashSystemMessageDataEnableJoinLink, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. System message indicating the group join link was disabled. */ -export interface SystemMessageDataDisableJoinLink { - $type?: 'chat.bsky.convo.defs#systemMessageDataDisableJoinLink' -} - -const hashSystemMessageDataDisableJoinLink = 'systemMessageDataDisableJoinLink' - -export function isSystemMessageDataDisableJoinLink(v: V) { - return is$typed(v, id, hashSystemMessageDataDisableJoinLink) -} - -export function validateSystemMessageDataDisableJoinLink(v: V) { - return validate( - v, - id, - hashSystemMessageDataDisableJoinLink, - ) -} - -export interface DeletedMessageView { - $type?: 'chat.bsky.convo.defs#deletedMessageView' - id: string - rev: string - sender: MessageViewSender - sentAt: string -} - -const hashDeletedMessageView = 'deletedMessageView' - -export function isDeletedMessageView(v: V) { - return is$typed(v, id, hashDeletedMessageView) -} - -export function validateDeletedMessageView(v: V) { - return validate(v, id, hashDeletedMessageView) -} - -export interface MessageViewSender { - $type?: 'chat.bsky.convo.defs#messageViewSender' - did: string -} - -const hashMessageViewSender = 'messageViewSender' - -export function isMessageViewSender(v: V) { - return is$typed(v, id, hashMessageViewSender) -} - -export function validateMessageViewSender(v: V) { - return validate(v, id, hashMessageViewSender) -} - -export interface ReactionView { - $type?: 'chat.bsky.convo.defs#reactionView' - value: string - sender: ReactionViewSender - createdAt: string -} - -const hashReactionView = 'reactionView' - -export function isReactionView(v: V) { - return is$typed(v, id, hashReactionView) -} - -export function validateReactionView(v: V) { - return validate(v, id, hashReactionView) -} - -export interface ReactionViewSender { - $type?: 'chat.bsky.convo.defs#reactionViewSender' - did: string -} - -const hashReactionViewSender = 'reactionViewSender' - -export function isReactionViewSender(v: V) { - return is$typed(v, id, hashReactionViewSender) -} - -export function validateReactionViewSender(v: V) { - return validate(v, id, hashReactionViewSender) -} - -export interface MessageAndReactionView { - $type?: 'chat.bsky.convo.defs#messageAndReactionView' - message: MessageView - reaction: ReactionView -} - -const hashMessageAndReactionView = 'messageAndReactionView' - -export function isMessageAndReactionView(v: V) { - return is$typed(v, id, hashMessageAndReactionView) -} - -export function validateMessageAndReactionView(v: V) { - return validate(v, id, hashMessageAndReactionView) -} - -export interface ConvoView { - $type?: 'chat.bsky.convo.defs#convoView' - id: string - rev: string - /** Members of this conversation. For direct convos, it will be an immutable list of the 2 members. For group convos, it will a list of important members (the first few members, the viewer, the member who added the viewer, the member who sent the last message, the member who sent the last reaction), but will not contain the full list of members. Use chat.bsky.convo.getConvoMembers to list all members. */ - members: ChatBskyActorDefs.ProfileViewBasic[] - lastMessage?: - | $Typed - | $Typed - | $Typed - | { $type: string } - lastReaction?: $Typed | { $type: string } - muted: boolean - status?: ConvoStatus - unreadCount: number - kind?: $Typed | $Typed | { $type: string } -} - -const hashConvoView = 'convoView' - -export function isConvoView(v: V) { - return is$typed(v, id, hashConvoView) -} - -export function validateConvoView(v: V) { - return validate(v, id, hashConvoView) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. */ -export interface DirectConvo { - $type?: 'chat.bsky.convo.defs#directConvo' -} - -const hashDirectConvo = 'directConvo' - -export function isDirectConvo(v: V) { - return is$typed(v, id, hashDirectConvo) -} - -export function validateDirectConvo(v: V) { - return validate(v, id, hashDirectConvo) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. */ -export interface GroupConvo { - $type?: 'chat.bsky.convo.defs#groupConvo' - /** The display name of the group conversation. */ - name: string - /** The total number of members in the group conversation. */ - memberCount: number - createdAt: string - joinLink?: ChatBskyGroupDefs.JoinLinkView - lockStatus: ConvoLockStatus -} - -const hashGroupConvo = 'groupConvo' - -export function isGroupConvo(v: V) { - return is$typed(v, id, hashGroupConvo) -} - -export function validateGroupConvo(v: V) { - return validate(v, id, hashGroupConvo) -} - -/** Event indicating a convo containing the viewer was started. Can be direct or group. When a member is added to a group convo, they also get this event. */ -export interface LogBeginConvo { - $type?: 'chat.bsky.convo.defs#logBeginConvo' - rev: string - convoId: string -} - -const hashLogBeginConvo = 'logBeginConvo' - -export function isLogBeginConvo(v: V) { - return is$typed(v, id, hashLogBeginConvo) -} - -export function validateLogBeginConvo(v: V) { - return validate(v, id, hashLogBeginConvo) -} - -/** Event indicating the viewer accepted a convo, and it can be moved out of the request inbox. Can be direct or group. */ -export interface LogAcceptConvo { - $type?: 'chat.bsky.convo.defs#logAcceptConvo' - rev: string - convoId: string -} - -const hashLogAcceptConvo = 'logAcceptConvo' - -export function isLogAcceptConvo(v: V) { - return is$typed(v, id, hashLogAcceptConvo) -} - -export function validateLogAcceptConvo(v: V) { - return validate(v, id, hashLogAcceptConvo) -} - -/** Event indicating the viewer left a convo. Can be direct or group. */ -export interface LogLeaveConvo { - $type?: 'chat.bsky.convo.defs#logLeaveConvo' - rev: string - convoId: string -} - -const hashLogLeaveConvo = 'logLeaveConvo' - -export function isLogLeaveConvo(v: V) { - return is$typed(v, id, hashLogLeaveConvo) -} - -export function validateLogLeaveConvo(v: V) { - return validate(v, id, hashLogLeaveConvo) -} - -/** Event indicating the viewer muted a convo. Can be direct or group. */ -export interface LogMuteConvo { - $type?: 'chat.bsky.convo.defs#logMuteConvo' - rev: string - convoId: string -} - -const hashLogMuteConvo = 'logMuteConvo' - -export function isLogMuteConvo(v: V) { - return is$typed(v, id, hashLogMuteConvo) -} - -export function validateLogMuteConvo(v: V) { - return validate(v, id, hashLogMuteConvo) -} - -/** Event indicating the viewer unmuted a convo. Can be direct or group. */ -export interface LogUnmuteConvo { - $type?: 'chat.bsky.convo.defs#logUnmuteConvo' - rev: string - convoId: string -} - -const hashLogUnmuteConvo = 'logUnmuteConvo' - -export function isLogUnmuteConvo(v: V) { - return is$typed(v, id, hashLogUnmuteConvo) -} - -export function validateLogUnmuteConvo(v: V) { - return validate(v, id, hashLogUnmuteConvo) -} - -/** Event indicating a user-originated message was created. Is not emitted for system messages. */ -export interface LogCreateMessage { - $type?: 'chat.bsky.convo.defs#logCreateMessage' - rev: string - convoId: string - message: $Typed | $Typed | { $type: string } - /** Profiles referred to in the message view. This isn't required for compatibility, because it was added later, but should generally be present. */ - relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogCreateMessage = 'logCreateMessage' - -export function isLogCreateMessage(v: V) { - return is$typed(v, id, hashLogCreateMessage) -} - -export function validateLogCreateMessage(v: V) { - return validate(v, id, hashLogCreateMessage) -} - -/** Event indicating a user-originated message was deleted. Is not emitted for system messages. */ -export interface LogDeleteMessage { - $type?: 'chat.bsky.convo.defs#logDeleteMessage' - rev: string - convoId: string - message: $Typed | $Typed | { $type: string } -} - -const hashLogDeleteMessage = 'logDeleteMessage' - -export function isLogDeleteMessage(v: V) { - return is$typed(v, id, hashLogDeleteMessage) -} - -export function validateLogDeleteMessage(v: V) { - return validate(v, id, hashLogDeleteMessage) -} - -/** DEPRECATED: use logReadConvo instead. Event indicating a convo was read up to a certain message. */ -export interface LogReadMessage { - $type?: 'chat.bsky.convo.defs#logReadMessage' - rev: string - convoId: string - message: - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashLogReadMessage = 'logReadMessage' - -export function isLogReadMessage(v: V) { - return is$typed(v, id, hashLogReadMessage) -} - -export function validateLogReadMessage(v: V) { - return validate(v, id, hashLogReadMessage) -} - -/** Event indicating a reaction was added to a message. */ -export interface LogAddReaction { - $type?: 'chat.bsky.convo.defs#logAddReaction' - rev: string - convoId: string - message: $Typed | $Typed | { $type: string } - reaction: ReactionView - /** Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present. */ - relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogAddReaction = 'logAddReaction' - -export function isLogAddReaction(v: V) { - return is$typed(v, id, hashLogAddReaction) -} - -export function validateLogAddReaction(v: V) { - return validate(v, id, hashLogAddReaction) -} - -/** Event indicating a reaction was removed from a message. */ -export interface LogRemoveReaction { - $type?: 'chat.bsky.convo.defs#logRemoveReaction' - rev: string - convoId: string - message: $Typed | $Typed | { $type: string } - reaction: ReactionView - /** Profiles referred in the message and reaction views. This isn't required for compatibility, because it was added later, but should generally be present. */ - relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogRemoveReaction = 'logRemoveReaction' - -export function isLogRemoveReaction(v: V) { - return is$typed(v, id, hashLogRemoveReaction) -} - -export function validateLogRemoveReaction(v: V) { - return validate(v, id, hashLogRemoveReaction) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a convo was read up to a certain message. */ -export interface LogReadConvo { - $type?: 'chat.bsky.convo.defs#logReadConvo' - rev: string - convoId: string - message: - | $Typed - | $Typed - | $Typed - | { $type: string } -} - -const hashLogReadConvo = 'logReadConvo' - -export function isLogReadConvo(v: V) { - return is$typed(v, id, hashLogReadConvo) -} - -export function validateLogReadConvo(v: V) { - return validate(v, id, hashLogReadConvo) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was added to a group convo. The member who was added gets a logBeginConvo (to create the convo) but also a logAddMember (to show the system message as the first message the user sees). */ -export interface LogAddMember { - $type?: 'chat.bsky.convo.defs#logAddMember' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogAddMember = 'logAddMember' - -export function isLogAddMember(v: V) { - return is$typed(v, id, hashLogAddMember) -} - -export function validateLogAddMember(v: V) { - return validate(v, id, hashLogAddMember) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member was removed from a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logRemoveMember (because they already left, so can't see the system message). */ -export interface LogRemoveMember { - $type?: 'chat.bsky.convo.defs#logRemoveMember' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogRemoveMember = 'logRemoveMember' - -export function isLogRemoveMember(v: V) { - return is$typed(v, id, hashLogRemoveMember) -} - -export function validateLogRemoveMember(v: V) { - return validate(v, id, hashLogRemoveMember) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member joined a group convo via join link. The member who was added gets a logBeginConvo (to create the convo) but also a logMemberJoin (to show the system message as the first message the user sees). */ -export interface LogMemberJoin { - $type?: 'chat.bsky.convo.defs#logMemberJoin' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogMemberJoin = 'logMemberJoin' - -export function isLogMemberJoin(v: V) { - return is$typed(v, id, hashLogMemberJoin) -} - -export function validateLogMemberJoin(v: V) { - return validate(v, id, hashLogMemberJoin) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a member voluntarily left a group convo. The member who was removed gets a logLeaveConvo (to leave the convo) but not a logMemberLeave (because they already left, so can't see the system message). */ -export interface LogMemberLeave { - $type?: 'chat.bsky.convo.defs#logMemberLeave' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogMemberLeave = 'logMemberLeave' - -export function isLogMemberLeave(v: V) { - return is$typed(v, id, hashLogMemberLeave) -} - -export function validateLogMemberLeave(v: V) { - return validate(v, id, hashLogMemberLeave) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked. */ -export interface LogLockConvo { - $type?: 'chat.bsky.convo.defs#logLockConvo' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogLockConvo = 'logLockConvo' - -export function isLogLockConvo(v: V) { - return is$typed(v, id, hashLogLockConvo) -} - -export function validateLogLockConvo(v: V) { - return validate(v, id, hashLogLockConvo) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was unlocked. */ -export interface LogUnlockConvo { - $type?: 'chat.bsky.convo.defs#logUnlockConvo' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogUnlockConvo = 'logUnlockConvo' - -export function isLogUnlockConvo(v: V) { - return is$typed(v, id, hashLogUnlockConvo) -} - -export function validateLogUnlockConvo(v: V) { - return validate(v, id, hashLogUnlockConvo) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a group convo was locked permanently. */ -export interface LogLockConvoPermanently { - $type?: 'chat.bsky.convo.defs#logLockConvoPermanently' - rev: string - convoId: string - message: SystemMessageView - /** Profiles referred in the system message. */ - relatedProfiles: ChatBskyActorDefs.ProfileViewBasic[] -} - -const hashLogLockConvoPermanently = 'logLockConvoPermanently' - -export function isLogLockConvoPermanently(v: V) { - return is$typed(v, id, hashLogLockConvoPermanently) -} - -export function validateLogLockConvoPermanently(v: V) { - return validate( - v, - id, - hashLogLockConvoPermanently, - ) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating info about group convo was edited. */ -export interface LogEditGroup { - $type?: 'chat.bsky.convo.defs#logEditGroup' - rev: string - convoId: string - message: SystemMessageView -} - -const hashLogEditGroup = 'logEditGroup' - -export function isLogEditGroup(v: V) { - return is$typed(v, id, hashLogEditGroup) -} - -export function validateLogEditGroup(v: V) { - return validate(v, id, hashLogEditGroup) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join link was created for a group convo. */ -export interface LogCreateJoinLink { - $type?: 'chat.bsky.convo.defs#logCreateJoinLink' - rev: string - convoId: string - message: SystemMessageView -} - -const hashLogCreateJoinLink = 'logCreateJoinLink' - -export function isLogCreateJoinLink(v: V) { - return is$typed(v, id, hashLogCreateJoinLink) -} - -export function validateLogCreateJoinLink(v: V) { - return validate(v, id, hashLogCreateJoinLink) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a settings about a join link for a group convo were edited. */ -export interface LogEditJoinLink { - $type?: 'chat.bsky.convo.defs#logEditJoinLink' - rev: string - convoId: string - message: SystemMessageView -} - -const hashLogEditJoinLink = 'logEditJoinLink' - -export function isLogEditJoinLink(v: V) { - return is$typed(v, id, hashLogEditJoinLink) -} - -export function validateLogEditJoinLink(v: V) { - return validate(v, id, hashLogEditJoinLink) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join link was enabled for a group convo. */ -export interface LogEnableJoinLink { - $type?: 'chat.bsky.convo.defs#logEnableJoinLink' - rev: string - convoId: string - message: SystemMessageView -} - -const hashLogEnableJoinLink = 'logEnableJoinLink' - -export function isLogEnableJoinLink(v: V) { - return is$typed(v, id, hashLogEnableJoinLink) -} - -export function validateLogEnableJoinLink(v: V) { - return validate(v, id, hashLogEnableJoinLink) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join link was disabled for a group convo. */ -export interface LogDisableJoinLink { - $type?: 'chat.bsky.convo.defs#logDisableJoinLink' - rev: string - convoId: string - message: SystemMessageView -} - -const hashLogDisableJoinLink = 'logDisableJoinLink' - -export function isLogDisableJoinLink(v: V) { - return is$typed(v, id, hashLogDisableJoinLink) -} - -export function validateLogDisableJoinLink(v: V) { - return validate(v, id, hashLogDisableJoinLink) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was made to a group the viewer owns. Only the owner gets this. */ -export interface LogIncomingJoinRequest { - $type?: 'chat.bsky.convo.defs#logIncomingJoinRequest' - rev: string - convoId: string - member: ChatBskyActorDefs.ProfileViewBasic -} - -const hashLogIncomingJoinRequest = 'logIncomingJoinRequest' - -export function isLogIncomingJoinRequest(v: V) { - return is$typed(v, id, hashLogIncomingJoinRequest) -} - -export function validateLogIncomingJoinRequest(v: V) { - return validate(v, id, hashLogIncomingJoinRequest) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was approved by the viewer. Only the owner gets this. The approved member gets a logBeginConvo. */ -export interface LogApproveJoinRequest { - $type?: 'chat.bsky.convo.defs#logApproveJoinRequest' - rev: string - convoId: string - member: ChatBskyActorDefs.ProfileViewBasic -} - -const hashLogApproveJoinRequest = 'logApproveJoinRequest' - -export function isLogApproveJoinRequest(v: V) { - return is$typed(v, id, hashLogApproveJoinRequest) -} - -export function validateLogApproveJoinRequest(v: V) { - return validate(v, id, hashLogApproveJoinRequest) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was rejected by the viewer. Only the owner gets this. */ -export interface LogRejectJoinRequest { - $type?: 'chat.bsky.convo.defs#logRejectJoinRequest' - rev: string - convoId: string - member: ChatBskyActorDefs.ProfileViewBasic -} - -const hashLogRejectJoinRequest = 'logRejectJoinRequest' - -export function isLogRejectJoinRequest(v: V) { - return is$typed(v, id, hashLogRejectJoinRequest) -} - -export function validateLogRejectJoinRequest(v: V) { - return validate(v, id, hashLogRejectJoinRequest) -} - -/** [NOTE: This is under active development and should be considered unstable while this note is here]. Event indicating a join request was made by the viewer. */ -export interface LogOutgoingJoinRequest { - $type?: 'chat.bsky.convo.defs#logOutgoingJoinRequest' - rev: string - convoId: string -} - -const hashLogOutgoingJoinRequest = 'logOutgoingJoinRequest' - -export function isLogOutgoingJoinRequest(v: V) { - return is$typed(v, id, hashLogOutgoingJoinRequest) -} - -export function validateLogOutgoingJoinRequest(v: V) { - return validate(v, id, hashLogOutgoingJoinRequest) -} diff --git a/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts b/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts deleted file mode 100644 index 0480447e83b..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/deleteMessageForSelf.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.deleteMessageForSelf' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - messageId: string -} - -export type OutputSchema = ChatBskyConvoDefs.DeletedMessageView - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class MessageDeleteNotAllowedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'MessageDeleteNotAllowed') - return new MessageDeleteNotAllowedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvo.ts b/packages/api/src/client/types/chat/bsky/convo/getConvo.ts deleted file mode 100644 index 0f6c42fe1cd..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/getConvo.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.getConvo' - -export type QueryParams = { - convoId: string -} -export type InputSchema = undefined - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts deleted file mode 100644 index a30eef353fb..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoAvailability.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.getConvoAvailability' - -export type QueryParams = { - members: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - canChat: boolean - convo?: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts deleted file mode 100644 index 96552e9fd3c..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoForMembers.ts +++ /dev/null @@ -1,80 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.getConvoForMembers' - -export type QueryParams = { - members: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class AccountSuspendedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class BlockedActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class MessagesDisabledError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class NotFollowedBySenderError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class RecipientNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'AccountSuspended') return new AccountSuspendedError(e) - if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'MessagesDisabled') return new MessagesDisabledError(e) - if (e.error === 'NotFollowedBySender') - return new NotFollowedBySenderError(e) - if (e.error === 'RecipientNotFound') return new RecipientNotFoundError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts b/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts deleted file mode 100644 index 1dbcc723e22..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/getConvoMembers.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.getConvoMembers' - -export type QueryParams = { - convoId: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - members: ChatBskyActorDefs.ProfileViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/getLog.ts b/packages/api/src/client/types/chat/bsky/convo/getLog.ts deleted file mode 100644 index 8eb2596422c..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/getLog.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.getLog' - -export type QueryParams = { - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - logs: ( - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts b/packages/api/src/client/types/chat/bsky/convo/getMessages.ts deleted file mode 100644 index 4853249caa7..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/getMessages.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' -import type * as ChatBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.getMessages' - -export type QueryParams = { - convoId: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - messages: ( - | $Typed - | $Typed - | $Typed - | { $type: string } - )[] - /** Set of all members who authored or reacted to the returned messages. Members referred to by system messages are also included. */ - relatedProfiles?: ChatBskyActorDefs.ProfileViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts b/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts deleted file mode 100644 index e443572c8bf..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/leaveConvo.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.leaveConvo' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - convoId: string - rev: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class OwnerCannotLeaveError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'OwnerCannotLeave') return new OwnerCannotLeaveError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts b/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts deleted file mode 100644 index 4a6599aace0..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/listConvoRequests.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' -import type * as ChatBskyGroupDefs from '../group/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.listConvoRequests' - -export type QueryParams = { - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - requests: ( - | $Typed - | $Typed - | { $type: string } - )[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts b/packages/api/src/client/types/chat/bsky/convo/listConvos.ts deleted file mode 100644 index 4579baf47f9..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/listConvos.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.listConvos' - -export type QueryParams = { - limit?: number - cursor?: string - readState?: 'unread' | (string & {}) - /** Filter convos by their status. It is discouraged to call with "request" and preferred to call chat.bsky.convo.listConvoRequests, which also includes group join requests made by the user. */ - status?: 'request' | 'accepted' | (string & {}) - /** Filter by conversation kind. */ - kind?: 'direct' | 'group' | (string & {}) - /** Filter by conversation lock status. Values follow chat.bsky.convo.defs#convoLockStatus. */ - lockStatus?: 'unlocked' | 'locked' | 'locked-permanently' | (string & {}) -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - convos: ChatBskyConvoDefs.ConvoView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts b/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts deleted file mode 100644 index 5bd7fb36742..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/lockConvo.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.lockConvo' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class ConvoLockedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'ConvoLocked') return new ConvoLockedError(e) - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts b/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts deleted file mode 100644 index 13c7d86dd83..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/muteConvo.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.muteConvo' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts b/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts deleted file mode 100644 index 16ec5b26183..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/removeReaction.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.removeReaction' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - messageId: string - value: string -} - -export interface OutputSchema { - message: ChatBskyConvoDefs.MessageView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionNotAllowedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionMessageDeletedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ReactionInvalidValueError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'ReactionNotAllowed') return new ReactionNotAllowedError(e) - if (e.error === 'ReactionMessageDeleted') - return new ReactionMessageDeletedError(e) - if (e.error === 'ReactionInvalidValue') - return new ReactionInvalidValueError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts b/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts deleted file mode 100644 index ddd10c7487a..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/sendMessage.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.sendMessage' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - message: ChatBskyConvoDefs.MessageInput -} - -export type OutputSchema = ChatBskyConvoDefs.MessageView - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class ConvoLockedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'ConvoLocked') return new ConvoLockedError(e) - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts b/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts deleted file mode 100644 index 4e35742818b..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/sendMessageBatch.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.sendMessageBatch' - -export type QueryParams = {} - -export interface InputSchema { - items: BatchItem[] -} - -export interface OutputSchema { - items: ChatBskyConvoDefs.MessageView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class ConvoLockedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'ConvoLocked') return new ConvoLockedError(e) - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} - -export interface BatchItem { - $type?: 'chat.bsky.convo.sendMessageBatch#batchItem' - convoId: string - message: ChatBskyConvoDefs.MessageInput -} - -const hashBatchItem = 'batchItem' - -export function isBatchItem(v: V) { - return is$typed(v, id, hashBatchItem) -} - -export function validateBatchItem(v: V) { - return validate(v, id, hashBatchItem) -} diff --git a/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts b/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts deleted file mode 100644 index 88aa1839dfc..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/unlockConvo.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.unlockConvo' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts b/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts deleted file mode 100644 index 5422217ed3e..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/unmuteConvo.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.unmuteConvo' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts b/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts deleted file mode 100644 index 76c44f33163..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/updateAllRead.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.updateAllRead' - -export type QueryParams = {} - -export interface InputSchema { - status?: 'request' | 'accepted' | (string & {}) -} - -export interface OutputSchema { - /** The count of updated convos. */ - updatedCount: number -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/convo/updateRead.ts b/packages/api/src/client/types/chat/bsky/convo/updateRead.ts deleted file mode 100644 index 966cf204c11..00000000000 --- a/packages/api/src/client/types/chat/bsky/convo/updateRead.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.convo.updateRead' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - messageId?: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/addMembers.ts b/packages/api/src/client/types/chat/bsky/group/addMembers.ts deleted file mode 100644 index c52beb35e53..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/addMembers.ts +++ /dev/null @@ -1,114 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' -import type * as ChatBskyActorDefs from '../actor/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.addMembers' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - members: string[] -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView - addedMembers?: ChatBskyActorDefs.ProfileViewBasic[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class AccountSuspendedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class BlockedActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class UserForbidsGroupsError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class ConvoLockedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class MemberLimitReachedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class NotFollowedBySenderError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class RecipientNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'AccountSuspended') return new AccountSuspendedError(e) - if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'UserForbidsGroups') return new UserForbidsGroupsError(e) - if (e.error === 'ConvoLocked') return new ConvoLockedError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'MemberLimitReached') return new MemberLimitReachedError(e) - if (e.error === 'NotFollowedBySender') - return new NotFollowedBySenderError(e) - if (e.error === 'RecipientNotFound') return new RecipientNotFoundError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts b/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts deleted file mode 100644 index 2a6ff6925ac..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/approveJoinRequest.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.approveJoinRequest' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - member: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class MemberLimitReachedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - if (e.error === 'MemberLimitReached') return new MemberLimitReachedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/createGroup.ts b/packages/api/src/client/types/chat/bsky/group/createGroup.ts deleted file mode 100644 index f1e3220e670..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/createGroup.ts +++ /dev/null @@ -1,84 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.createGroup' - -export type QueryParams = {} - -export interface InputSchema { - members: string[] - name: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class AccountSuspendedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class BlockedActorError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class UserForbidsGroupsError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class NotFollowedBySenderError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class RecipientNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'AccountSuspended') return new AccountSuspendedError(e) - if (e.error === 'BlockedActor') return new BlockedActorError(e) - if (e.error === 'UserForbidsGroups') return new UserForbidsGroupsError(e) - if (e.error === 'NotFollowedBySender') - return new NotFollowedBySenderError(e) - if (e.error === 'RecipientNotFound') return new RecipientNotFoundError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts deleted file mode 100644 index 291a4002f77..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/createJoinLink.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyGroupDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.createJoinLink' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - requireApproval?: boolean - joinRule: ChatBskyGroupDefs.JoinRule -} - -export interface OutputSchema { - joinLink: ChatBskyGroupDefs.JoinLinkView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class EnabledJoinLinkAlreadyExistsError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'EnabledJoinLinkAlreadyExists') - return new EnabledJoinLinkAlreadyExistsError(e) - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/defs.ts b/packages/api/src/client/types/chat/bsky/group/defs.ts deleted file mode 100644 index 720b8e37fd1..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/defs.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyActorDefs from '../actor/defs.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.defs' - -export type LinkEnabledStatus = 'enabled' | 'disabled' | (string & {}) -export type JoinRule = 'anyone' | 'followedByOwner' | (string & {}) - -export interface JoinLinkView { - $type?: 'chat.bsky.group.defs#joinLinkView' - code: string - enabledStatus: LinkEnabledStatus - requireApproval: boolean - joinRule: JoinRule - createdAt: string -} - -const hashJoinLinkView = 'joinLinkView' - -export function isJoinLinkView(v: V) { - return is$typed(v, id, hashJoinLinkView) -} - -export function validateJoinLinkView(v: V) { - return validate(v, id, hashJoinLinkView) -} - -export interface JoinLinkPreviewView { - $type?: 'chat.bsky.group.defs#joinLinkPreviewView' - name: string - owner: ChatBskyActorDefs.ProfileViewBasic - memberCount: number - requireApproval: boolean - convo?: ChatBskyConvoDefs.ConvoView -} - -const hashJoinLinkPreviewView = 'joinLinkPreviewView' - -export function isJoinLinkPreviewView(v: V) { - return is$typed(v, id, hashJoinLinkPreviewView) -} - -export function validateJoinLinkPreviewView(v: V) { - return validate(v, id, hashJoinLinkPreviewView) -} - -export interface JoinRequestView { - $type?: 'chat.bsky.group.defs#joinRequestView' - convoId: string - requestedBy: ChatBskyActorDefs.ProfileViewBasic - requestedAt: string -} - -const hashJoinRequestView = 'joinRequestView' - -export function isJoinRequestView(v: V) { - return is$typed(v, id, hashJoinRequestView) -} - -export function validateJoinRequestView(v: V) { - return validate(v, id, hashJoinRequestView) -} diff --git a/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts deleted file mode 100644 index 6c599316020..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/disableJoinLink.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyGroupDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.disableJoinLink' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - joinLink: ChatBskyGroupDefs.JoinLinkView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class NoJoinLinkError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - if (e.error === 'NoJoinLink') return new NoJoinLinkError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/editGroup.ts b/packages/api/src/client/types/chat/bsky/group/editGroup.ts deleted file mode 100644 index f7fd45f44d0..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/editGroup.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.editGroup' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - name: string -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class ConvoLockedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'ConvoLocked') return new ConvoLockedError(e) - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts deleted file mode 100644 index 7fa486f1b0d..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/editJoinLink.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyGroupDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.editJoinLink' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - requireApproval?: boolean - joinRule?: ChatBskyGroupDefs.JoinRule -} - -export interface OutputSchema { - joinLink: ChatBskyGroupDefs.JoinLinkView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class NoJoinLinkError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - if (e.error === 'NoJoinLink') return new NoJoinLinkError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts b/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts deleted file mode 100644 index 497998a0785..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/enableJoinLink.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyGroupDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.enableJoinLink' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string -} - -export interface OutputSchema { - joinLink: ChatBskyGroupDefs.JoinLinkView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class NoJoinLinkError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class LinkAlreadyEnabledError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - if (e.error === 'NoJoinLink') return new NoJoinLinkError(e) - if (e.error === 'LinkAlreadyEnabled') return new LinkAlreadyEnabledError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts b/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts deleted file mode 100644 index 9e52756cc26..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/getJoinLinkPreview.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyGroupDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.getJoinLinkPreview' - -export type QueryParams = { - code: string -} -export type InputSchema = undefined - -export interface OutputSchema { - joinLinkPreview: ChatBskyGroupDefs.JoinLinkPreviewView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidCodeError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidCode') return new InvalidCodeError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts b/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts deleted file mode 100644 index 57bbc45ffc8..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/listJoinRequests.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyGroupDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.listJoinRequests' - -export type QueryParams = { - convoId: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - requests: ChatBskyGroupDefs.JoinRequestView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts b/packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts deleted file mode 100644 index 14f5e9edb86..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/listMutualGroups.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.listMutualGroups' - -export type QueryParams = { - subject: string - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - convos: ChatBskyConvoDefs.ConvoView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts b/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts deleted file mode 100644 index 29283bc79bd..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/rejectJoinRequest.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.rejectJoinRequest' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - member: string -} - -export interface OutputSchema {} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/removeMembers.ts b/packages/api/src/client/types/chat/bsky/group/removeMembers.ts deleted file mode 100644 index cfcc857ad72..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/removeMembers.ts +++ /dev/null @@ -1,62 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.removeMembers' - -export type QueryParams = {} - -export interface InputSchema { - convoId: string - members: string[] -} - -export interface OutputSchema { - convo: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class InvalidConvoError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InsufficientRoleError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'InvalidConvo') return new InvalidConvoError(e) - if (e.error === 'InsufficientRole') return new InsufficientRoleError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/group/requestJoin.ts b/packages/api/src/client/types/chat/bsky/group/requestJoin.ts deleted file mode 100644 index 0d4c8cb7b91..00000000000 --- a/packages/api/src/client/types/chat/bsky/group/requestJoin.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.group.requestJoin' - -export type QueryParams = {} - -export interface InputSchema { - code: string -} - -export interface OutputSchema { - status: 'joined' | 'pending' | (string & {}) - convo?: ChatBskyConvoDefs.ConvoView -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class ConvoLockedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class FollowRequiredError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class InvalidCodeError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class LinkDisabledError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class MemberLimitReachedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class UserKickedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'ConvoLocked') return new ConvoLockedError(e) - if (e.error === 'FollowRequired') return new FollowRequiredError(e) - if (e.error === 'InvalidCode') return new InvalidCodeError(e) - if (e.error === 'LinkDisabled') return new LinkDisabledError(e) - if (e.error === 'MemberLimitReached') return new MemberLimitReachedError(e) - if (e.error === 'UserKicked') return new UserKickedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts b/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts deleted file mode 100644 index 06544716741..00000000000 --- a/packages/api/src/client/types/chat/bsky/moderation/getActorMetadata.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.moderation.getActorMetadata' - -export type QueryParams = { - actor: string -} -export type InputSchema = undefined - -export interface OutputSchema { - day: Metadata - month: Metadata - all: Metadata -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} - -export interface Metadata { - $type?: 'chat.bsky.moderation.getActorMetadata#metadata' - messagesSent: number - messagesReceived: number - convos: number - convosStarted: number -} - -const hashMetadata = 'metadata' - -export function isMetadata(v: V) { - return is$typed(v, id, hashMetadata) -} - -export function validateMetadata(v: V) { - return validate(v, id, hashMetadata) -} diff --git a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts b/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts deleted file mode 100644 index caad1cedf91..00000000000 --- a/packages/api/src/client/types/chat/bsky/moderation/getMessageContext.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ChatBskyConvoDefs from '../convo/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.moderation.getMessageContext' - -export type QueryParams = { - /** Conversation that the message is from. NOTE: this field will eventually be required. */ - convoId?: string - messageId: string - /** Number of user messages before the target to include. System messages between the earliest returned user message and the target are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages before the target, up to `maxInterleavedSystemMessages` system messages immediately preceding the target are returned instead. */ - before?: number - /** Number of user messages after the target to include. System messages between the target and the latest returned user message are also included, capped per gap by `maxInterleavedSystemMessages`. If there are no user messages after the target, up to `maxInterleavedSystemMessages` system messages immediately following the target are returned instead. */ - after?: number - /** Maximum number of system messages to include per gap between consecutive returned messages (and per side when there are no user messages on that side). Within a gap, the system messages closest to the earlier message are kept. */ - maxInterleavedSystemMessages?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - messages: ( - | $Typed - | $Typed - | { $type: string } - )[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts b/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts deleted file mode 100644 index c7cc77220a8..00000000000 --- a/packages/api/src/client/types/chat/bsky/moderation/subscribeModEvents.ts +++ /dev/null @@ -1,367 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.moderation.subscribeModEvents' - -/** Fired when the first message was sent on a convo. */ -export interface EventConvoFirstMessage { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventConvoFirstMessage' - convoId: string - createdAt: string - messageId?: string - /** The list of DIDs message recipients. Does not include the sender, which is in the `user` field */ - recipients: string[] - rev: string - /** The DID of the message author. */ - user: string -} - -const hashEventConvoFirstMessage = 'eventConvoFirstMessage' - -export function isEventConvoFirstMessage(v: V) { - return is$typed(v, id, hashEventConvoFirstMessage) -} - -export function validateEventConvoFirstMessage(v: V) { - return validate(v, id, hashEventConvoFirstMessage) -} - -/** Fire when a group chat is created. */ -export interface EventGroupChatCreated { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatCreated' - /** The DID of the actor performing the action. For this event, same as ownerDid. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - /** The name set at creation time. */ - groupName: string - /** DIDs of everyone added at creation time. */ - initialMemberDids: string[] - /** The DID of the group chat owner. */ - ownerDid: string - rev: string -} - -const hashEventGroupChatCreated = 'eventGroupChatCreated' - -export function isEventGroupChatCreated(v: V) { - return is$typed(v, id, hashEventGroupChatCreated) -} - -export function validateEventGroupChatCreated(v: V) { - return validate(v, id, hashEventGroupChatCreated) -} - -/** Fired when a member is added to a group chat. Note that members are added in the 'request' state. */ -export interface EventGroupChatMemberAdded { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberAdded' - /** The DID of the actor performing the action. For this event, same as ownerDid. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - groupName: string - /** The DID of the group chat owner. */ - ownerDid: string - /** The number of members who have not yet accepted the convo. */ - requestMembersCount: number - rev: string - /** The DID of the member who was added. */ - subjectDid: string - /** Whether the added member follows the group owner. */ - subjectFollowsOwner: boolean -} - -const hashEventGroupChatMemberAdded = 'eventGroupChatMemberAdded' - -export function isEventGroupChatMemberAdded(v: V) { - return is$typed(v, id, hashEventGroupChatMemberAdded) -} - -export function validateEventGroupChatMemberAdded(v: V) { - return validate( - v, - id, - hashEventGroupChatMemberAdded, - ) -} - -/** Fired when a member joins a group chat via an join link that does not require approval. */ -export interface EventGroupChatMemberJoined { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberJoined' - /** The DID of the person joining. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - groupName: string - /** The code of the join link used to join. */ - joinLinkCode: string - /** The DID of the group chat owner. */ - ownerDid: string - rev: string - /** Whether the joining member follows the group owner. */ - subjectFollowsOwner: boolean -} - -const hashEventGroupChatMemberJoined = 'eventGroupChatMemberJoined' - -export function isEventGroupChatMemberJoined(v: V) { - return is$typed(v, id, hashEventGroupChatMemberJoined) -} - -export function validateEventGroupChatMemberJoined(v: V) { - return validate( - v, - id, - hashEventGroupChatMemberJoined, - ) -} - -/** Fired when a user requests to join a group chat via an join link that requires approval. */ -export interface EventGroupChatJoinRequest { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequest' - /** The DID of the person requesting to join. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - groupName: string - /** The code of the join link used to request joining. */ - joinLinkCode: string - /** The DID of the group chat owner. */ - ownerDid: string - rev: string - /** Whether the requesting member follows the group owner. */ - subjectFollowsOwner: boolean -} - -const hashEventGroupChatJoinRequest = 'eventGroupChatJoinRequest' - -export function isEventGroupChatJoinRequest(v: V) { - return is$typed(v, id, hashEventGroupChatJoinRequest) -} - -export function validateEventGroupChatJoinRequest(v: V) { - return validate( - v, - id, - hashEventGroupChatJoinRequest, - ) -} - -/** Fired when a join request is approved by the group owner. */ -export interface EventGroupChatJoinRequestApproved { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestApproved' - /** The DID of the owner approving the request. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - groupName: string - /** The DID of the group chat owner. */ - ownerDid: string - rev: string - /** The DID of the member whose request was approved. */ - subjectDid: string -} - -const hashEventGroupChatJoinRequestApproved = - 'eventGroupChatJoinRequestApproved' - -export function isEventGroupChatJoinRequestApproved(v: V) { - return is$typed(v, id, hashEventGroupChatJoinRequestApproved) -} - -export function validateEventGroupChatJoinRequestApproved(v: V) { - return validate( - v, - id, - hashEventGroupChatJoinRequestApproved, - ) -} - -/** Fired when a join request is rejected by the group owner. */ -export interface EventGroupChatJoinRequestRejected { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatJoinRequestRejected' - /** The DID of the owner rejecting the request. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - groupName: string - /** The DID of the group chat owner. */ - ownerDid: string - rev: string - /** The DID of the member whose request was rejected. */ - subjectDid: string -} - -const hashEventGroupChatJoinRequestRejected = - 'eventGroupChatJoinRequestRejected' - -export function isEventGroupChatJoinRequestRejected(v: V) { - return is$typed(v, id, hashEventGroupChatJoinRequestRejected) -} - -export function validateEventGroupChatJoinRequestRejected(v: V) { - return validate( - v, - id, - hashEventGroupChatJoinRequestRejected, - ) -} - -/** Fired when a user accepts a chat convo, either explicitly or by sending a message. */ -export interface EventChatAccepted { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventChatAccepted' - /** The DID of the person accepting the convo. */ - actorDid: string - /** When the convo was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. Only present for group convos. */ - groupMemberCount?: number - /** The name of the group chat. Only present for group convos. */ - groupName?: string - /** How the convo was accepted. */ - method: 'explicit' | 'message' | (string & {}) - /** The DID of the group chat owner. Only present for group convos. */ - ownerDid?: string - rev: string -} - -const hashEventChatAccepted = 'eventChatAccepted' - -export function isEventChatAccepted(v: V) { - return is$typed(v, id, hashEventChatAccepted) -} - -export function validateEventChatAccepted(v: V) { - return validate(v, id, hashEventChatAccepted) -} - -/** Fired when a member leaves or is removed from a group chat. */ -export interface EventGroupChatMemberLeft { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatMemberLeft' - /** The DID of the actor. For voluntary: the person leaving. For kicked: the owner. */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - groupName: string - /** How the member left. */ - leaveMethod: 'voluntary' | 'kicked' | (string & {}) - /** The DID of the group chat owner. */ - ownerDid: string - rev: string - /** The DID of the member who left or was removed. */ - subjectDid: string -} - -const hashEventGroupChatMemberLeft = 'eventGroupChatMemberLeft' - -export function isEventGroupChatMemberLeft(v: V) { - return is$typed(v, id, hashEventGroupChatMemberLeft) -} - -export function validateEventGroupChatMemberLeft(v: V) { - return validate( - v, - id, - hashEventGroupChatMemberLeft, - ) -} - -/** Fired when a group chat's metadata or status changes. */ -export interface EventGroupChatUpdated { - $type?: 'chat.bsky.moderation.subscribeModEvents#eventGroupChatUpdated' - /** The DID of the actor performing the action (the owner). */ - actorDid: string - /** When the group was originally created. */ - convoCreatedAt: string - convoId: string - createdAt: string - /** Current member count at the time of the event. */ - groupMemberCount: number - /** Current group name. */ - groupName: string - /** The code of the join link. Only present when updateType is join-link-related. */ - joinLinkCode?: string - /** Whether the join link is restricted to followers of the owner. Only present when updateType is join-link-related. */ - joinLinkFollowersOnly?: boolean - /** Whether the join link requires owner approval to join. Only present when updateType is join-link-related. */ - joinLinkRequiresApproval?: boolean - /** Why the group was locked. Only present when updateType is 'locked'. */ - lockReason?: - | 'owner_action' - | 'owner_left' - | 'owner_deactivated' - | 'owner_deleted' - | 'owner_suspended' - | 'owner_taken_down' - | 'label_applied' - | (string & {}) - /** The new group name. Only present when updateType is 'name_changed'. */ - newName?: string - /** The previous group name. Only present when updateType is 'name_changed'. */ - oldName?: string - /** The DID of the group chat owner. */ - ownerDid: string - rev: string - /** What changed. */ - updateType: - | 'name_changed' - | 'locked' - | 'locked_permanently' - | 'unlocked' - | 'join_link_created' - | 'join_link_disabled' - | 'join_link_settings_changed' - | (string & {}) -} - -const hashEventGroupChatUpdated = 'eventGroupChatUpdated' - -export function isEventGroupChatUpdated(v: V) { - return is$typed(v, id, hashEventGroupChatUpdated) -} - -export function validateEventGroupChatUpdated(v: V) { - return validate(v, id, hashEventGroupChatUpdated) -} diff --git a/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts b/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts deleted file mode 100644 index 5ac17b656e4..00000000000 --- a/packages/api/src/client/types/chat/bsky/moderation/updateActorAccess.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'chat.bsky.moderation.updateActorAccess' - -export type QueryParams = {} - -export interface InputSchema { - actor: string - allowAccess: boolean - ref?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/defs.ts b/packages/api/src/client/types/com/atproto/admin/defs.ts deleted file mode 100644 index eb88e1d2fdd..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/defs.ts +++ /dev/null @@ -1,106 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoServerDefs from '../server/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.defs' - -export interface StatusAttr { - $type?: 'com.atproto.admin.defs#statusAttr' - applied: boolean - ref?: string -} - -const hashStatusAttr = 'statusAttr' - -export function isStatusAttr(v: V) { - return is$typed(v, id, hashStatusAttr) -} - -export function validateStatusAttr(v: V) { - return validate(v, id, hashStatusAttr) -} - -export interface AccountView { - $type?: 'com.atproto.admin.defs#accountView' - did: string - handle: string - email?: string - relatedRecords?: { [_ in string]: unknown }[] - indexedAt: string - invitedBy?: ComAtprotoServerDefs.InviteCode - invites?: ComAtprotoServerDefs.InviteCode[] - invitesDisabled?: boolean - emailConfirmedAt?: string - inviteNote?: string - deactivatedAt?: string - threatSignatures?: ThreatSignature[] -} - -const hashAccountView = 'accountView' - -export function isAccountView(v: V) { - return is$typed(v, id, hashAccountView) -} - -export function validateAccountView(v: V) { - return validate(v, id, hashAccountView) -} - -export interface RepoRef { - $type?: 'com.atproto.admin.defs#repoRef' - did: string -} - -const hashRepoRef = 'repoRef' - -export function isRepoRef(v: V) { - return is$typed(v, id, hashRepoRef) -} - -export function validateRepoRef(v: V) { - return validate(v, id, hashRepoRef) -} - -export interface RepoBlobRef { - $type?: 'com.atproto.admin.defs#repoBlobRef' - did: string - cid: string - recordUri?: string -} - -const hashRepoBlobRef = 'repoBlobRef' - -export function isRepoBlobRef(v: V) { - return is$typed(v, id, hashRepoBlobRef) -} - -export function validateRepoBlobRef(v: V) { - return validate(v, id, hashRepoBlobRef) -} - -export interface ThreatSignature { - $type?: 'com.atproto.admin.defs#threatSignature' - property: string - value: string -} - -const hashThreatSignature = 'threatSignature' - -export function isThreatSignature(v: V) { - return is$typed(v, id, hashThreatSignature) -} - -export function validateThreatSignature(v: V) { - return validate(v, id, hashThreatSignature) -} diff --git a/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts b/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts deleted file mode 100644 index 6194d2ecbb2..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/deleteAccount.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.deleteAccount' - -export type QueryParams = {} - -export interface InputSchema { - did: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts b/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts deleted file mode 100644 index ec5261285e7..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/disableAccountInvites.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.disableAccountInvites' - -export type QueryParams = {} - -export interface InputSchema { - account: string - /** Optional reason for disabled invites. */ - note?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts b/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts deleted file mode 100644 index 0b2176d4fef..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/disableInviteCodes.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.disableInviteCodes' - -export type QueryParams = {} - -export interface InputSchema { - codes?: string[] - accounts?: string[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts b/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts deleted file mode 100644 index 739f20ca7d7..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/enableAccountInvites.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.enableAccountInvites' - -export type QueryParams = {} - -export interface InputSchema { - account: string - /** Optional reason for enabled invites. */ - note?: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts b/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts deleted file mode 100644 index 5a53e3564cf..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/getAccountInfo.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoAdminDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.getAccountInfo' - -export type QueryParams = { - did: string -} -export type InputSchema = undefined -export type OutputSchema = ComAtprotoAdminDefs.AccountView - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts b/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts deleted file mode 100644 index cf32c475857..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/getAccountInfos.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoAdminDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.getAccountInfos' - -export type QueryParams = { - dids: string[] -} -export type InputSchema = undefined - -export interface OutputSchema { - infos: ComAtprotoAdminDefs.AccountView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts b/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts deleted file mode 100644 index 45385ab9b87..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/getInviteCodes.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoServerDefs from '../server/defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.getInviteCodes' - -export type QueryParams = { - sort?: 'recent' | 'usage' | (string & {}) - limit?: number - cursor?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - codes: ComAtprotoServerDefs.InviteCode[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts b/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts deleted file mode 100644 index 0e2a0e99087..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/getSubjectStatus.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoAdminDefs from './defs.js' -import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.getSubjectStatus' - -export type QueryParams = { - did?: string - uri?: string - blob?: string -} -export type InputSchema = undefined - -export interface OutputSchema { - subject: - | $Typed - | $Typed - | $Typed - | { $type: string } - takedown?: ComAtprotoAdminDefs.StatusAttr - deactivated?: ComAtprotoAdminDefs.StatusAttr -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts b/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts deleted file mode 100644 index 1ce441bfb9c..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/searchAccounts.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoAdminDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.searchAccounts' - -export type QueryParams = { - email?: string - cursor?: string - limit?: number -} -export type InputSchema = undefined - -export interface OutputSchema { - cursor?: string - accounts: ComAtprotoAdminDefs.AccountView[] -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/sendEmail.ts b/packages/api/src/client/types/com/atproto/admin/sendEmail.ts deleted file mode 100644 index e93abed60d2..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/sendEmail.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.sendEmail' - -export type QueryParams = {} - -export interface InputSchema { - recipientDid: string - content: string - subject?: string - senderDid: string - /** Additional comment by the sender that won't be used in the email itself but helpful to provide more context for moderators/reviewers */ - comment?: string -} - -export interface OutputSchema { - sent: boolean -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts deleted file mode 100644 index 93a926bd915..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountEmail.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.updateAccountEmail' - -export type QueryParams = {} - -export interface InputSchema { - /** The handle or DID of the repo. */ - account: string - email: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts deleted file mode 100644 index 1ab8e4f70cf..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountHandle.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.updateAccountHandle' - -export type QueryParams = {} - -export interface InputSchema { - did: string - handle: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts deleted file mode 100644 index 1fbf2cf2f4c..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountPassword.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.updateAccountPassword' - -export type QueryParams = {} - -export interface InputSchema { - did: string - password: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts b/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts deleted file mode 100644 index 459c4a06ada..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/updateAccountSigningKey.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.updateAccountSigningKey' - -export type QueryParams = {} - -export interface InputSchema { - did: string - /** Did-key formatted public key */ - signingKey: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts b/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts deleted file mode 100644 index df65544850a..00000000000 --- a/packages/api/src/client/types/com/atproto/admin/updateSubjectStatus.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoAdminDefs from './defs.js' -import type * as ComAtprotoRepoStrongRef from '../repo/strongRef.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.admin.updateSubjectStatus' - -export type QueryParams = {} - -export interface InputSchema { - subject: - | $Typed - | $Typed - | $Typed - | { $type: string } - takedown?: ComAtprotoAdminDefs.StatusAttr - deactivated?: ComAtprotoAdminDefs.StatusAttr -} - -export interface OutputSchema { - subject: - | $Typed - | $Typed - | $Typed - | { $type: string } - takedown?: ComAtprotoAdminDefs.StatusAttr -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/defs.ts b/packages/api/src/client/types/com/atproto/identity/defs.ts deleted file mode 100644 index 7359624d13a..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/defs.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.defs' - -export interface IdentityInfo { - $type?: 'com.atproto.identity.defs#identityInfo' - did: string - /** The validated handle of the account; or 'handle.invalid' if the handle did not bi-directionally match the DID document. */ - handle: string - /** The complete DID document for the identity. */ - didDoc: { [_ in string]: unknown } -} - -const hashIdentityInfo = 'identityInfo' - -export function isIdentityInfo(v: V) { - return is$typed(v, id, hashIdentityInfo) -} - -export function validateIdentityInfo(v: V) { - return validate(v, id, hashIdentityInfo) -} diff --git a/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts b/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts deleted file mode 100644 index 53de7d11a00..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/getRecommendedDidCredentials.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.getRecommendedDidCredentials' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface OutputSchema { - /** Recommended rotation keys for PLC dids. Should be undefined (or ignored) for did:webs. */ - rotationKeys?: string[] - alsoKnownAs?: string[] - verificationMethods?: { [_ in string]: unknown } - services?: { [_ in string]: unknown } -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts b/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts deleted file mode 100644 index d0f2d628c0c..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/refreshIdentity.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoIdentityDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.refreshIdentity' - -export type QueryParams = {} - -export interface InputSchema { - identifier: string -} - -export type OutputSchema = ComAtprotoIdentityDefs.IdentityInfo - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class HandleNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidDeactivatedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'HandleNotFound') return new HandleNotFoundError(e) - if (e.error === 'DidNotFound') return new DidNotFoundError(e) - if (e.error === 'DidDeactivated') return new DidDeactivatedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts b/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts deleted file mode 100644 index e28bfd3d394..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/requestPlcOperationSignature.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.requestPlcOperationSignature' - -export type QueryParams = {} -export type InputSchema = undefined - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/resolveDid.ts b/packages/api/src/client/types/com/atproto/identity/resolveDid.ts deleted file mode 100644 index 2cead805559..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/resolveDid.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.resolveDid' - -export type QueryParams = { - /** DID to resolve. */ - did: string -} -export type InputSchema = undefined - -export interface OutputSchema { - /** The complete DID document for the identity. */ - didDoc: { [_ in string]: unknown } -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class DidNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidDeactivatedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'DidNotFound') return new DidNotFoundError(e) - if (e.error === 'DidDeactivated') return new DidDeactivatedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts b/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts deleted file mode 100644 index 1d2538f783d..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/resolveHandle.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.resolveHandle' - -export type QueryParams = { - /** The handle to resolve. */ - handle: string -} -export type InputSchema = undefined - -export interface OutputSchema { - did: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class HandleNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'HandleNotFound') return new HandleNotFoundError(e) - } - - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts b/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts deleted file mode 100644 index 20cf35ea065..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/resolveIdentity.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' -import type * as ComAtprotoIdentityDefs from './defs.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.resolveIdentity' - -export type QueryParams = { - /** Handle or DID to resolve. */ - identifier: string -} -export type InputSchema = undefined -export type OutputSchema = ComAtprotoIdentityDefs.IdentityInfo - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export class HandleNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidNotFoundError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export class DidDeactivatedError extends XRPCError { - constructor(src: XRPCError) { - super(src.status, src.error, src.message, src.headers, { cause: src }) - } -} - -export function toKnownErr(e: any) { - if (e instanceof XRPCError) { - if (e.error === 'HandleNotFound') return new HandleNotFoundError(e) - if (e.error === 'DidNotFound') return new DidNotFoundError(e) - if (e.error === 'DidDeactivated') return new DidDeactivatedError(e) - } - - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts b/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts deleted file mode 100644 index c23046d46af..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/signPlcOperation.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.signPlcOperation' - -export type QueryParams = {} - -export interface InputSchema { - /** A token received through com.atproto.identity.requestPlcOperationSignature */ - token?: string - rotationKeys?: string[] - alsoKnownAs?: string[] - verificationMethods?: { [_ in string]: unknown } - services?: { [_ in string]: unknown } -} - -export interface OutputSchema { - /** A signed DID PLC operation. */ - operation: { [_ in string]: unknown } -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap - data: OutputSchema -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts b/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts deleted file mode 100644 index 3a8e725e095..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/submitPlcOperation.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.submitPlcOperation' - -export type QueryParams = {} - -export interface InputSchema { - operation: { [_ in string]: unknown } -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/identity/updateHandle.ts b/packages/api/src/client/types/com/atproto/identity/updateHandle.ts deleted file mode 100644 index cfd0ba15612..00000000000 --- a/packages/api/src/client/types/com/atproto/identity/updateHandle.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { HeadersMap, XRPCError } from '@atproto/xrpc' -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.identity.updateHandle' - -export type QueryParams = {} - -export interface InputSchema { - /** The new handle. */ - handle: string -} - -export interface CallOptions { - signal?: AbortSignal - headers?: HeadersMap - qp?: QueryParams - encoding?: 'application/json' -} - -export interface Response { - success: boolean - headers: HeadersMap -} - -export function toKnownErr(e: any) { - return e -} diff --git a/packages/api/src/client/types/com/atproto/label/defs.ts b/packages/api/src/client/types/com/atproto/label/defs.ts deleted file mode 100644 index 53bf729e763..00000000000 --- a/packages/api/src/client/types/com/atproto/label/defs.ts +++ /dev/null @@ -1,143 +0,0 @@ -/** - * GENERATED CODE - DO NOT MODIFY - */ -import { type ValidationResult, BlobRef } from '@atproto/lexicon' -import { CID } from 'multiformats/cid' -import { validate as _validate } from '../../../../lexicons.js' -import { - type $Typed, - is$typed as _is$typed, - type OmitKey, -} from '../../../../util.js' - -const is$typed = _is$typed, - validate = _validate -const id = 'com.atproto.label.defs' - -/** Metadata tag on an atproto resource (eg, repo or record). */ -export interface Label { - $type?: 'com.atproto.label.defs#label' - /** The AT Protocol version of the label object. */ - ver?: number - /** DID of the actor who created this label. */ - src: string - /** AT URI of the record, repository (account), or other resource that this label applies to. */ - uri: string - /** Optionally, CID specifying the specific version of 'uri' resource this label applies to. */ - cid?: string - /** The short string name of the value or type of this label. */ - val: string - /** If true, this is a negation label, overwriting a previous label. */ - neg?: boolean - /** Timestamp when this label was created. */ - cts: string - /** Timestamp at which this label expires (no longer applies). */ - exp?: string - /** Signature of dag-cbor encoded label. */ - sig?: Uint8Array -} - -const hashLabel = 'label' - -export function isLabel(v: V) { - return is$typed(v, id, hashLabel) -} - -export function validateLabel(v: V) { - return validate