@hardlydifficult/chat 1.1.3 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,194 +13,188 @@ npm install @hardlydifficult/chat
13
13
  ```typescript
14
14
  import { createChatClient } from "@hardlydifficult/chat";
15
15
 
16
- // Uses DISCORD_TOKEN and DISCORD_GUILD_ID env vars
17
16
  const client = createChatClient({ type: "discord" });
17
+ const channel = await client.connect(channelId);
18
18
 
19
- // Or for Slack: uses SLACK_BOT_TOKEN and SLACK_APP_TOKEN env vars
20
- const client = createChatClient({ type: "slack" });
19
+ // Post messages
20
+ await channel.postMessage("Hello!");
21
21
 
22
- const channel = await client.connect(channelId);
22
+ // Listen for incoming messages
23
+ channel.onMessage((event) => {
24
+ console.log(`${event.author.username}: ${event.content}`);
25
+ });
26
+ ```
23
27
 
24
- await channel
25
- .postMessage("Vote: (1) Pizza, (2) Burgers, (3) Salad")
26
- .addReactions(["1️⃣", "2️⃣", "3️⃣"])
27
- .onReaction((event) => {
28
- console.log(`${event.user.username} voted ${event.emoji}`);
29
- });
28
+ ## Configuration
29
+
30
+ ```typescript
31
+ // Discord - env vars: DISCORD_TOKEN, DISCORD_GUILD_ID
32
+ createChatClient({ type: "discord" });
33
+ createChatClient({ type: "discord", token: "...", guildId: "..." });
34
+
35
+ // Slack - env vars: SLACK_BOT_TOKEN, SLACK_APP_TOKEN
36
+ createChatClient({ type: "slack" });
37
+ createChatClient({ type: "slack", token: "...", appToken: "..." });
30
38
  ```
31
39
 
32
- ## Rich Documents
40
+ ## Incoming Messages
33
41
 
34
- Post rich, formatted messages using the `@hardlydifficult/document-generator` package:
42
+ Subscribe to new messages in a channel. Returns an unsubscribe function.
35
43
 
36
44
  ```typescript
37
- import { Document } from '@hardlydifficult/document-generator';
38
- import { createChatClient } from '@hardlydifficult/chat';
45
+ const unsubscribe = channel.onMessage((event) => {
46
+ // event.id, event.content, event.author, event.channelId, event.timestamp
47
+ console.log(`${event.author.username}: ${event.content}`);
48
+ });
39
49
 
40
- const client = createChatClient({ type: 'slack' });
41
- const channel = await client.connect(channelId);
50
+ // Later: stop listening
51
+ unsubscribe();
52
+ ```
53
+
54
+ Messages from the bot itself are automatically filtered out.
55
+
56
+ ## Posting Messages
57
+
58
+ Content can be a string or a `Document` from `@hardlydifficult/document-generator`.
59
+
60
+ ```typescript
61
+ // Simple text
62
+ channel.postMessage("Hello!");
63
+
64
+ // Rich document (auto-converted to Discord Embed / Slack Block Kit)
65
+ import { Document } from "@hardlydifficult/document-generator";
42
66
 
43
67
  const report = new Document()
44
68
  .header("Daily Report")
45
69
  .text("Here are today's **highlights**:")
46
- .list(["Feature A completed", "Bug B fixed", "99.9% uptime"])
47
- .divider()
48
- .link("View dashboard", "https://example.com/dashboard")
49
- .context("Generated automatically");
70
+ .list(["Feature A completed", "Bug B fixed", "99.9% uptime"]);
50
71
 
51
- // Automatically converted to Slack Block Kit / Discord Embed
52
- await channel.postMessage(report);
72
+ channel.postMessage(report);
53
73
  ```
54
74
 
55
- ## Message Operations
75
+ ### File Attachments
56
76
 
57
- ### Update Messages
77
+ Send files as message attachments.
58
78
 
