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.
- package/README.md +19 -31
- package/dist/{chunk-WKJEG4FE.js → chunk-THM4ACIE.js} +12 -4
- package/dist/chunk-THM4ACIE.js.map +1 -0
- package/dist/index.d.ts +409 -415
- package/dist/index.js +63 -29
- package/dist/index.js.map +1 -1
- package/dist/{jsx-runtime-COVsDskT.d.ts → jsx-runtime-Bdt1Dwzf.d.ts} +71 -71
- package/dist/jsx-runtime.d.ts +1 -1
- package/dist/jsx-runtime.js +1 -1
- package/docs/actions.mdx +98 -0
- package/docs/adapters/discord.mdx +217 -0
- package/docs/adapters/gchat.mdx +232 -0
- package/docs/adapters/github.mdx +225 -0
- package/docs/adapters/index.mdx +110 -0
- package/docs/adapters/linear.mdx +207 -0
- package/docs/adapters/meta.json +12 -0
- package/docs/adapters/slack.mdx +293 -0
- package/docs/adapters/teams.mdx +225 -0
- package/docs/api/cards.mdx +217 -0
- package/docs/api/channel.mdx +176 -0
- package/docs/api/chat.mdx +469 -0
- package/docs/api/index.mdx +29 -0
- package/docs/api/markdown.mdx +235 -0
- package/docs/api/message.mdx +163 -0
- package/docs/api/meta.json +14 -0
- package/docs/api/modals.mdx +222 -0
- package/docs/api/postable-message.mdx +166 -0
- package/docs/api/thread.mdx +186 -0
- package/docs/cards.mdx +213 -0
- package/docs/direct-messages.mdx +56 -0
- package/docs/emoji.mdx +77 -0
- package/docs/ephemeral-messages.mdx +77 -0
- package/docs/error-handling.mdx +147 -0
- package/docs/files.mdx +77 -0
- package/docs/getting-started.mdx +12 -0
- package/docs/guides/code-review-hono.mdx +248 -0
- package/docs/guides/discord-nuxt.mdx +237 -0
- package/docs/guides/meta.json +4 -0
- package/docs/guides/slack-nextjs.mdx +245 -0
- package/docs/index.mdx +92 -0
- package/docs/meta.json +20 -0
- package/docs/modals.mdx +208 -0
- package/docs/posting-messages.mdx +177 -0
- package/docs/slash-commands.mdx +110 -0
- package/docs/state/index.mdx +31 -0
- package/docs/state/ioredis.mdx +81 -0
- package/docs/state/memory.mdx +52 -0
- package/docs/state/meta.json +9 -0
- package/docs/state/redis.mdx +93 -0
- package/docs/streaming.mdx +99 -0
- package/docs/usage.mdx +338 -0
- package/package.json +10 -10
- 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-
|
|
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
|
|
107
|
+
return mdastToString(ast);
|
|
108
108
|
}
|
|
109
109
|
function markdownToPlainText(markdown) {
|
|
110
110
|
const ast = parseMarkdown(markdown);
|
|
111
|
-
return
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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., "
|
|
2149
|
+
* - Slack: `U...` (e.g., "U00FAKEUSER1")
|
|
2130
2150
|
* - Teams: `29:...` (e.g., "29:198PbJuw...")
|
|
2131
|
-
* - Google Chat: `users/...` (e.g., "users/
|
|
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)
|
|
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)
|
|
2241
|
+
if (adapter) {
|
|
2242
|
+
return adapter;
|
|
2243
|
+
}
|
|
2220
2244
|
}
|
|
2221
|
-
if (
|
|
2245
|
+
if (SLACK_USER_ID_REGEX.test(userId)) {
|
|
2222
2246
|
const adapter = this.adapters.get("slack");
|
|
2223
|
-
if (adapter)
|
|
2247
|
+
if (adapter) {
|
|
2248
|
+
return adapter;
|
|
2249
|
+
}
|
|
2224
2250
|
}
|
|
2225
|
-
if (
|
|
2251
|
+
if (DISCORD_SNOWFLAKE_REGEX.test(userId)) {
|
|
2226
2252
|
const adapter = this.adapters.get("discord");
|
|
2227
|
-
if (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
|
-
|
|
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)
|
|
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)
|
|
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)
|
|
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();
|