Skip to content

Readme

Syncopate SDK — TypeScript

Build bots for Syncopate with a decorator-based API.

import { Bot, OnEvent, Command, Message, Context } from '@syncopate/sdk';
class MyBot extends Bot {
@OnEvent('ready')
async onReady() {
console.log(`Logged in as ${this.user.displayName}`);
}
@OnEvent('messageCreate')
async onMessage(message: Message) {
if (message.author.bot) return;
await message.channel.send('Hello!');
}
@Command('ping')
async ping(ctx: Context) {
await ctx.reply('Pong!');
}
}
const bot = new MyBot({ token: 'bot_xxxx' });
bot.run();

Defined in: sdk/typescript/src/client.ts:58

Main entry point for building Syncopate bots.

Subclass Bot and use @OnEvent() and @Command() decorators to register event and command handlers.

import { Bot, OnEvent, Command, Message, Context } from '@syncopate/sdk';
class MyBot extends Bot {
@OnEvent('ready')
async onReady() {
console.log(`Logged in as ${this.user.displayName}`);
}
@OnEvent('messageCreate')
async onMessage(message: Message) {
if (message.author?.bot) return;
}
@Command('ping')
async ping(ctx: Context) {
await ctx.reply('Pong!');
}
}
const bot = new MyBot({ token: 'bot_xxx' });
bot.run();

new Bot(options): Bot

Defined in: sdk/typescript/src/client.ts:82

BotOptions

Bot

readonly channels: Map<string, Channel>

Defined in: sdk/typescript/src/client.ts:69

Channel cache: id → Channel

readonly commandPrefix: string

Defined in: sdk/typescript/src/client.ts:66

Command prefix (default: !).

readonly rest: RestClient

Defined in: sdk/typescript/src/client.ts:63

REST client for API calls.

user: User

Defined in: sdk/typescript/src/client.ts:60

The authenticated bot user. Available after ready event.

disconnect(): void

Defined in: sdk/typescript/src/client.ts:144

Disconnect the bot.

void

fetchUser(userId): Promise<User>

Defined in: sdk/typescript/src/client.ts:158

Fetch a specific user by ID.

string

Promise<User>

fetchWorkspaces(): Promise<Workspace[]>

Defined in: sdk/typescript/src/client.ts:152

Fetch all workspaces the bot is a member of.

Promise<Workspace[]>

getChannel(channelId): Promise<Channel>

Defined in: sdk/typescript/src/client.ts:164

Get a cached channel, or fetch it.

string

Promise<Channel>

run(): Promise<void>

Defined in: sdk/typescript/src/client.ts:99

Start the bot: authenticate, cache channels, connect to SSE.

This method blocks until the bot is disconnected.

Promise<void>


Defined in: sdk/typescript/src/models/channel.ts:8

Model representing a Syncopate channel.

new Channel(data): Channel

Defined in: sdk/typescript/src/models/channel.ts:20

ChannelData

Channel

_rest: RestClient | null = null

Defined in: sdk/typescript/src/models/channel.ts:18

Internal

readonly id: string

Defined in: sdk/typescript/src/models/channel.ts:9

readonly insertedAt: string

Defined in: sdk/typescript/src/models/channel.ts:14

readonly name: string | null

Defined in: sdk/typescript/src/models/channel.ts:11

readonly topic: string | null

Defined in: sdk/typescript/src/models/channel.ts:13

readonly type: string

Defined in: sdk/typescript/src/models/channel.ts:12

readonly updatedAt: string

Defined in: sdk/typescript/src/models/channel.ts:15

readonly workspaceId: string

Defined in: sdk/typescript/src/models/channel.ts:10

_bind(rest): this

Defined in: sdk/typescript/src/models/channel.ts:31

Internal

Inject the REST client for API calls.

RestClient

this

fetchMembers(): Promise<ChannelMemberData[]>

Defined in: sdk/typescript/src/models/channel.ts:78

Fetch members of this channel.

Promise<ChannelMemberData[]>

fetchMessages(options?): Promise<Message[]>

Defined in: sdk/typescript/src/models/channel.ts:60

Fetch messages from this channel.

number

number

number

Promise<Message[]>

fetchPresence(): Promise<string[]>

Defined in: sdk/typescript/src/models/channel.ts:87

Fetch online user IDs in this channel.

Promise<string[]>

send(content, options?): Promise<Message>

Defined in: sdk/typescript/src/models/channel.ts:37