59
79
  ```typescript
60
- const msg = await channel.postMessage('Initial content');
61
- await msg.update('Updated content');
62
- await msg.update(new Document().header('New Header').text('New body'));
80
+ channel.postMessage("Here's the scan report", {
81
+ files: [
82
+ { content: Buffer.from(markdownContent), name: "report.md" },
83
+ { content: "plain text content", name: "notes.txt" },
84
+ ],
85
+ });
63
86
  ```
64
87
 
65
- ### Delete Messages
88
+ ## Message Operations
66
89
 
67
90
  ```typescript
68
- const msg = await channel.postMessage('Temporary message');
69
- await msg.delete();
70
- ```
71
-
72
- ### Thread Replies
91
+ const msg = await channel.postMessage("Hello");
73
92
 
74
- ```typescript
75
- const msg = await channel.postMessage('Main message');
76
- msg.postReply('This is a thread reply');
77
- msg.postReply(new Document().text('Rich reply with **formatting**'));
93
+ await msg.update("Updated content");
94
+ await msg.delete();
95
+ msg.postReply("Thread reply");
78
96
  ```
79
97
 
80
98
  ### Reactions
81
99
 
82
100
  ```typescript
83
- // Add reactions and listen for user votes (chainable)
84
101
  await channel
85
102
  .postMessage("Pick one")
86
- .addReactions(["👍", "👎", "🤷"])
103
+ .addReactions(["👍", "👎"])
87
104
  .onReaction((event) => {
88
105
  console.log(`${event.user.username} reacted with ${event.emoji}`);
89
106
  });
90
107
 
91
- // Or wait for reactions to be added before continuing
92
- const msg = await channel.postMessage("Loading...").wait();
93
- msg.addReactions(["✅"]);
94
- await msg.waitForReactions();
108
+ msg.offReaction(); // stop listening
95
109
  ```
96
110
 
97
- ## API Reference
111
+ ### Threads
98
112
 
99
- ### `createChatClient(config)`
113
+ Create a thread from an existing message.
100
114
 
101
115
  ```typescript
102
- // Discord - env vars: DISCORD_TOKEN, DISCORD_GUILD_ID
103
- createChatClient({ type: 'discord' });
104
- createChatClient({ type: 'discord', token: '...', guildId: '...' });
105
-
106
- // Slack - env vars: SLACK_BOT_TOKEN, SLACK_APP_TOKEN
107
- createChatClient({ type: 'slack' });
108
- createChatClient({ type: 'slack', token: '...', appToken: '...' });
116
+ const msg = await channel.postMessage("Starting a discussion");
117
+ const thread = await msg.startThread("Discussion Thread", {
118
+ autoArchiveDuration: 1440, // minutes
119
+ });
109
120
  ```
110
121
 
111
- ### `client.connect(channelId): Promise<Channel>`
112
-
113
- Connect to a channel.
114
-
115
- ### `channel.postMessage(content): Message`
116
-
117
- Post a message. Content can be a string or a Document.
122
+ > **Slack note:** Slack threads are implicit — calling `startThread()` returns the message's timestamp as the thread ID. Post replies with `msg.postReply()` to populate the thread.
118
123
 
119
- ### `message.addReactions(emojis): Message`
124
+ ## Typing Indicator
120
125
 
121
- Add reactions. Chainable and awaitable.
126
+ Show a "typing" indicator while processing.
122
127
 
123
- ### `message.postReply(content): Message`
124
-
125
- Post a reply in the message's thread.
126
-
127
- ### `message.update(content): Promise<void>`
128
+ ```typescript
129
+ await channel.sendTyping();
130
+ // ... do work ...
131
+ await channel.postMessage("Done!");
132
+ ```
128
133
 
129
- Update the message content.
134
+ > **Slack note:** Slack does not support bot typing indicators. `sendTyping()` is a no-op on Slack.
130
135
 
