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.
- 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 +410 -415
- package/dist/index.js +65 -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 {
|
|
@@ -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)
|
|
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)
|
|
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., "
|
|
2151
|
+
* - Slack: `U...` (e.g., "U00FAKEUSER1")
|
|
2130
2152
|
* - Teams: `29:...` (e.g., "29:198PbJuw...")
|
|
2131
|
-
* - Google Chat: `users/...` (e.g., "users/
|
|
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)
|
|
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)
|
|
2243
|
+
if (adapter) {
|
|
2244
|
+
return adapter;
|
|
2245
|
+
}
|
|
2220
2246
|
}
|
|
2221
|
-
if (
|
|
2247
|
+
if (SLACK_USER_ID_REGEX.test(userId)) {
|
|
2222
2248
|
const adapter = this.adapters.get("slack");
|
|
2223
|
-
if (adapter)
|
|
2249
|
+
if (adapter) {
|
|
2250
|
+
return adapter;
|
|
2251
|
+
}
|
|
2224
2252
|
}
|
|
2225
|
-
if (
|
|
2253
|
+
if (DISCORD_SNOWFLAKE_REGEX.test(userId)) {
|
|
2226
2254
|
const adapter = this.adapters.get("discord");
|
|
2227
|
-
if (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
|
-
|
|
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)
|
|
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)
|
|
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)
|
|
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();
|