@chatman-media/channel-telegram 1.7.0 → 1.9.0

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.
@@ -50,7 +50,22 @@ export declare class TelegramClient {
50
50
  replyMarkup?: TgReplyMarkup;
51
51
  disableWebPagePreview?: boolean;
52
52
  replyToMessageId?: number;
53
+ /** Топик форум-группы (operator bot): сообщение уходит в конкретный тред. */
54
+ messageThreadId?: number;
53
55
  }): Promise<TgSendMessageResult>;
56
+ /**
57
+ * Создать топик в форум-группе (operator bot). Требует: группа = форум, бот —
58
+ * админ с правом Manage Topics. Возвращает message_thread_id топика, который
59
+ * мы сохраняем на диалоге и используем для маршрутизации карточек/ответов.
60
+ */
61
+ createForumTopic(input: {
62
+ chatId: number | string;
63
+ name: string;
64
+ iconColor?: number;
65
+ }): Promise<{
66
+ message_thread_id: number;
67
+ name: string;
68
+ }>;
54
69
  /**
55
70
  * Re-send a photo by file_id. Used by the operator-relay path: when the
56
71
  * operator uploads a photo to the ops chat as a reply to a lead card,
@@ -62,15 +77,19 @@ export declare class TelegramClient {
62
77
  chatId: number | string;
63
78
  photoFileId: string;
64
79
  caption?: string;
80
+ /** Топик форум-группы (operator bot): медиа уходит в конкретный тред. */
81
+ messageThreadId?: number;
65
82
  }): Promise<TgSendMessageResult>;
66
83
  sendVideo(input: {
67
84
  chatId: number | string;
68
85
  videoFileId: string;
69
86
  caption?: string;
87
+ messageThreadId?: number;
70
88
  }): Promise<TgSendMessageResult>;
71
89
  sendVideoNote(input: {
72
90
  chatId: number | string;
73
91
  videoNoteFileId: string;
92
+ messageThreadId?: number;
74
93
  }): Promise<TgSendMessageResult>;