131
- ### `message.delete(): Promise<void>`
136
+ ## Bulk Operations
132
137
 
133
- Delete the message.
138
+ Delete messages and manage threads in bulk.
134
139
 
135
- ### `message.waitForReactions(): Promise<void>`
140
+ ```typescript
141
+ // Delete up to 100 recent messages
142
+ const deletedCount = await channel.bulkDelete(50);
143
+
144
+ // Get all threads (active and archived)
145
+ const threads = await channel.getThreads();
146
+ for (const thread of threads) {
147
+ console.log(thread.id);
148
+ }
149
+ ```
136
150
 
137
- Wait for all pending reactions to complete.
151
+ > **Slack note:** Slack has no bulk delete API — messages are deleted one-by-one. Some may fail if the bot lacks permission to delete others' messages. `getThreads()` scans recent channel history for messages with replies.
138
152
 
139
- ### `message.onReaction(callback): Message`
153
+ ## Connection Resilience
140
154
 
141
- Listen for reactions on this message. Chainable.
155
+ Both platforms auto-reconnect via their underlying libraries (discord.js and @slack/bolt). Register callbacks for observability.
142
156
 
143
157
  ```typescript
144
- channel
145
- .postMessage("Vote!")
146
- .addReactions(["👍", "👎"])
147
- .onReaction((event) => {
148
- // event.emoji, event.user.id, event.user.username,
149
- // event.messageId, event.channelId, event.timestamp
150
- });
151
- ```
158
+ const client = createChatClient({ type: "discord" });
152
159
 
153
- ### `message.offReaction(): void`
160
+ client.onDisconnect((reason) => {
161
+ console.log("Disconnected:", reason);
162
+ });
154
163
 
155
- Stop listening for reactions on this message.
164
+ client.onError((error) => {
165
+ console.error("Connection error:", error);
166
+ });
156
167
 