Send a message to this channel.

string

string

string

string

Promise<Message>

toString(): string

Defined in: sdk/typescript/src/models/channel.ts:109

string

triggerTyping(): Promise<void>

Defined in: sdk/typescript/src/models/channel.ts:96

Send a typing indicator.

Promise<void>


Defined in: sdk/typescript/src/models/member.ts:6

Model representing a channel member.

new ChannelMember(data): ChannelMember

Defined in: sdk/typescript/src/models/member.ts:14

ChannelMemberData

ChannelMember

readonly channelId: string

Defined in: sdk/typescript/src/models/member.ts:8

readonly id: string

Defined in: sdk/typescript/src/models/member.ts:7

readonly insertedAt: string

Defined in: sdk/typescript/src/models/member.ts:12

readonly role: string

Defined in: sdk/typescript/src/models/member.ts:10

readonly user: User

Defined in: sdk/typescript/src/models/member.ts:11

readonly userId: string

Defined in: sdk/typescript/src/models/member.ts:9


Defined in: sdk/typescript/src/commands/context.ts:11

Command execution context.

Passed to @Command() handlers with the triggering message, parsed arguments, and convenience methods for replying.

new Context(options): Context

Defined in: sdk/typescript/src/commands/context.ts:30

string[]

User

Channel

string

Message

Context

readonly args: string[]

Defined in: sdk/typescript/src/commands/context.ts:25

Arguments after the command name, split by whitespace.

readonly author: User

Defined in: sdk/typescript/src/commands/context.ts:19

The user who invoked the command.

readonly channel: Channel

Defined in: sdk/typescript/src/commands/context.ts:16

The channel the command was invoked in.

readonly command: string

Defined in: sdk/typescript/src/commands/context.ts:22

The command name (without prefix).

readonly content: string

Defined in: sdk/typescript/src/commands/context.ts:28

The full raw content of the message.

readonly message: Message

Defined in: sdk/typescript/src/commands/context.ts:13

The message that triggered the command.

reply(content): Promise<Message>

Defined in: sdk/typescript/src/commands/context.ts:51

Reply to the triggering message (threaded).

string

Promise<Message>

send(content): Promise<Message>

Defined in: sdk/typescript/src/commands/context.ts:46

Send a message to the same channel.

string

Promise<Message>


Defined in: sdk/typescript/src/errors.ts:27

Raised when the SSE gateway connection fails.

new GatewayError(message): GatewayError

Defined in: sdk/typescript/src/errors.ts:28

string

GatewayError

SyncopateError.constructor

optional cause: unknown

Defined in: web/node_modules/typescript/lib/lib.es2022.error.d.ts:26

SyncopateError.cause

message: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1077

SyncopateError.message

name: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1076

SyncopateError.name

optional stack: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1078

SyncopateError.stack


Defined in: sdk/typescript/src/errors.ts:14

Raised when an HTTP request fails.

new HTTPError(status, body, message?): HTTPError

Defined in: sdk/typescript/src/errors.ts:18

number

unknown

string

HTTPError

SyncopateError.constructor

readonly body: unknown

Defined in: sdk/typescript/src/errors.ts:16

optional cause: unknown

Defined in: web/node_modules/typescript/lib/lib.es2022.error.d.ts:26

SyncopateError.cause

message: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1077

SyncopateError.message

name: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1076

SyncopateError.name

optional stack: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1078

SyncopateError.stack

readonly status: number

Defined in: sdk/typescript/src/errors.ts:15


Defined in: sdk/typescript/src/models/message.ts:8

Model representing a Syncopate message.

new Message(data): Message

Defined in: sdk/typescript/src/models/message.ts:28

MessageData

Message

_rest: RestClient | null = null

Defined in: sdk/typescript/src/models/message.ts:26

Internal

author: User | null = null

Defined in: sdk/typescript/src/models/message.ts:20

The author as a User object, if available from the event payload.

channel: Channel | null = null

Defined in: sdk/typescript/src/models/message.ts:23

The channel this message belongs to, if resolved.

readonly channelId: string

Defined in: sdk/typescript/src/models/message.ts:10

readonly content: string

Defined in: sdk/typescript/src/models/message.ts:12

readonly editedAt: string | null

Defined in: sdk/typescript/src/models/message.ts:16

readonly id: string

Defined in: sdk/typescript/src/models/message.ts:9

readonly insertedAt: string