75
94
  sendPhotoUpload(input: {
76
95
  chatId: number | string;
@@ -78,6 +97,7 @@ export declare class TelegramClient {
78
97
  filename: string;
79
98
  contentType?: string;
80
99
  caption?: string;
100
+ messageThreadId?: number;
81
101
  }): Promise<TgSendMessageResult>;
82
102
  sendVideoUpload(input: {
83
103
  chatId: number | string;
@@ -85,12 +105,14 @@ export declare class TelegramClient {
85
105
  filename: string;
86
106
  contentType?: string;
87
107
  caption?: string;
108
+ messageThreadId?: number;
88
109
  }): Promise<TgSendMessageResult>;
89
110
  sendVideoNoteUpload(input: {
90
111
  chatId: number | string;
91
112
  bytes: ArrayBuffer | Uint8Array;
92
113
  filename: string;
93
114
  contentType?: string;
115
+ messageThreadId?: number;
94
116
  }): Promise<TgSendMessageResult>;
95
117
  /**
96
118
  * Send a video from a local file on disk (not a Telegram `file_id`).
@@ -108,6 +130,7 @@ export declare class TelegramClient {
108
130
  chatId: number | string;
109
131
  documentFileId: string;
110
132
  caption?: string;
133
+ messageThreadId?: number;
111
134
  }): Promise<TgSendMessageResult>;
112
135
  sendDocumentUpload(input: {
113
136
  chatId: number | string;
@@ -115,6 +138,7 @@ export declare class TelegramClient {
115
138
  filename: string;
116
139
  contentType?: string;
117
140
  caption?: string;
141
+ messageThreadId?: number;
118
142
  }): Promise<TgSendMessageResult>;
119
143
  /**
120
144
  * Edit a message we previously sent (commonly the lead card after the
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bot-api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/bot-api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAEhC,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS;IAC7B,WAAW,EAAE,MAAM;gBAHnB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM;CAK7B;AAgBD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAE1B,IAAI,EAAE,qBAAqB;YAOzB,aAAa;YAuBb,IAAI;YAUJ,aAAa;IA8B3B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxC;;;;;;;;;;;;;OAaG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IASrD,WAAW,CAAC,KAAK,EAAE;QACjB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;QAC/C,WAAW,CAAC,EAAE,aAAa,CAAC;QAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,6EAA6E;QAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAahC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE;QACtB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAYxD;;;;;;OAMG;IACH,SAAS,CAAC,KAAK,EAAE;QACf,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,yEAAyE;QACzE,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUhC,SAAS,CAAC,KAAK,EAAE;QACf,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUhC,aAAa,CAAC,KAAK,EAAE;QACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAShC,eAAe,CAAC,KAAK,EAAE;QACrB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBhC,eAAe,CAAC,KAAK,EAAE;QACrB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBhC,mBAAmB,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAahC;;;;;;OAMG;IACH,cAAc,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAIhC,YAAY,CAAC,KAAK,EAAE;QAClB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUhC,kBAAkB,CAAC,KAAK,EAAE;QACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,KAAK,EAAE,WAAW,GAAG,UAAU,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBhC;;;;;;OAMG;IACH,eAAe,CAAC,KAAK,EAAE;QACrB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;QAC/C,WAAW,CAAC,EAAE,aAAa,CAAC;KAC7B,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAWvC;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnF;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjB,cAAc,CAAC,KAAK,EAAE;QACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,MAAM,EAAE,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,GAAG,iBAAiB,CAAC;KACzF,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjB,UAAU,CAAC,KAAK,EAAE;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,OAAO,CAAC,IAAI,CAAC;IASjB,aAAa,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,cAAc,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAA;KAAE,CAAC;CAGzE"}
@@ -11,6 +11,10 @@ export interface TgChat {
11
11
  type: "private" | "group" | "supergroup" | "channel";
12
12
  title?: string;
13
13
  username?: string;
14
+ /** true для супергрупп с включёнными топиками (форум). Telegram отдаёт это
15
+ * поле в `message.chat` — используется как opt-in сигнал «оператор-чат —
16
+ * форум» при /setup (#651): 1 топик на диалог. */
17
+ is_forum?: boolean;
14
18
  }
15
19
  /**
16
20
  * One frame of a Telegram photo upload. Telegram delivers an array of
@@ -73,6 +77,9 @@ export interface TgMessage {
73
77
  from?: TgUser;
74
78
  chat: TgChat;
75
79
  date: number;
80
+ /** Топик форум-группы, в котором пришло сообщение (для маршрутизации ответов
81
+ * оператора по диалогу: conversations.operator_thread_id). */
82
+ message_thread_id?: number;
76
83
  text?: string;
77
84
  /** Caption that can accompany media uploads (photo / video / document /
78
85
  * voice). Treated as the message's "text" by the persistence layer
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot-api/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bot-api/types.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -32637,8 +32637,19 @@ class TelegramClient {
32637
32637
  params.disable_web_page_preview = input.disableWebPagePreview;
32638
32638
  if (input.replyToMessageId !== undefined)
32639
32639
  params.reply_to_message_id = input.replyToMessageId;
32640
+ if (input.messageThreadId !== undefined)
32641
+ params.message_thread_id = input.messageThreadId;
32640
32642
  return this.call("sendMessage", params);
32641
32643
  }
32644
+ createForumTopic(input) {
32645
+ const params = {
32646
+ chat_id: input.chatId,
32647
+ name: input.name
32648
+ };
32649
+ if (input.iconColor !== undefined)
32650
+ params.icon_color = input.iconColor;
32651
+ return this.call("createForumTopic", params);
32652
+ }
32642
32653
  sendPhoto(input) {
32643
32654
  const params = {
32644
32655
  chat_id: input.chatId,
@@ -32646,6 +32657,8 @@ class TelegramClient {
32646
32657
  };
32647
32658
  if (input.caption)
32648
32659
  params.caption = input.caption;
32660
+ if (input.messageThreadId !== undefined)
32661
+ params.message_thread_id = input.messageThreadId;
32649
32662
  return this.call("sendPhoto", params);
32650
32663
  }
32651
32664
  sendVideo(input) {
@@ -32655,16 +32668,25 @@ class TelegramClient {
32655
32668
  };
32656
32669
  if (input.caption)
32657
32670
  params.caption = input.caption;
32671
+ if (input.messageThreadId !== undefined)
32672
+ params.message_thread_id = input.messageThreadId;
32658
32673
  return this.call("sendVideo", params);
32659
32674
  }
32660
32675
  sendVideoNote(input) {
32661
- return this.call("sendVideoNote", {
32676
+ const params = {
32662
32677
  chat_id: input.chatId,
32663
32678
  video_note: input.videoNoteFileId
32664
- });
32679
+ };
32680
+ if (input.messageThreadId !== undefined)
32681
+ params.message_thread_id = input.messageThreadId;
32682
+ return this.call("sendVideoNote", params);
32665
32683
  }
32666
32684
  sendPhotoUpload(input) {
32667
- return this.callMultipart("sendPhoto", { chat_id: input.chatId, caption: input.caption }, {
32685
+ return this.callMultipart("sendPhoto", {
32686
+ chat_id: input.chatId,
32687
+ caption: input.caption,
32688
+ message_thread_id: input.messageThreadId
32689
+ }, {
32668
32690
  field: "photo",
32669
32691
  bytes: input.bytes,
32670
32692
  filename: input.filename,
@@ -32672,7 +32694,11 @@ class TelegramClient {
32672
32694
  });
32673
32695
  }
32674
32696
  sendVideoUpload(input) {
32675
- return this.callMultipart("sendVideo", { chat_id: input.chatId, caption: input.caption }, {
32697
+ return this.callMultipart("sendVideo", {
32698
+ chat_id: input.chatId,
32699
+ caption: input.caption,
32700
+ message_thread_id: input.messageThreadId
32701
+ }, {
32676
32702
  field: "video",
32677
32703
  bytes: input.bytes,
32678
32704
  filename: input.filename,
@@ -32680,7 +32706,7 @@ class TelegramClient {
32680
32706
  });
32681
32707
  }
32682
32708
  sendVideoNoteUpload(input) {
32683
- return this.callMultipart("sendVideoNote", { chat_id: input.chatId }, {
32709
+ return this.callMultipart("sendVideoNote", { chat_id: input.chatId, message_thread_id: input.messageThreadId }, {
32684
32710
  field: "video_note",
32685
32711
  bytes: input.bytes,
32686
32712
  filename: input.filename,
@@ -32697,10 +32723,16 @@ class TelegramClient {
32697
32723
  };
32698
32724
  if (input.caption)
32699
32725
  params.caption = input.caption;
32726
+ if (input.messageThreadId !== undefined)
32727
+ params.message_thread_id = input.messageThreadId;
32700
32728
  return this.call("sendDocument", params);
32701
32729
  }
32702
32730
  sendDocumentUpload(input) {
32703
- return this.callMultipart("sendDocument", { chat_id: input.chatId, caption: input.caption }, {
32731
+ return this.callMultipart("sendDocument", {
32732
+ chat_id: input.chatId,
32733
+ caption: input.caption,
32734
+ message_thread_id: input.messageThreadId
32735
+ }, {
32704
32736
  field: "document",
32705
32737
  bytes: input.bytes,
32706
32738
  filename: input.filename,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chatman-media/channel-telegram",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "Telegram-каналы (BotAPI + MTProto userbot) как реализация ChannelAdapter из @chatman-media/channel-core.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -37,7 +37,7 @@
37
37
  "author": "Alexander Kireev",
38
38
  "license": "MIT",
39
39
  "dependencies": {
40
- "@chatman-media/channel-core": "1.2.0"
40
+ "@chatman-media/channel-core": "1.7.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "telegram": ">=2.26.0"
@@ -51,7 +51,7 @@
51
51
  "telegram": "^2.26.22"
52
52
  },
53
53
  "devDependencies": {
54
- "@biomejs/biome": "^2.4.16",
54
+ "@biomejs/biome": "^2.5.0",
55
55
  "@types/bun": "1.3.14",
56
56
  "typescript": "^6.0.3"
57
57
  },
@@ -153,6 +153,8 @@ export class TelegramClient {
153
153
  replyMarkup?: TgReplyMarkup;
154
154
  disableWebPagePreview?: boolean;
155
155
  replyToMessageId?: number;
156
+ /** Топик форум-группы (operator bot): сообщение уходит в конкретный тред. */
157
+ messageThreadId?: number;
156
158
  }): Promise<TgSendMessageResult> {
157
159
  const params: Record<string, unknown> = {
158
160
  chat_id: input.chatId,
@@ -162,9 +164,31 @@ export class TelegramClient {
162
164
  if (input.replyMarkup) params.reply_markup = input.replyMarkup;
163
165
  if (input.disableWebPagePreview) params.disable_web_page_preview = input.disableWebPagePreview;
164
166
  if (input.replyToMessageId !== undefined) params.reply_to_message_id = input.replyToMessageId;
167
+ if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
165
168
  return this.call<TgSendMessageResult>("sendMessage", params);
166
169
  }
167
170
 
171
+ /**
172
+ * Создать топик в форум-группе (operator bot). Требует: группа = форум, бот —
173
+ * админ с правом Manage Topics. Возвращает message_thread_id топика, который
174
+ * мы сохраняем на диалоге и используем для маршрутизации карточек/ответов.
175
+ */
176
+ createForumTopic(input: {
177
+ chatId: number | string;
178
+ name: string;
179
+ iconColor?: number;
180
+ }): Promise<{ message_thread_id: number; name: string }> {
181
+ const params: Record<string, unknown> = {
182
+ chat_id: input.chatId,
183
+ name: input.name,
184
+ };
185
+ if (input.iconColor !== undefined) params.icon_color = input.iconColor;
186
+ return this.call<{ message_thread_id: number; name: string }>(
187
+ "createForumTopic",
188
+ params,
189
+ );
190
+ }
191
+
168
192
  /**
169
193
  * Re-send a photo by file_id. Used by the operator-relay path: when the
170
194
  * operator uploads a photo to the ops chat as a reply to a lead card,
@@ -176,12 +200,15 @@ export class TelegramClient {
176
200
  chatId: number | string;
177
201
  photoFileId: string;
178
202
  caption?: string;
203
+ /** Топик форум-группы (operator bot): медиа уходит в конкретный тред. */
204
+ messageThreadId?: number;
179
205
  }): Promise<TgSendMessageResult> {
180
206
  const params: Record<string, unknown> = {
181
207
  chat_id: input.chatId,
182
208
  photo: input.photoFileId,
183
209
  };
184
210
  if (input.caption) params.caption = input.caption;
211
+ if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
185
212
  return this.call<TgSendMessageResult>("sendPhoto", params);
186
213
  }
