chat 4.13.0 → 4.13.2

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 +409 -415
  5. package/dist/index.js +63 -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 {
@@ -1242,8 +1255,9 @@ var ThreadImpl = class _ThreadImpl {
1242
1255
  let postable = newContent;
1243
1256
  if (isJSX(newContent)) {
1244
1257
  const card = toCardElement(newContent);
1245
- if (!card)
1258
+ if (!card) {
1246
1259
  throw new Error("Invalid JSX element: must be a Card element");
1260
+ }
1247
1261
  postable = card;
1248
1262
  }
1249
1263
  await adapter.editMessage(threadId, messageId, postable);
@@ -1312,6 +1326,8 @@ function extractMessageContent2(message) {
1312
1326
 
1313
1327
  // src/chat.ts
1314
1328
  var DEFAULT_LOCK_TTL_MS = 3e4;
1329
+ var SLACK_USER_ID_REGEX = /^U[A-Z0-9]+$/i;
1330
+ var DISCORD_SNOWFLAKE_REGEX = /^\d{17,19}$/;
1315
1331
  var DEDUPE_TTL_MS = 6e4;
1316
1332
  var MODAL_CONTEXT_TTL_MS = 24 * 60 * 60 * 1e3;
1317
1333
  var Chat = class {
@@ -1709,7 +1725,9 @@ var Chat = class {
1709
1725
  if (callbackIds.length === 0 || callbackIds.includes(event.callbackId)) {
1710
1726
  try {
1711
1727
  const response = await handler(fullEvent);
1712
- if (response) return response;
1728
+ if (response) {
1729
+ return response;
1730
+ }
1713
1731
  } catch (err) {
1714
1732
  this.logger.error("Modal submit handler error", {
1715
1733
  error: err,
@@ -2091,7 +2109,9 @@ var Chat = class {
2091
2109
  continue;
2092
2110
  }
2093
2111
  const matches = emojiFilter.some((filter) => {
2094
- if (filter === fullEvent.emoji) return true;
2112
+ if (filter === fullEvent.emoji) {
2113
+ return true;
2114
+ }
2095
2115
  const filterName = typeof filter === "string" ? filter : filter.name;
2096
2116
  return filterName === fullEvent.emoji.name || filterName === fullEvent.rawEmoji;
2097
2117
  });
@@ -2126,9 +2146,9 @@ var Chat = class {
2126
2146
  * Accepts either a user ID string or an Author object (from message.author or event.user).
2127
2147
  *
2128
2148
  * The adapter is automatically inferred from the userId format:
2129
- * - Slack: `U...` (e.g., "U03STHCA1JM")
2149
+ * - Slack: `U...` (e.g., "U00FAKEUSER1")
2130
2150
  * - Teams: `29:...` (e.g., "29:198PbJuw...")
2131
- * - Google Chat: `users/...` (e.g., "users/117994873354375860089")
2151
+ * - Google Chat: `users/...` (e.g., "users/100000000000000000001")
2132
2152
  * - Discord: numeric snowflake (e.g., "1033044521375764530")
2133
2153
  *
2134
2154
  * @param user - Platform-specific user ID string, or an Author object
@@ -2212,19 +2232,27 @@ var Chat = class {
2212
2232
  inferAdapterFromUserId(userId) {
2213
2233
  if (userId.startsWith("users/")) {
2214
2234
  const adapter = this.adapters.get("gchat");
2215
- if (adapter) return adapter;
2235
+ if (adapter) {
2236
+ return adapter;
2237
+ }
2216
2238
  }
2217
2239
  if (userId.startsWith("29:")) {
2218
2240
  const adapter = this.adapters.get("teams");
2219
- if (adapter) return adapter;
2241
+ if (adapter) {
2242
+ return adapter;
2243
+ }
2220
2244
  }
2221
- if (/^U[A-Z0-9]+$/i.test(userId)) {
2245
+ if (SLACK_USER_ID_REGEX.test(userId)) {
2222
2246
  const adapter = this.adapters.get("slack");
2223
- if (adapter) return adapter;
2247
+ if (adapter) {
2248
+ return adapter;
2249
+ }
2224
2250
  }
2225
- if (/^\d{17,19}$/.test(userId)) {
2251
+ if (DISCORD_SNOWFLAKE_REGEX.test(userId)) {
2226
2252
  const adapter = this.adapters.get("discord");
2227
- if (adapter) return adapter;
2253
+ if (adapter) {
2254
+ return adapter;
2255
+ }
2228
2256
  }
2229
2257
  throw new ChatError(
2230
2258
  `Cannot infer adapter from userId "${userId}". Expected format: Slack (U...), Teams (29:...), Google Chat (users/...), or Discord (numeric snowflake).`,
@@ -2343,7 +2371,7 @@ var Chat = class {
2343
2371
  this.logger.debug("Lock released", { threadId });
2344
2372
  }
2345
2373
  }
2346
- async createThread(adapter, threadId, initialMessage, isSubscribedContext = false) {
2374
+ createThread(adapter, threadId, initialMessage, isSubscribedContext = false) {
2347
2375
  const parts = threadId.split(":");
2348
2376
  const channelId = parts[1] || "";
2349
2377
  const isDM = adapter.isDM?.(threadId) ?? false;
@@ -2592,7 +2620,9 @@ var EmojiResolver = class {
2592
2620
  toSlack(emoji2) {
2593
2621
  const name = typeof emoji2 === "string" ? emoji2 : emoji2.name;
2594
2622
  const formats = this.emojiMap[name];
2595
- if (!formats) return name;
2623
+ if (!formats) {
2624
+ return name;
2625
+ }
2596
2626
  return Array.isArray(formats.slack) ? formats.slack[0] : formats.slack;
2597
2627
  }
2598
2628
  /**
@@ -2602,7 +2632,9 @@ var EmojiResolver = class {
2602
2632
  toGChat(emoji2) {
2603
2633
  const name = typeof emoji2 === "string" ? emoji2 : emoji2.name;
2604
2634
  const formats = this.emojiMap[name];
2605
- if (!formats) return name;
2635
+ if (!formats) {
2636
+ return name;
2637
+ }
2606
2638
  return Array.isArray(formats.gchat) ? formats.gchat[0] : formats.gchat;
2607
2639
  }
2608
2640
  /**
@@ -2618,7 +2650,9 @@ var EmojiResolver = class {
2618
2650
  matches(rawEmoji, normalized) {
2619
2651
  const name = typeof normalized === "string" ? normalized : normalized.name;
2620
2652
  const formats = this.emojiMap[name];
2621
- if (!formats) return rawEmoji === name;
2653
+ if (!formats) {
2654
+ return rawEmoji === name;
2655
+ }
2622
2656
  const slackFormats = Array.isArray(formats.slack) ? formats.slack : [formats.slack];
2623
2657
  const gchatFormats = Array.isArray(formats.gchat) ? formats.gchat : [formats.gchat];
2624
2658
  const cleanedRaw = rawEmoji.replace(/^:|:$/g, "").toLowerCase();