opencode-plugin-teleprompt 0.2.1 → 0.2.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 +28 -8
- package/dist/opencode/events.d.ts +43 -1
- package/dist/opencode/events.js +374 -7
- package/dist/opencode/events.js.map +1 -1
- package/dist/opencode/permissions.d.ts +8 -2
- package/dist/opencode/permissions.js +95 -8
- package/dist/opencode/permissions.js.map +1 -1
- package/dist/runtime/controller.d.ts +38 -3
- package/dist/runtime/controller.js +517 -24
- package/dist/runtime/controller.js.map +1 -1
- package/dist/state/store.js +52 -0
- package/dist/state/store.js.map +1 -1
- package/dist/summary/format.js +1 -1
- package/dist/summary/format.js.map +1 -1
- package/dist/telegram/api.d.ts +32 -3
- package/dist/telegram/api.js +49 -6
- package/dist/telegram/api.js.map +1 -1
- package/dist/telegram/callback.d.ts +47 -0
- package/dist/telegram/callback.js +195 -0
- package/dist/telegram/callback.js.map +1 -0
- package/dist/telegram/parser.d.ts +3 -2
- package/dist/telegram/parser.js +129 -0
- package/dist/telegram/parser.js.map +1 -1
- package/dist/telegram/poller.d.ts +4 -2
- package/dist/telegram/poller.js +23 -6
- package/dist/telegram/poller.js.map +1 -1
- package/dist/types.d.ts +84 -1
- package/package.json +3 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { PendingQuestionAnswer, TelegramInlineKeyboardMarkup } from "../types.js";
|
|
2
|
+
export declare const TELEGRAM_CALLBACK_DATA_MAX = 64;
|
|
3
|
+
export declare const PERMISSION_CALLBACK_PREFIX = "p";
|
|
4
|
+
export declare const QUESTION_CALLBACK_PREFIX = "q";
|
|
5
|
+
export declare function encodePermissionCallback(action: "once" | "always" | "reject", requestID: string): string;
|
|
6
|
+
export declare function encodeQuestionReject(requestID: string): string;
|
|
7
|
+
export declare function encodeQuestionAnswer(requestID: string, questionIndex: number, optionIndex: number): string;
|
|
8
|
+
export declare function encodeQuestionToggle(requestID: string, questionIndex: number, optionIndex: number): string;
|
|
9
|
+
export declare function encodeQuestionConfirm(requestID: string, questionIndex: number): string;
|
|
10
|
+
type PermissionCallback = {
|
|
11
|
+
kind: "permission";
|
|
12
|
+
action: "once" | "always" | "reject";
|
|
13
|
+
requestID: string;
|
|
14
|
+
};
|
|
15
|
+
type QuestionCallback = {
|
|
16
|
+
kind: "question";
|
|
17
|
+
action: "answer" | "reject" | "toggle" | "confirm";
|
|
18
|
+
requestID: string;
|
|
19
|
+
questionIndex?: number;
|
|
20
|
+
optionIndex?: number;
|
|
21
|
+
};
|
|
22
|
+
export type DecodedCallback = PermissionCallback | QuestionCallback | {
|
|
23
|
+
kind: "unknown";
|
|
24
|
+
raw: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function decodeCallbackData(raw: string): DecodedCallback;
|
|
27
|
+
export declare function buildPermissionKeyboard(requestID: string): TelegramInlineKeyboardMarkup;
|
|
28
|
+
export declare function buildQuestionKeyboard(input: {
|
|
29
|
+
requestID: string;
|
|
30
|
+
questionIndex: number;
|
|
31
|
+
options: {
|
|
32
|
+
label: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
}[];
|
|
35
|
+
selectedLabels: string[];
|
|
36
|
+
multiple: boolean;
|
|
37
|
+
}): TelegramInlineKeyboardMarkup;
|
|
38
|
+
export declare function encodeTextQuestionReply(requestID: string, answers: PendingQuestionAnswer[]): string;
|
|
39
|
+
export declare function encodeTextQuestionReject(requestID: string): string;
|
|
40
|
+
export declare function decodeTextQuestionReply(text: string): {
|
|
41
|
+
requestID: string;
|
|
42
|
+
answers: PendingQuestionAnswer[];
|
|
43
|
+
} | undefined;
|
|
44
|
+
export declare function decodeTextQuestionReject(text: string): {
|
|
45
|
+
requestID: string;
|
|
46
|
+
} | undefined;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
export const TELEGRAM_CALLBACK_DATA_MAX = 64;
|
|
2
|
+
export const PERMISSION_CALLBACK_PREFIX = "p";
|
|
3
|
+
export const QUESTION_CALLBACK_PREFIX = "q";
|
|
4
|
+
const PERMISSION_ACTION = {
|
|
5
|
+
once: "o",
|
|
6
|
+
always: "a",
|
|
7
|
+
reject: "r",
|
|
8
|
+
};
|
|
9
|
+
const QUESTION_ACTION = {
|
|
10
|
+
answer: "a",
|
|
11
|
+
reject: "r",
|
|
12
|
+
toggle: "t",
|
|
13
|
+
confirm: "c",
|
|
14
|
+
};
|
|
15
|
+
export function encodePermissionCallback(action, requestID) {
|
|
16
|
+
return `${PERMISSION_CALLBACK_PREFIX}:${PERMISSION_ACTION[action]}:${requestID}`;
|
|
17
|
+
}
|
|
18
|
+
export function encodeQuestionReject(requestID) {
|
|
19
|
+
return `${QUESTION_CALLBACK_PREFIX}:${QUESTION_ACTION.reject}:${requestID}`;
|
|
20
|
+
}
|
|
21
|
+
export function encodeQuestionAnswer(requestID, questionIndex, optionIndex) {
|
|
22
|
+
return `${QUESTION_CALLBACK_PREFIX}:${QUESTION_ACTION.answer}:${requestID}:${questionIndex}:${optionIndex}`;
|
|
23
|
+
}
|
|
24
|
+
export function encodeQuestionToggle(requestID, questionIndex, optionIndex) {
|
|
25
|
+
return `${QUESTION_CALLBACK_PREFIX}:${QUESTION_ACTION.toggle}:${requestID}:${questionIndex}:${optionIndex}`;
|
|
26
|
+
}
|
|
27
|
+
export function encodeQuestionConfirm(requestID, questionIndex) {
|
|
28
|
+
return `${QUESTION_CALLBACK_PREFIX}:${QUESTION_ACTION.confirm}:${requestID}:${questionIndex}`;
|
|
29
|
+
}
|
|
30
|
+
export function decodeCallbackData(raw) {
|
|
31
|
+
const parts = raw.split(":");
|
|
32
|
+
const head = parts[0];
|
|
33
|
+
if (head === PERMISSION_CALLBACK_PREFIX && parts.length === 3) {
|
|
34
|
+
const actionCode = parts[1];
|
|
35
|
+
const requestID = parts[2];
|
|
36
|
+
if (actionCode === PERMISSION_ACTION.once) {
|
|
37
|
+
return { kind: "permission", action: "once", requestID };
|
|
38
|
+
}
|
|
39
|
+
if (actionCode === PERMISSION_ACTION.always) {
|
|
40
|
+
return { kind: "permission", action: "always", requestID };
|
|
41
|
+
}
|
|
42
|
+
if (actionCode === PERMISSION_ACTION.reject) {
|
|
43
|
+
return { kind: "permission", action: "reject", requestID };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (head === QUESTION_CALLBACK_PREFIX) {
|
|
47
|
+
const actionCode = parts[1];
|
|
48
|
+
const requestID = parts[2];
|
|
49
|
+
if (actionCode === QUESTION_ACTION.reject && parts.length === 3) {
|
|
50
|
+
return { kind: "question", action: "reject", requestID };
|
|
51
|
+
}
|
|
52
|
+
if (actionCode === QUESTION_ACTION.answer &&
|
|
53
|
+
parts.length === 5 &&
|
|
54
|
+
requestID) {
|
|
55
|
+
return {
|
|
56
|
+
kind: "question",
|
|
57
|
+
action: "answer",
|
|
58
|
+
requestID,
|
|
59
|
+
questionIndex: Number(parts[3]),
|
|
60
|
+
optionIndex: Number(parts[4]),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (actionCode === QUESTION_ACTION.toggle &&
|
|
64
|
+
parts.length === 5 &&
|
|
65
|
+
requestID) {
|
|
66
|
+
return {
|
|
67
|
+
kind: "question",
|
|
68
|
+
action: "toggle",
|
|
69
|
+
requestID,
|
|
70
|
+
questionIndex: Number(parts[3]),
|
|
71
|
+
optionIndex: Number(parts[4]),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (actionCode === QUESTION_ACTION.confirm &&
|
|
75
|
+
parts.length === 4 &&
|
|
76
|
+
requestID) {
|
|
77
|
+
return {
|
|
78
|
+
kind: "question",
|
|
79
|
+
action: "confirm",
|
|
80
|
+
requestID,
|
|
81
|
+
questionIndex: Number(parts[3]),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { kind: "unknown", raw };
|
|
86
|
+
}
|
|
87
|
+
export function buildPermissionKeyboard(requestID) {
|
|
88
|
+
const row = [
|
|
89
|
+
{
|
|
90
|
+
text: "Approve once",
|
|
91
|
+
callback_data: encodePermissionCallback("once", requestID),
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
text: "Approve always",
|
|
95
|
+
callback_data: encodePermissionCallback("always", requestID),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
text: "Deny",
|
|
99
|
+
callback_data: encodePermissionCallback("reject", requestID),
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
return { inline_keyboard: [row] };
|
|
103
|
+
}
|
|
104
|
+
export function buildQuestionKeyboard(input) {
|
|
105
|
+
const { requestID, questionIndex, options, selectedLabels, multiple } = input;
|
|
106
|
+
const buttons = options.map((opt, idx) => {
|
|
107
|
+
const isSelected = selectedLabels.includes(opt.label);
|
|
108
|
+
const labelText = multiple
|
|
109
|
+
? `${isSelected ? "✅" : "▫️"} ${opt.label}`
|
|
110
|
+
: opt.label;
|
|
111
|
+
return {
|
|
112
|
+
text: labelText,
|
|
113
|
+
callback_data: multiple
|
|
114
|
+
? encodeQuestionToggle(requestID, questionIndex, idx)
|
|
115
|
+
: encodeQuestionAnswer(requestID, questionIndex, idx),
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
const rows = [];
|
|
119
|
+
for (let i = 0; i < buttons.length; i += 2) {
|
|
120
|
+
const slice = buttons.slice(i, i + 2);
|
|
121
|
+
if (slice.length === 1) {
|
|
122
|
+
rows.push(slice);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
rows.push(slice);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (multiple) {
|
|
129
|
+
const hasSelection = selectedLabels.length > 0;
|
|
130
|
+
rows.push([
|
|
131
|
+
{
|
|
132
|
+
text: hasSelection
|
|
133
|
+
? `Confirm (${selectedLabels.length})`
|
|
134
|
+
: "Select at least one",
|
|
135
|
+
callback_data: encodeQuestionConfirm(requestID, questionIndex),
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
text: "Skip / Reject",
|
|
139
|
+
callback_data: encodeQuestionReject(requestID),
|
|
140
|
+
},
|
|
141
|
+
]);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
rows.push([
|
|
145
|
+
{
|
|
146
|
+
text: "Skip / Reject",
|
|
147
|
+
callback_data: encodeQuestionReject(requestID),
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
}
|
|
151
|
+
return { inline_keyboard: rows };
|
|
152
|
+
}
|
|
153
|
+
export function encodeTextQuestionReply(requestID, answers) {
|
|
154
|
+
const lines = [];
|
|
155
|
+
lines.push(`/qreply ${requestID}`);
|
|
156
|
+
for (let i = 0; i < answers.length; i++) {
|
|
157
|
+
const ans = answers[i];
|
|
158
|
+
const labels = ans.labels.join("|");
|
|
159
|
+
lines.push(`${i}:${labels}`);
|
|
160
|
+
}
|
|
161
|
+
return lines.join("\n");
|
|
162
|
+
}
|
|
163
|
+
export function encodeTextQuestionReject(requestID) {
|
|
164
|
+
return `/qreject ${requestID}`;
|
|
165
|
+
}
|
|
166
|
+
export function decodeTextQuestionReply(text) {
|
|
167
|
+
const lines = text.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
168
|
+
if (lines.length === 0)
|
|
169
|
+
return undefined;
|
|
170
|
+
const header = lines[0].split(/\s+/);
|
|
171
|
+
const head = header[0].startsWith("/") ? header[0].slice(1) : header[0];
|
|
172
|
+
if (head !== "qreply" || !header[1])
|
|
173
|
+
return undefined;
|
|
174
|
+
const requestID = header[1];
|
|
175
|
+
const answers = [];
|
|
176
|
+
for (let i = 1; i < lines.length; i++) {
|
|
177
|
+
const [idxRaw, labelsRaw] = lines[i].split(":", 2);
|
|
178
|
+
if (idxRaw === undefined || labelsRaw === undefined)
|
|
179
|
+
continue;
|
|
180
|
+
const idx = Number(idxRaw);
|
|
181
|
+
if (!Number.isFinite(idx))
|
|
182
|
+
continue;
|
|
183
|
+
const labels = labelsRaw.split("|").filter(Boolean);
|
|
184
|
+
answers.push({ questionIndex: idx, labels });
|
|
185
|
+
}
|
|
186
|
+
return { requestID, answers };
|
|
187
|
+
}
|
|
188
|
+
export function decodeTextQuestionReject(text) {
|
|
189
|
+
const header = text.trim().split(/\s+/);
|
|
190
|
+
const head = header[0].startsWith("/") ? header[0].slice(1) : header[0];
|
|
191
|
+
if (head !== "qreject" || !header[1])
|
|
192
|
+
return undefined;
|
|
193
|
+
return { requestID: header[1] };
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callback.js","sourceRoot":"","sources":["../../src/telegram/callback.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { ParsedTelegramCommand, TelegramChannelPost, TelegramUpdate } from "../types.js";
|
|
2
|
-
export declare function parseTelegramUpdate(update: TelegramUpdate, channelID: string, prefix: string): ParsedTelegramCommand | undefined;
|
|
1
|
+
import type { ParsedCallbackQuery, ParsedTelegramCommand, TelegramCallbackQuery, TelegramChannelPost, TelegramUpdate } from "../types.js";
|
|
2
|
+
export declare function parseTelegramUpdate(update: TelegramUpdate, channelID: string, prefix: string): ParsedTelegramCommand | ParsedCallbackQuery | undefined;
|
|
3
3
|
export declare function isChannelPostFromTarget(post: TelegramChannelPost | undefined, channelID: string): boolean;
|
|
4
|
+
export declare function isCallbackFromTarget(query: TelegramCallbackQuery | undefined, channelID: string): boolean;
|
package/dist/telegram/parser.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { decodeCallbackData, decodeTextQuestionReject, decodeTextQuestionReply, } from "./callback.js";
|
|
1
2
|
function parseCommandBody(body) {
|
|
2
3
|
const trimmed = body.trim();
|
|
3
4
|
if (!trimmed)
|
|
@@ -41,6 +42,9 @@ function parseCommandBody(body) {
|
|
|
41
42
|
const lastErrorMatch = /^last-error\s*$/i.exec(trimmed);
|
|
42
43
|
if (lastErrorMatch)
|
|
43
44
|
return { kind: "last-error" };
|
|
45
|
+
const diagMatch = /^diag(nostic)?\s*$/i.exec(trimmed);
|
|
46
|
+
if (diagMatch)
|
|
47
|
+
return { kind: "diag" };
|
|
44
48
|
const versionMatch = /^version\s*$/i.exec(trimmed);
|
|
45
49
|
if (versionMatch)
|
|
46
50
|
return { kind: "version" };
|
|
@@ -66,6 +70,48 @@ function parseCommandBody(body) {
|
|
|
66
70
|
if (denyMatch) {
|
|
67
71
|
return { kind: "permission", action: "reject", requestID: denyMatch[1] };
|
|
68
72
|
}
|
|
73
|
+
const qreplyMatch = /^qreply\s+([A-Za-z0-9_\-:.]+)/i.exec(trimmed);
|
|
74
|
+
if (qreplyMatch) {
|
|
75
|
+
const decoded = decodeTextQuestionReply(trimmed);
|
|
76
|
+
if (decoded && decoded.requestID === qreplyMatch[1]) {
|
|
77
|
+
return {
|
|
78
|
+
kind: "question",
|
|
79
|
+
action: "reply",
|
|
80
|
+
requestID: decoded.requestID,
|
|
81
|
+
answers: decoded.answers,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const ansMatch = /^ans(wer)?\s+([A-Za-z0-9_\-:.]+)\s+(.+)$/i.exec(trimmed);
|
|
86
|
+
if (ansMatch) {
|
|
87
|
+
const requestID = ansMatch[2];
|
|
88
|
+
const rawAnswer = ansMatch[3].trim();
|
|
89
|
+
// Support "0:Option" or "Option" format
|
|
90
|
+
const qIndexMatch = /^(\d+):(.+)$/.exec(rawAnswer);
|
|
91
|
+
const questionIndex = qIndexMatch ? Number(qIndexMatch[1]) : 0;
|
|
92
|
+
const label = qIndexMatch ? qIndexMatch[2].trim() : rawAnswer;
|
|
93
|
+
return {
|
|
94
|
+
kind: "question",
|
|
95
|
+
action: "reply",
|
|
96
|
+
requestID,
|
|
97
|
+
answers: [{ questionIndex, labels: [label] }],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const qrejectMatch = /^qreject\s+([A-Za-z0-9_\-:.]+)\s*$/i.exec(trimmed);
|
|
101
|
+
const skipMatch = /^skip\s+([A-Za-z0-9_\-:.]+)\s*$/i.exec(trimmed);
|
|
102
|
+
if (skipMatch) {
|
|
103
|
+
return { kind: "question", action: "reject", requestID: skipMatch[1] };
|
|
104
|
+
}
|
|
105
|
+
if (qrejectMatch) {
|
|
106
|
+
const decoded = decodeTextQuestionReject(trimmed);
|
|
107
|
+
if (decoded) {
|
|
108
|
+
return {
|
|
109
|
+
kind: "question",
|
|
110
|
+
action: "reject",
|
|
111
|
+
requestID: decoded.requestID,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
69
115
|
const modelMatch = /^model(?:\s+([A-Za-z0-9_./-]+))?\s*$/i.exec(trimmed);
|
|
70
116
|
if (modelMatch) {
|
|
71
117
|
const rawTarget = modelMatch[1]?.trim();
|
|
@@ -90,6 +136,12 @@ function parseCommandBody(body) {
|
|
|
90
136
|
return { kind: "prompt", prompt: trimmed };
|
|
91
137
|
}
|
|
92
138
|
export function parseTelegramUpdate(update, channelID, prefix) {
|
|
139
|
+
if (update.callback_query) {
|
|
140
|
+
return parseCallbackQuery(update, channelID);
|
|
141
|
+
}
|
|
142
|
+
return parseChannelPost(update, channelID, prefix);
|
|
143
|
+
}
|
|
144
|
+
function parseChannelPost(update, channelID, prefix) {
|
|
93
145
|
const post = update.channel_post || update.message;
|
|
94
146
|
if (!post)
|
|
95
147
|
return undefined;
|
|
@@ -158,9 +210,86 @@ export function parseTelegramUpdate(update, channelID, prefix) {
|
|
|
158
210
|
}
|
|
159
211
|
return undefined;
|
|
160
212
|
}
|
|
213
|
+
function parseCallbackQuery(update, channelID) {
|
|
214
|
+
const query = update.callback_query;
|
|
215
|
+
if (!query)
|
|
216
|
+
return undefined;
|
|
217
|
+
const message = query.message;
|
|
218
|
+
if (!message)
|
|
219
|
+
return undefined;
|
|
220
|
+
const normalizedChannel = String(message.chat.id);
|
|
221
|
+
if (normalizedChannel !== channelID)
|
|
222
|
+
return undefined;
|
|
223
|
+
const data = query.data;
|
|
224
|
+
if (!data)
|
|
225
|
+
return undefined;
|
|
226
|
+
const decoded = decodeCallbackData(data);
|
|
227
|
+
if (decoded.kind === "unknown")
|
|
228
|
+
return undefined;
|
|
229
|
+
let command;
|
|
230
|
+
if (decoded.kind === "permission") {
|
|
231
|
+
command = {
|
|
232
|
+
kind: "permission",
|
|
233
|
+
action: decoded.action,
|
|
234
|
+
requestID: decoded.requestID,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
else if (decoded.kind === "question") {
|
|
238
|
+
if (decoded.action === "reject") {
|
|
239
|
+
command = {
|
|
240
|
+
kind: "question",
|
|
241
|
+
action: "reject",
|
|
242
|
+
requestID: decoded.requestID,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
else if (decoded.action === "answer") {
|
|
246
|
+
// Single-choice: will be resolved to a full answer by the controller
|
|
247
|
+
// using the pending question's option labels. We pass the indices.
|
|
248
|
+
command = {
|
|
249
|
+
kind: "question",
|
|
250
|
+
action: "reply",
|
|
251
|
+
requestID: decoded.requestID,
|
|
252
|
+
questionIndex: decoded.questionIndex,
|
|
253
|
+
optionIndex: decoded.optionIndex,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
else if (decoded.action === "toggle") {
|
|
257
|
+
command = {
|
|
258
|
+
kind: "question",
|
|
259
|
+
action: "toggle",
|
|
260
|
+
requestID: decoded.requestID,
|
|
261
|
+
questionIndex: decoded.questionIndex,
|
|
262
|
+
optionIndex: decoded.optionIndex,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
else if (decoded.action === "confirm") {
|
|
266
|
+
command = {
|
|
267
|
+
kind: "question",
|
|
268
|
+
action: "confirm",
|
|
269
|
+
requestID: decoded.requestID,
|
|
270
|
+
questionIndex: decoded.questionIndex,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (!command)
|
|
275
|
+
return undefined;
|
|
276
|
+
return {
|
|
277
|
+
updateID: update.update_id,
|
|
278
|
+
callbackQueryID: query.id,
|
|
279
|
+
channelID: normalizedChannel,
|
|
280
|
+
messageID: message.message_id,
|
|
281
|
+
rawData: data,
|
|
282
|
+
command,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
161
285
|
export function isChannelPostFromTarget(post, channelID) {
|
|
162
286
|
if (!post)
|
|
163
287
|
return false;
|
|
164
288
|
return String(post.chat.id) === channelID;
|
|
165
289
|
}
|
|
290
|
+
export function isCallbackFromTarget(query, channelID) {
|
|
291
|
+
if (!query)
|
|
292
|
+
return false;
|
|
293
|
+
return String(query.message?.chat.id ?? "") === channelID;
|
|
294
|
+
}
|
|
166
295
|
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/telegram/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/telegram/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import type { ParsedTelegramCommand } from "../types.js";
|
|
1
|
+
import type { ParsedCallbackQuery, ParsedTelegramCommand } from "../types.js";
|
|
2
2
|
import { TelegramApi } from "./api.js";
|
|
3
|
+
type BridgeCommand = ParsedTelegramCommand | ParsedCallbackQuery;
|
|
3
4
|
type PollerHandlers = {
|
|
4
|
-
onCommand: (command:
|
|
5
|
+
onCommand: (command: BridgeCommand) => Promise<void>;
|
|
5
6
|
onOffset: (offset: number) => Promise<void>;
|
|
6
7
|
onError: (error: unknown) => void;
|
|
7
8
|
onUpdates?: (count: number) => void;
|
|
9
|
+
onLog?: (message: string) => void;
|
|
8
10
|
};
|
|
9
11
|
export declare class TelegramPoller {
|
|
10
12
|
private readonly api;
|
package/dist/telegram/poller.js
CHANGED
|
@@ -15,9 +15,12 @@ export class TelegramPoller {
|
|
|
15
15
|
}
|
|
16
16
|
async run(startOffset, signal) {
|
|
17
17
|
let offset = startOffset;
|
|
18
|
+
this.handlers.onLog?.(`poller: run starting at offset=${offset} timeout=${this.timeoutSec}s`);
|
|
18
19
|
while (!signal.aborted) {
|
|
19
20
|
try {
|
|
21
|
+
this.handlers.onLog?.(`poller: getUpdates(offset=${offset})`);
|
|
20
22
|
const updates = await this.api.getUpdates(offset, this.timeoutSec, signal);
|
|
23
|
+
this.handlers.onLog?.(`poller: getUpdates returned ${updates.length} updates`);
|
|
21
24
|
if (signal.aborted)
|
|
22
25
|
break;
|
|
23
26
|
if (updates.length > 0) {
|
|
@@ -28,10 +31,12 @@ export class TelegramPoller {
|
|
|
28
31
|
catch (error) {
|
|
29
32
|
if (signal.aborted)
|
|
30
33
|
break;
|
|
34
|
+
this.handlers.onLog?.(`poller: getUpdates threw: ${String(error)}`);
|
|
31
35
|
this.handlers.onError(error);
|
|
32
36
|
await delayWithSignal(1000, signal);
|
|
33
37
|
}
|
|
34
38
|
}
|
|
39
|
+
this.handlers.onLog?.("poller: run exiting");
|
|
35
40
|
}
|
|
36
41
|
async processUpdates(offset, updates) {
|
|
37
42
|
let nextOffset = offset;
|
|
@@ -39,23 +44,35 @@ export class TelegramPoller {
|
|
|
39
44
|
const parsed = parseTelegramUpdate(update, this.channelID, this.prefix);
|
|
40
45
|
const candidateOffset = Math.max(nextOffset, update.update_id + 1);
|
|
41
46
|
if (!parsed) {
|
|
42
|
-
const
|
|
43
|
-
if (
|
|
47
|
+
const cq = update.callback_query;
|
|
48
|
+
if (cq) {
|
|
49
|
+
const chatId = cq.message?.chat.id;
|
|
50
|
+
this.handlers.onLog?.(`poller: ignored callback_query id=${cq.id} chatId=${chatId} (expected ${this.channelID}) data=${cq.data}`);
|
|
51
|
+
}
|
|
52
|
+
else if (update.channel_post || update.message) {
|
|
53
|
+
const post = (update.channel_post || update.message);
|
|
44
54
|
const chatId = post.chat.id;
|
|
45
55
|
const text = post.text || "";
|
|
46
|
-
// Only show warning if it looks like a command meant for the bot
|
|
47
56
|
if (text.trim().startsWith(this.prefix) || text.trim().startsWith("/")) {
|
|
48
|
-
this.handlers.onError(new Error(`Update ignored.
|
|
57
|
+
this.handlers.onError(new Error(`Update ignored. Chat ID: ${chatId} (expected ${this.channelID}), Text: "${text}"`));
|
|
49
58
|
}
|
|
50
59
|
}
|
|
60
|
+
else {
|
|
61
|
+
this.handlers.onLog?.(`poller: ignored update id=${update.update_id} type=${Object.keys(update).filter(k => k !== 'update_id').join(",")}`);
|
|
62
|
+
}
|
|
51
63
|
nextOffset = candidateOffset;
|
|
52
64
|
await this.handlers.onOffset(nextOffset);
|
|
53
65
|
continue;
|
|
54
66
|
}
|
|
55
|
-
//
|
|
56
|
-
|
|
67
|
+
// Save offset immediately, then fire-and-forget the command handler.
|
|
68
|
+
// This prevents the poller from being blocked while a long-running
|
|
69
|
+
// command (e.g. prompt processing) completes. Errors are caught and
|
|
70
|
+
// forwarded to the error handler.
|
|
57
71
|
nextOffset = candidateOffset;
|
|
58
72
|
await this.handlers.onOffset(nextOffset);
|
|
73
|
+
this.handlers.onCommand(parsed).catch((err) => {
|
|
74
|
+
this.handlers.onError(err);
|
|
75
|
+
});
|
|
59
76
|
}
|
|
60
77
|
return nextOffset;
|
|
61
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/telegram/poller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"poller.js","sourceRoot":"","sources":["../../src/telegram/poller.ts"],"names":[],"mappings":"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"}
|