chat 4.13.1 → 4.13.3

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.
Files changed (53) hide show
  1. package/README.md +19 -31
  2. package/dist/{chunk-WKJEG4FE.js → chunk-THM4ACIE.js} +12 -4
  3. package/dist/chunk-THM4ACIE.js.map +1 -0
  4. package/dist/index.d.ts +410 -415
  5. package/dist/index.js +65 -29
  6. package/dist/index.js.map +1 -1
  7. package/dist/{jsx-runtime-COVsDskT.d.ts → jsx-runtime-Bdt1Dwzf.d.ts} +71 -71
  8. package/dist/jsx-runtime.d.ts +1 -1
  9. package/dist/jsx-runtime.js +1 -1
  10. package/docs/actions.mdx +98 -0
  11. package/docs/adapters/discord.mdx +217 -0
  12. package/docs/adapters/gchat.mdx +232 -0
  13. package/docs/adapters/github.mdx +225 -0
  14. package/docs/adapters/index.mdx +110 -0
  15. package/docs/adapters/linear.mdx +207 -0
  16. package/docs/adapters/meta.json +12 -0
  17. package/docs/adapters/slack.mdx +293 -0
  18. package/docs/adapters/teams.mdx +225 -0
  19. package/docs/api/cards.mdx +217 -0
  20. package/docs/api/channel.mdx +176 -0
  21. package/docs/api/chat.mdx +469 -0
  22. package/docs/api/index.mdx +29 -0
  23. package/docs/api/markdown.mdx +235 -0
  24. package/docs/api/message.mdx +163 -0
  25. package/docs/api/meta.json +14 -0
  26. package/docs/api/modals.mdx +222 -0
  27. package/docs/api/postable-message.mdx +166 -0
  28. package/docs/api/thread.mdx +186 -0
  29. package/docs/cards.mdx +213 -0
  30. package/docs/direct-messages.mdx +56 -0
  31. package/docs/emoji.mdx +77 -0
  32. package/docs/ephemeral-messages.mdx +77 -0
  33. package/docs/error-handling.mdx +147 -0
  34. package/docs/files.mdx +77 -0
  35. package/docs/getting-started.mdx +12 -0
  36. package/docs/guides/code-review-hono.mdx +248 -0
  37. package/docs/guides/discord-nuxt.mdx +237 -0
  38. package/docs/guides/meta.json +4 -0
  39. package/docs/guides/slack-nextjs.mdx +245 -0
  40. package/docs/index.mdx +92 -0
  41. package/docs/meta.json +20 -0
  42. package/docs/modals.mdx +208 -0
  43. package/docs/posting-messages.mdx +177 -0
  44. package/docs/slash-commands.mdx +110 -0
  45. package/docs/state/index.mdx +31 -0
  46. package/docs/state/ioredis.mdx +81 -0
  47. package/docs/state/memory.mdx +52 -0
  48. package/docs/state/meta.json +9 -0
  49. package/docs/state/redis.mdx +93 -0
  50. package/docs/streaming.mdx +99 -0
  51. package/docs/usage.mdx +338 -0
  52. package/package.json +10 -10
  53. package/dist/chunk-WKJEG4FE.js.map +0 -1
package/dist/index.js CHANGED
@@ -22,7 +22,7 @@ import {
22
22
  isModalElement,
23
23
  toCardElement,
24
24
  toModalElement
25
- } from "./chunk-WKJEG4FE.js";
25
+ } from "./chunk-THM4ACIE.js";
26
26
 
27
27
  // src/channel.ts
28
28
  import { WORKFLOW_DESERIALIZE as WORKFLOW_DESERIALIZE2, WORKFLOW_SERIALIZE as WORKFLOW_SERIALIZE2 } from "@workflow/serde";
@@ -45,7 +45,7 @@ function hasChatSingleton() {
45
45
  }
46
46
 
47
47
  // src/markdown.ts
48
- import { toString } from "mdast-util-to-string";
48
+ import { toString as mdastToString } from "mdast-util-to-string";
49
49
  import remarkGfm from "remark-gfm";
50
50
  import remarkParse from "remark-parse";