157
- ### `client.disconnect(): Promise<void>`
168
+ await client.disconnect(); // clean shutdown
169
+ ```
158
170
 
159
- Disconnect from the platform.
171
+ Both callbacks return an unsubscribe function.
160
172
 
161
173
  ## Platform Setup
162
174
 
163
175
  ### Discord
164
176
 
165
177
  1. Create bot at [Discord Developer Portal](https://discord.com/developers/applications)
166
- 2. Enable Gateway Intents: `GUILDS`, `GUILD_MESSAGES`, `GUILD_MESSAGE_REACTIONS`
167
- 3. Bot permissions: `Send Messages`, `Add Reactions`, `Read Message History`
178
+ 2. Enable Gateway Intents: `GUILDS`, `GUILD_MESSAGES`, `GUILD_MESSAGE_REACTIONS`, `MESSAGE_CONTENT`
179
+ 3. Bot permissions: `Send Messages`, `Add Reactions`, `Read Message History`, `Manage Messages` (for bulk delete), `Create Public Threads`, `Send Messages in Threads`
168
180
  4. Set `DISCORD_TOKEN` and `DISCORD_GUILD_ID` env vars
169
181
 
170
182
  ### Slack
171
183
 
172
184
  1. Create app at [Slack API](https://api.slack.com/apps)
173
185
  2. Enable Socket Mode, generate App Token
174
- 3. Bot scopes: `chat:write`, `chat:write.public`, `reactions:write`, `reactions:read`
175
- 4. Subscribe to: `reaction_added`
186
+ 3. Bot scopes: `chat:write`, `chat:write.public`, `reactions:write`, `reactions:read`, `channels:history`, `files:write`
187
+ 4. Subscribe to events: `reaction_added`, `message.channels`
176
188
  5. Set `SLACK_BOT_TOKEN` and `SLACK_APP_TOKEN` env vars
177
189
 
178
- ## Example: Interactive Poll
179
-
180
- ```typescript
181
- import { createChatClient } from "@hardlydifficult/chat";
182
- import { Document } from "@hardlydifficult/document-generator";
183
-
184
- const client = createChatClient({ type: "discord" });
185
- const channel = await client.connect(process.env.CHANNEL_ID);
186
-
187
- const options = ["Pizza", "Burgers", "Salad"];
188
- const emojis = ["1️⃣", "2️⃣", "3️⃣"];
189
- const votes: Record<string, string> = {};
190
-
191
- const pollDoc = new Document()
192
- .header("🗳️ Lunch Poll")
193
- .text("What should we order?")
194
- .list(options.map((o, i) => `${emojis[i]} ${o}`));
195
-
196
- await channel
197
- .postMessage(pollDoc)
198
- .addReactions(emojis)
199
- .onReaction((event) => {
200
- const choice = options[emojis.indexOf(event.emoji)];
201
- if (choice) {
202
- votes[event.user.id] = choice;
203
- console.log(`${event.user.username} voted for ${choice}`);
204
- }
205
- });
206
- ```
190
+ ## Platform Differences
191
+
192
+ | Feature | Discord | Slack |
193
+ |---|---|---|
194
+ | Incoming messages | Full support | Full support |
195
+ | Typing indicator | Full support | No-op (unsupported by Slack bot API) |
196
+ | File attachments | `AttachmentBuilder` | `filesUploadV2` |
197
+ | Thread creation | Creates named thread on message | Returns message timestamp (threads are implicit) |
198
+ | Bulk delete | Native `bulkDelete` API (fast) | One-by-one deletion (slower, may partially fail) |
199
+ | Get threads | `fetchActive` + `fetchArchived` | Scans channel history for threaded messages |
200
+ | Auto-reconnect | Handled by discord.js | Handled by `@slack/bolt` Socket Mode |
package/dist/Channel.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Platform, ReactionCallback, MessageData, MessageContent } from './types';
1
+ import type { Platform, ReactionCallback, MessageCallback, MessageData, MessageContent, FileAttachment, ThreadData, StartThreadOptions, DisconnectCallback, ErrorCallback } from './types';
2
2
  import { Message } from './Message';
3
3
  /**
4
4
  * Interface for platform-specific channel operations
@@ -6,13 +6,19 @@ import { Message } from './Message';
6
6
  export interface ChannelOperations {
7
7
  postMessage(channelId: string, content: MessageContent, options?: {
8
8
  threadTs?: string;
9
- unfurlLinks?: boolean;
10
- unfurlMedia?: boolean;
9
+ files?: FileAttachment[];
11
10
  }): Promise<MessageData>;
12
11
  updateMessage(messageId: string, channelId: string, content: MessageContent): Promise<void>;
13
12
  deleteMessage(messageId: string, channelId: string): Promise<void>;
14
13
  addReaction(messageId: string, channelId: string, emoji: string): Promise<void>;
15
14
  subscribeToReactions(channelId: string, callback: ReactionCallback): () => void;
15
+ subscribeToMessages(channelId: string, callback: MessageCallback): () => void;
16
+ sendTyping(channelId: string): Promise<void>;
17
+ startThread(messageId: string, channelId: string, name: string, options?: StartThreadOptions): Promise<ThreadData>;
18
+ bulkDelete(channelId: string, count: number): Promise<number>;
19
+ getThreads(channelId: string): Promise<ThreadData[]>;
20
+ onDisconnect(callback: DisconnectCallback): () => void;
21
+ onError(callback: ErrorCallback): () => void;
16
22
  }
17
23
  /**
18
24
  * Represents a connected channel with messaging capabilities
@@ -27,14 +33,13 @@ export declare class Channel {
27
33
  /**
28
34
  * Post a message to this channel
29
35
  * @param content - Message content (string or Document)
30
- * @param options - Optional message options (e.g., threadTs for threading, unfurl settings)
36
+ * @param options - Optional message options (e.g., threadTs for threading, files for attachments)
31
37
  * @returns Message object with chainable reaction methods
32
38
  */
33
39
  postMessage(content: MessageContent, options?: {
34
40
  threadTs?: string;
35
- unfurlLinks?: boolean;
36
- unfurlMedia?: boolean;
37
- }): Message;
41
+ files?: FileAttachment[];
42
+ }): Message & PromiseLike<Message>;
38
43
  /**
39
44
  * Emit a reaction event to registered message-specific callbacks
40
45
  */
@@ -48,6 +53,27 @@ export declare class Channel {
48
53
  * Create MessageOperations from ChannelOperations
49
54
  */
50
55
  private createMessageOperations;
56
+ /**
57
+ * Subscribe to incoming messages in this channel
58
+ * @param callback - Function called when a new message is received
59
+ * @returns Unsubscribe function
60
+ */
61
+ onMessage(callback: MessageCallback): () => void;
62
+ /**
63
+ * Send a typing indicator in this channel
64
+ */
65
+ sendTyping(): Promise<void>;
66
+ /**
67
+ * Bulk delete messages in this channel
68
+ * @param count - Number of recent messages to delete
69
+ * @returns Number of messages actually deleted
70
+ */
71
+ bulkDelete(count: number): Promise<number>;
72
+ /**
73
+ * Get all threads in this channel (active and archived)
74
+ * @returns Array of thread data
75
+ */
76
+ getThreads(): Promise<ThreadData[]>;
51
77
  /**
52
78
  * Disconnect from this channel (cleanup)
53
79
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../src/Channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,OAAO,EAA0B,MAAM,WAAW,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5E,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CACjF;AAED;;GAEG;AACH,qBAAa,OAAO;IAClB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAEnC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,wBAAwB,CAA4C;IAC5E,OAAO,CAAC,uBAAuB,CAA6B;gBAEhD,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB;IAWzE;;;;;OAKG;IACH,WAAW,CACT,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5E,OAAO;IAYV;;OAEG;YACW,YAAY;IAa1B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAgBnC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,UAAU,IAAI,IAAI;CAOnB"}
1
+ {"version":3,"file":"Channel.d.ts","sourceRoot":"","sources":["../src/Channel.ts"],"names":[],"mappings":"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"}
package/dist/Channel.js CHANGED
@@ -21,14 +21,13 @@ class Channel {
21
21
  /**
22
22
  * Post a message to this channel
23
23
  * @param content - Message content (string or Document)
24
- * @param options - Optional message options (e.g., threadTs for threading, unfurl settings)
24
+ * @param options - Optional message options (e.g., threadTs for threading, files for attachments)
25
25
  * @returns Message object with chainable reaction methods
26
26
  */
27
27
  postMessage(content, options) {
28
28
  const messagePromise = this.operations.postMessage(this.id, content, options);
29
29
  // Create a Message that will resolve once the post completes
30
- const pendingMessage = new PendingMessage(messagePromise, this.createMessageOperations(), this.platform);
31
- return pendingMessage;
30
+ return new PendingMessage(messagePromise, this.createMessageOperations(), this.platform);
32
31
  }
33
32
  /**
34
33
  * Emit a reaction event to registered message-specific callbacks
@@ -71,8 +70,38 @@ class Channel {
71
70
  deleteMessage: (messageId, channelId) => this.operations.deleteMessage(messageId, channelId),
72
71
  postReply: async (channelId, threadTs, content) => this.operations.postMessage(channelId, content, { threadTs }),
73
72
  subscribeToReactions: (messageId, callback) => this.subscribeToMessageReactions(messageId, callback),
73
+ startThread: (messageId, channelId, name, options) => this.operations.startThread(messageId, channelId, name, options),
74
74
  };
75
75
  }
76
+ /**
77
+ * Subscribe to incoming messages in this channel
78
+ * @param callback - Function called when a new message is received
79
+ * @returns Unsubscribe function
80
+ */
81
+ onMessage(callback) {
82
+ return this.operations.subscribeToMessages(this.id, callback);
83
+ }
84
+ /**
85
+ * Send a typing indicator in this channel
86
+ */
87
+ async sendTyping() {
88
+ await this.operations.sendTyping(this.id);
89
+ }
90
+ /**
91
+ * Bulk delete messages in this channel
92
+ * @param count - Number of recent messages to delete
93
+ * @returns Number of messages actually deleted
94
+ */
95
+ async bulkDelete(count) {
96
+ return this.operations.bulkDelete(this.id, count);
97
+ }
98
+ /**
99
+ * Get all threads in this channel (active and archived)
100
+ * @returns Array of thread data
101
+ */
102
+ async getThreads() {
103
+ return this.operations.getThreads(this.id);
104
+ }
76
105
  /**
77
106
  * Disconnect from this channel (cleanup)
78
107
  */
@@ -87,7 +116,11 @@ class Channel {
87
116
  exports.Channel = Channel;
88
117
  /**
89
118
  * A Message that is still being posted.
90
- * Use `.wait()` to await completion and handle errors.
119
+ * Implements PromiseLike so it can be directly awaited:
120
+ * const msg = await channel.postMessage('Hello');
121
+ *
122
+ * Also supports synchronous chaining before awaiting:
123
+ * await channel.postMessage('Vote!').addReactions(['👍', '👎']).onReaction(cb);
91
124
  */
92
125
  class PendingMessage extends Message_1.Message {
93
126
  postPromise;
@@ -110,7 +143,7 @@ class PendingMessage extends Message_1.Message {
110
143
  }
111
144
  })
112
145
  .catch(() => {
113
- // Errors handled via wait()
146
+ // Errors surfaced when awaited via then()
114
147
  });
115
148
  }
116
149
  /**
@@ -133,19 +166,16 @@ class PendingMessage extends Message_1.Message {
133
166
  return this;
134
167
  }
135
168
  /**
136
- * Wait for post to complete.
137
- * Throws if the post fails - allows callers to handle errors.
138
- *
139
- * @example
140
- * ```typescript
141
- * const msg = channel.postMessage('Hello');
142
- * await msg.wait(); // throws if post fails
143
- * console.log(msg.id); // now available
144
- * ```
169
+ * Makes PendingMessage directly awaitable.
170
+ * Resolves to a plain Message (not thenable) to prevent infinite await loops.
145
171
  */
146
- async wait() {
147
- await this.postPromise;
148
- return this;
172
+ then(onfulfilled, onrejected) {
173
+ const resolved = this.postPromise.then(async () => {
174
+ await this.pendingReactions;
175
+ // Return a plain Message (no then()) to stop await from recursing
176
+ return this.toSnapshot();
177
+ });
178
+ return resolved.then(onfulfilled, onrejected);
149
179
  }
150
180
  /**
151
181
  * Wait for post and all pending reactions to complete.
@@ -1 +1 @@
1
- {"version":3,"file":"Channel.js","sourceRoot":"","sources":["../src/Channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Channel.js","sourceRoot":"","sources":["../src/Channel.ts"],"names":[],"mappings":"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"}
package/dist/Message.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { MessageData, MessageContent, Platform, ReactionCallback } from './types';
1
+ import type { MessageData, MessageContent, Platform, ReactionCallback, ThreadData, StartThreadOptions } from './types';
2
2
  /**
3
3
  * Interface for the platform-specific reaction adder
4
4
  */
@@ -13,6 +13,7 @@ export interface MessageOperations extends ReactionAdder {
13
13
  deleteMessage(messageId: string, channelId: string): Promise<void>;
14
14
  postReply(channelId: string, threadTs: string, content: MessageContent): Promise<MessageData>;
15
15
  subscribeToReactions(messageId: string, callback: ReactionCallback): () => void;
16
+ startThread(messageId: string, channelId: string, name: string, options?: StartThreadOptions): Promise<ThreadData>;
16
17
  }
17
18
  /**
18
19
  * Represents a posted message with chainable reaction methods
@@ -25,6 +26,11 @@ export declare class Message {
25
26
  protected operations: MessageOperations;
26
27
  protected reactionUnsubscribers: (() => void)[];
27
28
  constructor(data: MessageData, operations: MessageOperations);
29
+ /**
30
+ * Create a plain Message snapshot, transferring reaction unsubscribers.
31
+ * Used by PendingMessage/ReplyMessage to resolve to a non-thenable Message.
32
+ */
33
+ protected toSnapshot(): Message;
28
34
  /**
29
35
  * Add multiple emoji reactions to this message
30
36
  * @param emojis - Array of emojis to add
@@ -56,7 +62,14 @@ export declare class Message {
56
62
  * @param content - Reply content (string or Document)
57
63
  * @returns ReplyMessage that can be awaited to handle success/failure
58
64
  */
59
- postReply(content: MessageContent): ReplyMessage;
65
+ postReply(content: MessageContent): Message & PromiseLike<Message>;
66
+ /**
67
+ * Create a thread from this message
68
+ * @param name - Thread name
69
+ * @param options - Optional thread options
70
+ * @returns Channel-like object for posting into the thread
71
+ */
72
+ startThread(name: string, options?: StartThreadOptions): Promise<ThreadData>;
60
73
  /**
61
74
  * Update this message's content
62
75
  * @param content - New content (string or Document)
@@ -80,9 +93,10 @@ export declare class Message {
80
93
  }
81
94
  /**
82
95
  * A reply message that is still being posted.
83
- * Use `.wait()` to await completion and handle errors.
96
+ * Implements PromiseLike so it can be directly awaited:
97
+ * const reply = await msg.postReply('text');
84
98
  */
85
- export declare class ReplyMessage extends Message {
99
+ export declare class ReplyMessage extends Message implements PromiseLike<Message> {
86
100
  private replyPromise;
87
101
  private deferredReactionCallbacks;
88
102
  constructor(replyPromise: Promise<MessageData>, operations: MessageOperations, platform: Platform);
@@ -95,17 +109,10 @@ export declare class ReplyMessage extends Message {
95
109
  */
96
110
  onReaction(callback: ReactionCallback): this;
97
111
  /**
98
- * Wait for reply to complete.
99
- * Throws if the reply fails - allows callers to handle errors.
100
- *
101
- * @example
102
- * ```typescript
103
- * const reply = msg.postReply('text');
104
- * await reply.wait(); // throws if reply fails
105
- * console.log(reply.id); // now available
106
- * ```
112
+ * Makes ReplyMessage directly awaitable.
113
+ * Resolves to a plain Message (not thenable) to prevent infinite await loops.
107
114
  */
108
- wait(): Promise<this>;
115
+ then<TResult1 = Message, TResult2 = never>(onfulfilled?: ((value: Message) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
109
116
  /**
110
117
  * Wait for reply and all pending reactions to complete.
111
118
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../src/Message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9F,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CACjF;AAED;;GAEG;AACH,qBAAa,OAAO;IAClB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAEnC,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAqB;IAC9D,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACxC,SAAS,CAAC,qBAAqB,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAM;gBAEzC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB;IAO5D;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IASpC;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAM5C;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;IAKhD;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B;;;;;;;;;OASG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGxC;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,OAAO;IACvC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,yBAAyB,CAA0B;gBAGzD,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,QAAQ;IAwBpB;;OAEG;IACM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAY7C;;OAEG;IACM,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAKrD;;;;;;;;;;OAUG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;OAEG;IACY,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIjD"}
1
+ {"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../src/Message.ts"],"names":[],"mappings":"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"}