187
214
 
@@ -189,23 +216,28 @@ export class TelegramClient {
189
216
  chatId: number | string;
190
217
  videoFileId: string;
191
218
  caption?: string;
219
+ messageThreadId?: number;
192
220
  }): Promise<TgSendMessageResult> {
193
221
  const params: Record<string, unknown> = {
194
222
  chat_id: input.chatId,
195
223
  video: input.videoFileId,
196
224
  };
197
225
  if (input.caption) params.caption = input.caption;
226
+ if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
198
227
  return this.call<TgSendMessageResult>("sendVideo", params);
199
228
  }
200
229
 
201
230
  sendVideoNote(input: {
202
231
  chatId: number | string;
203
232
  videoNoteFileId: string;
233
+ messageThreadId?: number;
204
234
  }): Promise<TgSendMessageResult> {
205
- return this.call<TgSendMessageResult>("sendVideoNote", {
235
+ const params: Record<string, unknown> = {
206
236
  chat_id: input.chatId,
207
237
  video_note: input.videoNoteFileId,
208
- });
238
+ };
239
+ if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
240
+ return this.call<TgSendMessageResult>("sendVideoNote", params);
209
241
  }
210
242
 
211
243
  sendPhotoUpload(input: {
@@ -214,10 +246,15 @@ export class TelegramClient {
214
246
  filename: string;
215
247
  contentType?: string;
216
248
  caption?: string;
249
+ messageThreadId?: number;
217
250
  }): Promise<TgSendMessageResult> {
218
251
  return this.callMultipart<TgSendMessageResult>(
219
252
  "sendPhoto",
220
- { chat_id: input.chatId, caption: input.caption },
253
+ {
254
+ chat_id: input.chatId,
255
+ caption: input.caption,
256
+ message_thread_id: input.messageThreadId,
257
+ },
221
258
  {
222
259
  field: "photo",
223
260
  bytes: input.bytes,
@@ -233,10 +270,15 @@ export class TelegramClient {
233
270
  filename: string;
234
271
  contentType?: string;
235
272
  caption?: string;
273
+ messageThreadId?: number;
236
274
  }): Promise<TgSendMessageResult> {
237
275
  return this.callMultipart<TgSendMessageResult>(
238
276
  "sendVideo",
239
- { chat_id: input.chatId, caption: input.caption },
277
+ {
278
+ chat_id: input.chatId,
279
+ caption: input.caption,
280
+ message_thread_id: input.messageThreadId,
281
+ },
240
282
  {
241
283
  field: "video",
242
284
  bytes: input.bytes,
@@ -251,10 +293,11 @@ export class TelegramClient {
251
293
  bytes: ArrayBuffer | Uint8Array;
252
294
  filename: string;
253
295
  contentType?: string;
296
+ messageThreadId?: number;
254
297
  }): Promise<TgSendMessageResult> {
255
298
  return this.callMultipart<TgSendMessageResult>(
256
299
  "sendVideoNote",
257
- { chat_id: input.chatId },
300
+ { chat_id: input.chatId, message_thread_id: input.messageThreadId },
258
301
  {
259
302
  field: "video_note",
260
303
  bytes: input.bytes,
@@ -283,12 +326,14 @@ export class TelegramClient {
283
326
  chatId: number | string;
284
327
  documentFileId: string;
285
328
  caption?: string;
329
+ messageThreadId?: number;
286
330
  }): Promise<TgSendMessageResult> {
287
331
  const params: Record<string, unknown> = {
288
332
  chat_id: input.chatId,
289
333
  document: input.documentFileId,
290
334
  };
291
335
  if (input.caption) params.caption = input.caption;
336
+ if (input.messageThreadId !== undefined) params.message_thread_id = input.messageThreadId;
292
337
  return this.call<TgSendMessageResult>("sendDocument", params);
293
338
  }
294
339
 
@@ -298,10 +343,15 @@ export class TelegramClient {
298
343
  filename: string;
299
344
  contentType?: string;
300
345
  caption?: string;
346
+ messageThreadId?: number;
301
347
  }): Promise<TgSendMessageResult> {
302
348
  return this.callMultipart<TgSendMessageResult>(
303
349
  "sendDocument",
304
- { chat_id: input.chatId, caption: input.caption },
350
+ {
351
+ chat_id: input.chatId,
352
+ caption: input.caption,
353
+ message_thread_id: input.messageThreadId,
354
+ },
305
355
  {
306
356
  field: "document",
307
357
  bytes: input.bytes,
@@ -14,6 +14,10 @@ export interface TgChat {
14
14
  type: "private" | "group" | "supergroup" | "channel";
15
15
  title?: string;
16
16
  username?: string;
17
+ /** true для супергрупп с включёнными топиками (форум). Telegram отдаёт это
18
+ * поле в `message.chat` — используется как opt-in сигнал «оператор-чат —
19
+ * форум» при /setup (#651): 1 топик на диалог. */
20
+ is_forum?: boolean;
17
21
  }
18
22
 
19
23
  /**
@@ -83,6 +87,9 @@ export interface TgMessage {
83
87
  from?: TgUser;
84
88
  chat: TgChat;
85
89
  date: number;
90
+ /** Топик форум-группы, в котором пришло сообщение (для маршрутизации ответов
91
+ * оператора по диалогу: conversations.operator_thread_id). */
92
+ message_thread_id?: number;
86
93
  text?: string;
87
94
  /** Caption that can accompany media uploads (photo / video / document /
88
95
  * voice). Treated as the message's "text" by the persistence layer