Defined in: sdk/typescript/src/models/message.ts:17

readonly parentId: string | null

Defined in: sdk/typescript/src/models/message.ts:15

readonly sequence: number

Defined in: sdk/typescript/src/models/message.ts:14

readonly type: string

Defined in: sdk/typescript/src/models/message.ts:13

readonly userId: string

Defined in: sdk/typescript/src/models/message.ts:11

_bind(rest): this

Defined in: sdk/typescript/src/models/message.ts:46

Internal

Inject the REST client.

RestClient

this

delete(): Promise<void>

Defined in: sdk/typescript/src/models/message.ts:59

Delete this message.

Promise<void>

edit(content): Promise<Message>

Defined in: sdk/typescript/src/models/message.ts:52

Edit this message.

string

Promise<Message>

reply(content): Promise<Message>

Defined in: sdk/typescript/src/models/message.ts:65

Reply to this message (creates a threaded message).

string

Promise<Message>

toString(): string

Defined in: sdk/typescript/src/models/message.ts:80

string


Defined in: sdk/typescript/src/errors.ts:6

Base error for all SDK errors.

  • Error

new SyncopateError(message): SyncopateError

Defined in: sdk/typescript/src/errors.ts:7

string

SyncopateError

Error.constructor

optional cause: unknown

Defined in: web/node_modules/typescript/lib/lib.es2022.error.d.ts:26

Error.cause

message: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1077

Error.message

name: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1076

Error.name

optional stack: string

Defined in: web/node_modules/typescript/lib/lib.es5.d.ts:1078

Error.stack


Defined in: sdk/typescript/src/models/user.ts:4

Model representing a Syncopate user.

new User(data): User

Defined in: sdk/typescript/src/models/user.ts:10

UserData

User

readonly avatarUrl: string | null

Defined in: sdk/typescript/src/models/user.ts:7

readonly bot: boolean

Defined in: sdk/typescript/src/models/user.ts:8

readonly displayName: string | null

Defined in: sdk/typescript/src/models/user.ts:6

readonly id: string

Defined in: sdk/typescript/src/models/user.ts:5

get isBot(): boolean

Defined in: sdk/typescript/src/models/user.ts:18

Whether this is a bot user.

boolean

toString(): string

Defined in: sdk/typescript/src/models/user.ts:22

string


Defined in: sdk/typescript/src/models/workspace.ts:4

Model representing a Syncopate workspace.

new Workspace(data): Workspace

Defined in: sdk/typescript/src/models/workspace.ts:11

WorkspaceData

Workspace

readonly id: string

Defined in: sdk/typescript/src/models/workspace.ts:5

readonly insertedAt: string

Defined in: sdk/typescript/src/models/workspace.ts:8

readonly name: string

Defined in: sdk/typescript/src/models/workspace.ts:6

readonly slug: string

Defined in: sdk/typescript/src/models/workspace.ts:7

readonly updatedAt: string

Defined in: sdk/typescript/src/models/workspace.ts:9

toString(): string

Defined in: sdk/typescript/src/models/workspace.ts:19

string


Defined in: sdk/typescript/src/models/member.ts:37

Model representing a workspace member.

new WorkspaceMember(data): WorkspaceMember

Defined in: sdk/typescript/src/models/member.ts:44

WorkspaceMemberData

WorkspaceMember

readonly id: string

Defined in: sdk/typescript/src/models/member.ts:38

readonly insertedAt: string

Defined in: sdk/typescript/src/models/member.ts:42

readonly role: string

Defined in: sdk/typescript/src/models/member.ts:40

readonly user: User

Defined in: sdk/typescript/src/models/member.ts:41

readonly userId: string

Defined in: sdk/typescript/src/models/member.ts:39

Defined in: sdk/typescript/src/client.ts:16

Options for creating a Bot instance.

optional baseUrl: string

Defined in: sdk/typescript/src/client.ts:21

Base URL of the Syncopate API. Defaults to http://localhost:4000.

optional commandPrefix: string

Defined in: sdk/typescript/src/client.ts:24

Command prefix. Defaults to !.

token: string

Defined in: sdk/typescript/src/client.ts:18

The bot token (from Authorization: Bot <token>).


Defined in: sdk/typescript/src/models/events.ts:60

channelId: string

Defined in: sdk/typescript/src/models/events.ts:62

data: object

Defined in: sdk/typescript/src/models/events.ts:63

id: string

name: string | null

topic: string | null