51
51
  import remarkStringify from "remark-stringify";
@@ -104,17 +104,19 @@ function stringifyMarkdown(ast) {
104
104
  return processor.stringify(ast);
105
105
  }
106
106
  function toPlainText(ast) {
107
- return toString(ast);
107
+ return mdastToString(ast);
108
108
  }
109
109
  function markdownToPlainText(markdown) {
110
110
  const ast = parseMarkdown(markdown);
111
- return toString(ast);
111
+ return mdastToString(ast);
112
112
  }
113
113
  function walkAst(node, visitor) {
114
114
  if ("children" in node && Array.isArray(node.children)) {
115
115
  node.children = node.children.map((child) => {
116
116
  const result = visitor(child);
117
- if (result === null) return null;
117
+ if (result === null) {
118
+ return null;
119
+ }
118
120
  return walkAst(result, visitor);
119
121
  }).filter((n) => n !== null);
120
122
  }
@@ -382,18 +384,21 @@ var Message = class _Message {
382
384
 
383
385
  // src/errors.ts
384
386
  var ChatError = class extends Error {
387
+ code;
388
+ cause;
385
389
  constructor(message, code, cause) {
386
390
  super(message);
391
+ this.name = "ChatError";
387
392
  this.code = code;
388
393
  this.cause = cause;
389
- this.name = "ChatError";
390
394
  }
391
395
  };
392
396
  var RateLimitError = class extends ChatError {
397
+ retryAfterMs;
393
398
  constructor(message, retryAfterMs, cause) {
394
399
  super(message, "RATE_LIMITED", cause);
395
- this.retryAfterMs = retryAfterMs;
396
400
  this.name = "RateLimitError";
401
+ this.retryAfterMs = retryAfterMs;
397
402
  }
398
403
  };
399
404
  var LockError = class extends ChatError {
@@ -403,20 +408,22 @@ var LockError = class extends ChatError {
403
408
  }
404
409
  };
405
410
  var NotImplementedError = class extends ChatError {
411
+ feature;
406
412
  constructor(message, feature, cause) {
407
413
  super(message, "NOT_IMPLEMENTED", cause);
408
- this.feature = feature;
409
414
  this.name = "NotImplementedError";
415
+ this.feature = feature;
410
416
  }
411
417
  };
412
418
 
413
419
  // src/logger.ts
414
420
  var ConsoleLogger = class _ConsoleLogger {
421
+ prefix;
422
+ level;
415
423
  constructor(level = "info", prefix = "chat-sdk") {
416
424
  this.level = level;
417
425
  this.prefix = prefix;
418
426
  }
419
- prefix;
420
427
  shouldLog(level) {
421
428
  const levels = ["debug", "info", "warn", "error", "silent"];
422
429
  return levels.indexOf(level) >= levels.indexOf(this.level);
@@ -426,23 +433,27 @@ var ConsoleLogger = class _ConsoleLogger {
426
433
  }
427
434
  // eslint-disable-next-line no-console
428
435
  debug(message, ...args) {
429
- if (this.shouldLog("debug"))
436
+ if (this.shouldLog("debug")) {
430
437
  console.debug(`[${this.prefix}] ${message}`, ...args);
438
+ }
431
439
  }
432
440
  // eslint-disable-next-line no-console
433
441
  info(message, ...args) {
434
- if (this.shouldLog("info"))
442
+ if (this.shouldLog("info")) {
435
443
  console.info(`[${this.prefix}] ${message}`, ...args);
444
+ }
436
445
  }
437
446
  // eslint-disable-next-line no-console
438
447
  warn(message, ...args) {
439
- if (this.shouldLog("warn"))
448
+ if (this.shouldLog("warn")) {
440
449
  console.warn(`[${this.prefix}] ${message}`, ...args);
450
+ }
441
451
  }
442
452
  // eslint-disable-next-line no-console
443
453
  error(message, ...args) {
444
- if (this.shouldLog("error"))
454
+ if (this.shouldLog("error")) {
445
455
  console.error(`[${this.prefix}] ${message}`, ...args);
456
+ }
446
457
  }
447
458
  };
448
459
 
@@ -1062,7 +1073,9 @@ var ThreadImpl = class _ThreadImpl {
1062
1073
  let pendingEdit = null;
1063
1074
  let timerId = null;
1064
1075
  const doEditAndReschedule = async () => {
1065
- if (stopped) return;
1076
+ if (stopped) {
1077
+ return;
1078
+ }
1066
1079
  if (accumulated !== lastEditContent) {
1067
1080
  const content = accumulated;
1068
1081
  try {
@@ -1124,6 +1137,7 @@ var ThreadImpl = class _ThreadImpl {
1124
1137
  _type: "chat:Thread",
1125
1138
  id: this.id,
1126
1139
  channelId: this.channelId,
1140
+ currentMessage: this._currentMessage?.toJSON(),
1127
1141
  isDM: this.isDM,
1128
1142
  adapterName: this.adapter.name
1129
1143
  };
@@ -1147,6 +1161,7 @@ var ThreadImpl = class _ThreadImpl {
1147
1161
  id: json.id,
1148
1162
  adapterName: json.adapterName,
1149
1163
  channelId: json.channelId,
1164
+ currentMessage: json.currentMessage ? Message.fromJSON(json.currentMessage) : void 0,
1150
1165
  isDM: json.isDM
1151
1166
  });
1152
1167
  if (adapter) {
@@ -1242,8 +1257,9 @@ var ThreadImpl = class _ThreadImpl {
1242
1257
  let postable = newContent;
1243
1258
  if (isJSX(newContent)) {
1244
1259
  const card = toCardElement(newContent);
1245
- if (!card)
1260
+ if (!card) {
1246
1261
  throw new Error("Invalid JSX element: must be a Card element");
1262
+ }
1247
1263
  postable = card;
1248
1264
  }
1249
1265
  await adapter.editMessage(threadId, messageId, postable);
@@ -1312,6 +1328,8 @@ function extractMessageContent2(message) {
1312
1328
 
1313
1329
  // src/chat.ts
1314
1330
  var DEFAULT_LOCK_TTL_MS = 3e4;
1331
+ var SLACK_USER_ID_REGEX = /^U[A-Z0-9]+$/i;
1332
+ var DISCORD_SNOWFLAKE_REGEX = /^\d{17,19}$/;
1315
1333
  var DEDUPE_TTL_MS = 6e4;
1316
1334
  var MODAL_CONTEXT_TTL_MS = 24 * 60 * 60 * 1e3;
1317
1335
  var Chat = class {
@@ -1709,7 +1727,9 @@ var Chat = class {
1709
1727
  if (callbackIds.length === 0 || callbackIds.includes(event.callbackId)) {
1710
1728
  try {
1711
1729
  const response = await handler(fullEvent);
1712
- if (response) return response;
1730
+ if (response) {
1731
+ return response;
1732
+ }
1713
1733
  } catch (err) {
1714
1734
  this.logger.error("Modal submit handler error", {
1715
1735
  error: err,
@@ -2091,7 +2111,9 @@ var Chat = class {
2091
2111
  continue;
2092
2112
  }
2093
2113
  const matches = emojiFilter.some((filter) => {
2094
- if (filter === fullEvent.emoji) return true;
2114
+ if (filter === fullEvent.emoji) {
2115
+ return true;
2116
+ }
2095
2117
  const filterName = typeof filter === "string" ? filter : filter.name;
2096
2118
  return filterName === fullEvent.emoji.name || filterName === fullEvent.rawEmoji;
2097
2119
  });
@@ -2126,9 +2148,9 @@ var Chat = class {
2126
2148
  * Accepts either a user ID string or an Author object (from message.author or event.user).
2127
2149
  *
2128
2150
  * The adapter is automatically inferred from the userId format:
2129
- * - Slack: `U...` (e.g., "U03STHCA1JM")
2151
+ * - Slack: `U...` (e.g., "U00FAKEUSER1")
2130
2152
  * - Teams: `29:...` (e.g., "29:198PbJuw...")
2131
- * - Google Chat: `users/...` (e.g., "users/117994873354375860089")
2153
+ * - Google Chat: `users/...` (e.g., "users/100000000000000000001")
2132
2154
  * - Discord: numeric snowflake (e.g., "1033044521375764530")
2133
2155
  *
2134
2156
  * @param user - Platform-specific user ID string, or an Author object
@@ -2212,19 +2234,27 @@ var Chat = class {
2212
2234
  inferAdapterFromUserId(userId) {
2213
2235
  if (userId.startsWith("users/")) {
2214
2236
  const adapter = this.adapters.get("gchat");
2215
- if (adapter) return adapter;
2237
+ if (adapter) {
2238
+ return adapter;
2239
+ }
2216
2240
  }
2217
2241
  if (userId.startsWith("29:")) {
2218
2242
  const adapter = this.adapters.get("teams");
2219
- if (adapter) return adapter;
2243
+ if (adapter) {
2244
+ return adapter;
2245
+ }
2220
2246
  }
2221
- if (/^U[A-Z0-9]+$/i.test(userId)) {
2247
+ if (SLACK_USER_ID_REGEX.test(userId)) {
2222
2248
  const adapter = this.adapters.get("slack");
2223
- if (adapter) return adapter;
2249
+ if (adapter) {
2250
+ return adapter;
2251
+ }
2224
2252
  }
2225
- if (/^\d{17,19}$/.test(userId)) {
2253
+ if (DISCORD_SNOWFLAKE_REGEX.test(userId)) {
2226
2254
  const adapter = this.adapters.get("discord");
2227
- if (adapter) return adapter;
2255
+ if (adapter) {
2256
+ return adapter;
2257
+ }
2228
2258
  }
2229
2259
  throw new ChatError(
2230
2260
  `Cannot infer adapter from userId "${userId}". Expected format: Slack (U...), Teams (29:...), Google Chat (users/...), or Discord (numeric snowflake).`,
@@ -2343,7 +2373,7 @@ var Chat = class {
2343
2373
  this.logger.debug("Lock released", { threadId });
2344
2374
  }
2345
2375
  }
2346
- async createThread(adapter, threadId, initialMessage, isSubscribedContext = false) {
2376
+ createThread(adapter, threadId, initialMessage, isSubscribedContext = false) {
2347
2377
  const parts = threadId.split(":");
2348
2378
  const channelId = parts[1] || "";
2349
2379
  const isDM = adapter.isDM?.(threadId) ?? false;
@@ -2592,7 +2622,9 @@ var EmojiResolver = class {
2592
2622
  toSlack(emoji2) {
2593
2623
  const name = typeof emoji2 === "string" ? emoji2 : emoji2.name;
2594
2624
  const formats = this.emojiMap[name];
2595
- if (!formats) return name;
2625
+ if (!formats) {
2626
+ return name;
2627
+ }
2596
2628
  return Array.isArray(formats.slack) ? formats.slack[0] : formats.slack;
2597
2629
  }
2598
2630
  /**
@@ -2602,7 +2634,9 @@ var EmojiResolver = class {
2602
2634
  toGChat(emoji2) {
2603
2635
  const name = typeof emoji2 === "string" ? emoji2 : emoji2.name;
2604
2636
  const formats = this.emojiMap[name];
2605
- if (!formats) return name;
2637
+ if (!formats) {
2638
+ return name;
2639
+ }
2606
2640
  return Array.isArray(formats.gchat) ? formats.gchat[0] : formats.gchat;
2607
2641
  }
2608
2642
  /**
@@ -2618,7 +2652,9 @@ var EmojiResolver = class {
2618
2652
  matches(rawEmoji, normalized) {
2619
2653
  const name = typeof normalized === "string" ? normalized : normalized.name;
2620
2654
  const formats = this.emojiMap[name];
2621
- if (!formats) return rawEmoji === name;
2655
+ if (!formats) {
2656
+ return rawEmoji === name;
2657
+ }
2622
2658
  const slackFormats = Array.isArray(formats.slack) ? formats.slack : [formats.slack];
2623
2659
  const gchatFormats = Array.isArray(formats.gchat) ? formats.gchat : [formats.gchat];
2624
2660
  const cleanedRaw = rawEmoji.replace(/^:|:$/g, "").toLowerCase();