type: string

workspace_id: string

type: "channelCreate"

Defined in: sdk/typescript/src/models/events.ts:61


Defined in: sdk/typescript/src/models/events.ts:78

channelId: string

Defined in: sdk/typescript/src/models/events.ts:80

data: object

Defined in: sdk/typescript/src/models/events.ts:81

channel_id: string

type: "channelDelete"

Defined in: sdk/typescript/src/models/events.ts:79


Defined in: sdk/typescript/src/models/events.ts:72

channelId: string

Defined in: sdk/typescript/src/models/events.ts:74

data: object

Defined in: sdk/typescript/src/models/events.ts:75

optional name: string

optional topic: string

optional type: string

type: "channelUpdate"

Defined in: sdk/typescript/src/models/events.ts:73


Defined in: sdk/typescript/src/models/events.ts:84

channelId: string

Defined in: sdk/typescript/src/models/events.ts:86

data: object

Defined in: sdk/typescript/src/models/events.ts:87

user_id: string

type: "memberJoin"

Defined in: sdk/typescript/src/models/events.ts:85


Defined in: sdk/typescript/src/models/events.ts:90

channelId: string

Defined in: sdk/typescript/src/models/events.ts:92

data: object

Defined in: sdk/typescript/src/models/events.ts:93

user_id: string

type: "memberLeave"

Defined in: sdk/typescript/src/models/events.ts:91


Defined in: sdk/typescript/src/models/events.ts:42

channelId: string

Defined in: sdk/typescript/src/models/events.ts:44

data: MessageData

Defined in: sdk/typescript/src/models/events.ts:45

type: "messageCreate"

Defined in: sdk/typescript/src/models/events.ts:43


Defined in: sdk/typescript/src/models/events.ts:54

channelId: string

Defined in: sdk/typescript/src/models/events.ts:56

data: object

Defined in: sdk/typescript/src/models/events.ts:57

message_id: string

type: "messageDelete"

Defined in: sdk/typescript/src/models/events.ts:55


Defined in: sdk/typescript/src/models/events.ts:48

channelId: string

Defined in: sdk/typescript/src/models/events.ts:50

data: MessageData

Defined in: sdk/typescript/src/models/events.ts:51

type: "messageUpdate"

Defined in: sdk/typescript/src/models/events.ts:49


Defined in: sdk/typescript/src/models/events.ts:96

channelId: string

Defined in: sdk/typescript/src/models/events.ts:98

data: object

Defined in: sdk/typescript/src/models/events.ts:99

user_id: string

type: "typingStart"

Defined in: sdk/typescript/src/models/events.ts:97

EventType = "ready" | "messageCreate" | "messageUpdate" | "messageDelete" | "channelCreate" | "channelUpdate" | "channelDelete" | "memberJoin" | "memberLeave" | "typingStart"

Defined in: sdk/typescript/src/models/events.ts:6

SSE event types emitted by the Syncopate backend.


SyncopateEvent = MessageCreatedEvent | MessageUpdatedEvent | MessageDeletedEvent | ChannelCreatedEvent | ChannelUpdatedEvent | ChannelDeletedEvent | MemberJoinedEvent | MemberLeftEvent | TypingStartEvent

Defined in: sdk/typescript/src/models/events.ts:103

Discriminated union of all event types.

Command(name, options?): (target, propertyKey, _descriptor) => void

Defined in: sdk/typescript/src/decorators/command.ts:34

Decorator that registers a method as a bot command handler.

Commands are triggered by messages matching the command prefix + name. Default prefix is !.

string

string

(target, propertyKey, _descriptor): void

unknown

string

PropertyDescriptor

void

class MyBot extends Bot {
@Command('ping')
async ping(ctx: Context) {
await ctx.reply('Pong!');
}
@Command('greet', { description: 'Greet someone' })
async greet(ctx: Context) {
const name = ctx.args[0] ?? 'world';
await ctx.reply(`Hello, ${name}!`);
}
}

OnEvent(event): (target, propertyKey, _descriptor) => void

Defined in: sdk/typescript/src/decorators/event.ts:31

Decorator that registers a method as an event handler.

EventType

(target, propertyKey, _descriptor): void

unknown

string

PropertyDescriptor

void

class MyBot extends Bot {
@OnEvent('messageCreate')
async onMessage(message: Message) {
// Handle message
}
@OnEvent('ready')
async onReady() {
console.log('Bot is ready!');
}
}