paperclip-plugin-telegram 0.2.0 → 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.
Files changed (62) hide show
  1. package/README.md +68 -4
  2. package/dist/acp-bridge.d.ts +34 -0
  3. package/dist/acp-bridge.js +805 -0
  4. package/dist/acp-bridge.js.map +1 -0
  5. package/dist/adapter.d.ts +35 -0
  6. package/dist/adapter.js +75 -0
  7. package/dist/adapter.js.map +1 -0
  8. package/dist/command-registry.d.ts +3 -0
  9. package/dist/command-registry.js +273 -0
  10. package/dist/command-registry.js.map +1 -0
  11. package/dist/commands.d.ts +10 -0
  12. package/dist/commands.js +213 -0
  13. package/dist/commands.js.map +1 -0
  14. package/dist/constants.d.ts +44 -0
  15. package/dist/constants.js +48 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/escalation.d.ts +41 -0
  18. package/dist/escalation.js +254 -0
  19. package/dist/escalation.js.map +1 -0
  20. package/dist/formatters.d.ts +13 -0
  21. package/dist/formatters.js +130 -0
  22. package/dist/formatters.js.map +1 -0
  23. package/dist/index.js +4 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/manifest.d.ts +3 -0
  26. package/dist/manifest.js +230 -0
  27. package/dist/manifest.js.map +1 -0
  28. package/dist/media-pipeline.d.ts +46 -0
  29. package/dist/media-pipeline.js +161 -0
  30. package/dist/media-pipeline.js.map +1 -0
  31. package/dist/telegram-api.d.ts +28 -0
  32. package/dist/telegram-api.js +147 -0
  33. package/dist/telegram-api.js.map +1 -0
  34. package/dist/watch-registry.d.ts +9 -0
  35. package/dist/watch-registry.js +272 -0
  36. package/dist/watch-registry.js.map +1 -0
  37. package/dist/worker.d.ts +1 -0
  38. package/dist/worker.js +548 -0
  39. package/dist/worker.js.map +1 -0
  40. package/package.json +7 -3
  41. package/src/acp-bridge.ts +0 -1273
  42. package/src/adapter.ts +0 -129
  43. package/src/command-registry.ts +0 -482
  44. package/src/commands.ts +0 -346
  45. package/src/constants.ts +0 -51
  46. package/src/escalation.ts +0 -421
  47. package/src/formatters.ts +0 -148
  48. package/src/manifest.ts +0 -246
  49. package/src/media-pipeline.ts +0 -234
  50. package/src/telegram-api.ts +0 -202
  51. package/src/watch-registry.ts +0 -369
  52. package/src/worker.ts +0 -783
  53. package/tests/acp-bridge.test.ts +0 -314
  54. package/tests/command-registry.test.ts +0 -283
  55. package/tests/commands.test.ts +0 -213
  56. package/tests/escalation.test.ts +0 -550
  57. package/tests/formatters.test.ts +0 -185
  58. package/tests/media-pipeline.test.ts +0 -324
  59. package/tests/telegram-api.test.ts +0 -108
  60. package/tests/watch-registry.test.ts +0 -404
  61. package/tsconfig.json +0 -16
  62. /package/{src/index.ts → dist/index.d.ts} +0 -0
package/dist/worker.js ADDED
@@ -0,0 +1,548 @@
1
+ import { definePlugin, runWorker, } from "@paperclipai/plugin-sdk";
2
+ import { sendMessage, editMessage, answerCallbackQuery, setMyCommands, escapeMarkdownV2, } from "./telegram-api.js";
3
+ import { formatIssueCreated, formatIssueDone, formatApprovalCreated, formatAgentError, formatAgentRunStarted, formatAgentRunFinished, } from "./formatters.js";
4
+ import { handleCommand, getTopicForProject, BOT_COMMANDS } from "./commands.js";
5
+ import { routeMessageToAgent, handleHandoffToolCall, handleDiscussToolCall, handleHandoffApproval, handleHandoffRejection, setupAcpOutputListener, } from "./acp-bridge.js";
6
+ import { handleMediaMessage } from "./media-pipeline.js";
7
+ import { handleCommandsCommand, tryCustomCommand } from "./command-registry.js";
8
+ import { handleRegisterWatch, checkWatches } from "./watch-registry.js";
9
+ import { METRIC_NAMES } from "./constants.js";
10
+ import { EscalationManager } from "./escalation.js";
11
+ const TELEGRAM_API = "https://api.telegram.org";
12
+ async function resolveChat(ctx, companyId, fallback) {
13
+ const override = await ctx.state.get({
14
+ scopeKind: "company",
15
+ scopeId: companyId,
16
+ stateKey: "telegram-chat",
17
+ });
18
+ return override ?? fallback ?? null;
19
+ }
20
+ async function resolveCompanyId(ctx, chatId) {
21
+ const mapping = await ctx.state.get({
22
+ scopeKind: "instance",
23
+ stateKey: `chat_${chatId}`,
24
+ });
25
+ return mapping?.companyName ?? chatId;
26
+ }
27
+ const plugin = definePlugin({
28
+ async setup(ctx) {
29
+ const rawConfig = await ctx.config.get();
30
+ ctx.logger.info("Telegram plugin config loaded");
31
+ const config = rawConfig;
32
+ const baseUrl = config.paperclipBaseUrl || "http://localhost:3100";
33
+ if (!config.telegramBotTokenRef) {
34
+ ctx.logger.warn("No telegramBotTokenRef configured, plugin disabled");
35
+ return;
36
+ }
37
+ const token = await ctx.secrets.resolve(config.telegramBotTokenRef);
38
+ // --- Register bot commands with Telegram ---
39
+ if (config.enableCommands) {
40
+ const allCommands = [
41
+ ...BOT_COMMANDS,
42
+ { command: "commands", description: "Manage custom workflow commands" },
43
+ ];
44
+ const registered = await setMyCommands(ctx, token, allCommands);
45
+ if (registered) {
46
+ ctx.logger.info("Bot commands registered with Telegram");
47
+ }
48
+ }
49
+ // --- Long polling for inbound messages ---
50
+ let pollingActive = true;
51
+ let lastUpdateId = 0;
52
+ async function pollUpdates() {
53
+ while (pollingActive) {
54
+ try {
55
+ const res = await ctx.http.fetch(`${TELEGRAM_API}/bot${token}/getUpdates?offset=${lastUpdateId + 1}&timeout=30&allowed_updates=["message","callback_query"]`, { method: "GET" });
56
+ const data = (await res.json());
57
+ if (data.ok && data.result) {
58
+ for (const update of data.result) {
59
+ lastUpdateId = Math.max(lastUpdateId, update.update_id);
60
+ await handleUpdate(ctx, token, config, update, baseUrl);
61
+ }
62
+ }
63
+ }
64
+ catch (err) {
65
+ ctx.logger.error("Telegram polling error", { error: String(err) });
66
+ await new Promise((r) => setTimeout(r, 5000));
67
+ }
68
+ }
69
+ }
70
+ if (config.enableCommands || config.enableInbound) {
71
+ pollUpdates().catch((err) => ctx.logger.error("Polling loop crashed", { error: String(err) }));
72
+ }
73
+ ctx.events.on("plugin.stopping", async () => {
74
+ pollingActive = false;
75
+ });
76
+ // --- Phase 2: ACP output listener (cross-plugin events) ---
77
+ setupAcpOutputListener(ctx, token);
78
+ // --- Event subscriptions ---
79
+ const notify = async (event, formatter, overrideChatId) => {
80
+ const chatId = await resolveChat(ctx, event.companyId, overrideChatId || config.defaultChatId);
81
+ if (!chatId)
82
+ return;
83
+ const msg = formatter(event);
84
+ let messageThreadId;
85
+ if (config.topicRouting) {
86
+ const payload = event.payload;
87
+ const projectName = payload.projectName ? String(payload.projectName) : undefined;
88
+ messageThreadId = await getTopicForProject(ctx, chatId, projectName);
89
+ }
90
+ if (messageThreadId) {
91
+ msg.options.messageThreadId = messageThreadId;
92
+ }
93
+ const messageId = await sendMessage(ctx, token, chatId, msg.text, msg.options);
94
+ if (messageId) {
95
+ await ctx.state.set({
96
+ scopeKind: "instance",
97
+ stateKey: `msg_${chatId}_${messageId}`,
98
+ }, {
99
+ entityId: event.entityId,
100
+ entityType: event.entityType,
101
+ companyId: event.companyId,
102
+ eventType: event.eventType,
103
+ });
104
+ await ctx.activity.log({
105
+ companyId: event.companyId,
106
+ message: `Forwarded ${event.eventType} to Telegram`,
107
+ entityType: "plugin",
108
+ entityId: event.entityId,
109
+ });
110
+ }
111
+ };
112
+ if (config.notifyOnIssueCreated) {
113
+ ctx.events.on("issue.created", (event) => notify(event, formatIssueCreated));
114
+ }
115
+ if (config.notifyOnIssueDone) {
116
+ ctx.events.on("issue.updated", async (event) => {
117
+ const payload = event.payload;
118
+ if (payload.status !== "done")
119
+ return;
120
+ await notify(event, formatIssueDone);
121
+ });
122
+ }
123
+ if (config.notifyOnApprovalCreated) {
124
+ ctx.events.on("approval.created", (event) => notify(event, formatApprovalCreated, config.approvalsChatId));
125
+ }
126
+ if (config.notifyOnAgentError) {
127
+ ctx.events.on("agent.run.failed", (event) => notify(event, formatAgentError, config.errorsChatId));
128
+ }
129
+ ctx.events.on("agent.run.started", (event) => notify(event, formatAgentRunStarted));
130
+ ctx.events.on("agent.run.finished", (event) => notify(event, formatAgentRunFinished));
131
+ // --- Per-company chat overrides ---
132
+ ctx.data.register("chat-mapping", async (params) => {
133
+ const companyId = String(params.companyId);
134
+ const saved = await ctx.state.get({
135
+ scopeKind: "company",
136
+ scopeId: companyId,
137
+ stateKey: "telegram-chat",
138
+ });
139
+ return { chatId: saved ?? config.defaultChatId };
140
+ });
141
+ ctx.actions.register("set-chat", async (params) => {
142
+ const companyId = String(params.companyId);
143
+ const chatId = String(params.chatId);
144
+ await ctx.state.set({ scopeKind: "company", scopeId: companyId, stateKey: "telegram-chat" }, chatId);
145
+ ctx.logger.info("Updated Telegram chat mapping", { companyId, chatId });
146
+ return { ok: true };
147
+ });
148
+ // --- Daily digest job ---
149
+ if (config.dailyDigestEnabled) {
150
+ ctx.jobs.register("telegram-daily-digest", async () => {
151
+ try {
152
+ const companies = await ctx.companies.list();
153
+ const companyId = companies[0]?.id ?? "";
154
+ const agents = await ctx.agents.list({ companyId });
155
+ const activeAgents = agents.filter((a) => a.status === "active");
156
+ const issues = await ctx.issues.list({ companyId, limit: 50 });
157
+ const now = Date.now();
158
+ const oneDayMs = 24 * 60 * 60 * 1000;
159
+ const completedToday = issues.filter((i) => i.status === "done" && i.completedAt && (now - new Date(i.completedAt).getTime()) < oneDayMs);
160
+ const createdToday = issues.filter((i) => (now - new Date(i.createdAt).getTime()) < oneDayMs);
161
+ const dateStr = new Date().toISOString().split("T")[0];
162
+ const lines = [
163
+ escapeMarkdownV2("\ud83d\udcca") + ` *Daily Digest \\- ${escapeMarkdownV2(dateStr)}*`,
164
+ "",
165
+ `${escapeMarkdownV2("\u2705")} Tasks completed: *${completedToday.length}*`,
166
+ `${escapeMarkdownV2("\ud83d\udccb")} Tasks created: *${createdToday.length}*`,
167
+ `${escapeMarkdownV2("\ud83e\udd16")} Active agents: *${activeAgents.length}*/${escapeMarkdownV2(String(agents.length))}`,
168
+ ];
169
+ if (activeAgents.length > 0) {
170
+ const topAgent = activeAgents[0].name;
171
+ lines.push(`${escapeMarkdownV2("\u2b50")} Top performer: *${escapeMarkdownV2(topAgent)}*`);
172
+ }
173
+ await sendMessage(ctx, token, config.defaultChatId, lines.join("\n"), {
174
+ parseMode: "MarkdownV2",
175
+ });
176
+ }
177
+ catch (err) {
178
+ ctx.logger.error("Daily digest failed", { error: String(err) });
179
+ const text = [
180
+ escapeMarkdownV2("\ud83d\udcca") + " *Daily Digest*",
181
+ "",
182
+ escapeMarkdownV2("Could not generate digest. Check plugin logs for details."),
183
+ ].join("\n");
184
+ await sendMessage(ctx, token, config.defaultChatId, text, {
185
+ parseMode: "MarkdownV2",
186
+ });
187
+ }
188
+ });
189
+ }
190
+ // --- Phase 1: Escalation support ---
191
+ const escalationManager = new EscalationManager();
192
+ // Register escalate_to_human tool - 3-arg signature with ToolRunContext
193
+ ctx.tools.register("escalate_to_human", {
194
+ displayName: "Escalate to Human",
195
+ description: "Escalate a conversation to a human when you cannot handle it confidently",
196
+ parametersSchema: {
197
+ type: "object",
198
+ properties: {
199
+ reason: {
200
+ type: "string",
201
+ enum: ["low_confidence", "explicit_request", "policy_violation", "unknown_intent"],
202
+ description: "Why this conversation needs human attention",
203
+ },
204
+ conversationSummary: {
205
+ type: "string",
206
+ description: "Brief summary of the conversation context and what the user needs",
207
+ },
208
+ suggestedActions: {
209
+ type: "array",
210
+ items: { type: "string" },
211
+ description: "Suggested actions the human responder could take",
212
+ },
213
+ suggestedReply: {
214
+ type: "string",
215
+ description: "A draft reply the human can send or modify",
216
+ },
217
+ confidenceScore: {
218
+ type: "number",
219
+ minimum: 0,
220
+ maximum: 1,
221
+ description: "How confident the agent is (0-1). Lower values indicate greater need for human help",
222
+ },
223
+ originChatId: { type: "string" },
224
+ originThreadId: { type: "string" },
225
+ originMessageId: { type: "string" },
226
+ sessionId: { type: "string", description: "Session ID for routing reply back" },
227
+ transport: { type: "string", enum: ["native", "acp"], description: "Transport type for reply routing" },
228
+ },
229
+ required: ["reason", "conversationSummary"],
230
+ },
231
+ }, async (params, runCtx) => {
232
+ const p = params;
233
+ const escalationId = crypto.randomUUID();
234
+ const timeoutMs = config.escalationTimeoutMs || 900000;
235
+ const defaultAction = config.escalationDefaultAction || "defer";
236
+ if (!config.escalationChatId) {
237
+ ctx.logger.warn("Escalation received but no escalationChatId configured");
238
+ return { error: "No escalation channel configured" };
239
+ }
240
+ const escalationEvent = {
241
+ escalationId,
242
+ agentId: runCtx.agentId,
243
+ companyId: runCtx.companyId,
244
+ reason: p.reason,
245
+ context: {
246
+ conversationHistory: [],
247
+ agentReasoning: String(p.conversationSummary ?? ""),
248
+ suggestedActions: p.suggestedActions ?? [],
249
+ suggestedReply: p.suggestedReply ? String(p.suggestedReply) : undefined,
250
+ confidenceScore: typeof p.confidenceScore === "number" ? p.confidenceScore : undefined,
251
+ },
252
+ timeout: {
253
+ durationMs: timeoutMs,
254
+ defaultAction,
255
+ },
256
+ originChatId: p.originChatId ? String(p.originChatId) : undefined,
257
+ originThreadId: p.originThreadId ? String(p.originThreadId) : undefined,
258
+ originMessageId: p.originMessageId ? String(p.originMessageId) : undefined,
259
+ transport: p.transport,
260
+ sessionId: p.sessionId ? String(p.sessionId) : undefined,
261
+ };
262
+ await escalationManager.create(ctx, token, escalationEvent, config.escalationChatId);
263
+ // Send hold message to the originating chat if configured
264
+ if (config.escalationHoldMessage && escalationEvent.originChatId) {
265
+ const holdText = escapeMarkdownV2(config.escalationHoldMessage);
266
+ await sendMessage(ctx, token, escalationEvent.originChatId, holdText, {
267
+ parseMode: "MarkdownV2",
268
+ messageThreadId: escalationEvent.originThreadId ? Number(escalationEvent.originThreadId) : undefined,
269
+ replyToMessageId: escalationEvent.originMessageId ? Number(escalationEvent.originMessageId) : undefined,
270
+ });
271
+ }
272
+ return { content: JSON.stringify({ status: "escalated", escalationId }) };
273
+ });
274
+ // --- Phase 2: Register handoff_to_agent tool ---
275
+ ctx.tools.register("handoff_to_agent", {
276
+ displayName: "Handoff to Agent",
277
+ description: "Hand off work to another agent in this thread",
278
+ parametersSchema: {
279
+ type: "object",
280
+ properties: {
281
+ targetAgent: { type: "string", description: "Name of agent to hand off to" },
282
+ reason: { type: "string", description: "Why you're handing off" },
283
+ contextSummary: { type: "string", description: "Summary for the target agent" },
284
+ requiresApproval: { type: "boolean", default: true, description: "Wait for human approval before target starts" },
285
+ chatId: { type: "string", description: "Telegram chat ID" },
286
+ threadId: { type: "number", description: "Telegram thread ID" },
287
+ },
288
+ required: ["targetAgent", "reason", "contextSummary"],
289
+ },
290
+ }, async (params, runCtx) => {
291
+ return handleHandoffToolCall(ctx, token, params, runCtx.companyId, runCtx.agentId);
292
+ });
293
+ // --- Phase 2: Register discuss_with_agent tool ---
294
+ ctx.tools.register("discuss_with_agent", {
295
+ displayName: "Discuss with Agent",
296
+ description: "Start a back-and-forth conversation with another agent",
297
+ parametersSchema: {
298
+ type: "object",
299
+ properties: {
300
+ targetAgent: { type: "string", description: "Name of agent to discuss with" },
301
+ topic: { type: "string", description: "Discussion topic" },
302
+ initialMessage: { type: "string", description: "First message to send" },
303
+ maxTurns: { type: "number", default: 10, description: "Maximum conversation turns" },
304
+ humanCheckpointAt: { type: "number", description: "Pause for human approval at this turn" },
305
+ chatId: { type: "string", description: "Telegram chat ID" },
306
+ threadId: { type: "number", description: "Telegram thread ID" },
307
+ },
308
+ required: ["targetAgent", "topic", "initialMessage"],
309
+ },
310
+ }, async (params, runCtx) => {
311
+ return handleDiscussToolCall(ctx, token, params, runCtx.companyId, runCtx.agentId);
312
+ });
313
+ // --- Phase 5: Register register_watch tool ---
314
+ ctx.tools.register("register_watch", {
315
+ displayName: "Register Watch",
316
+ description: "Register a proactive watch that monitors entities and sends suggestions",
317
+ parametersSchema: {
318
+ type: "object",
319
+ properties: {
320
+ name: { type: "string", description: "Name of the watch" },
321
+ description: { type: "string", description: "What this watch monitors" },
322
+ entityType: { type: "string", enum: ["issue", "agent", "company", "custom"], description: "Type of entity to watch" },
323
+ conditions: {
324
+ type: "array",
325
+ items: {
326
+ type: "object",
327
+ properties: {
328
+ field: { type: "string" },
329
+ operator: { type: "string", enum: ["gt", "lt", "eq", "ne", "contains", "exists"] },
330
+ value: {},
331
+ },
332
+ required: ["field", "operator", "value"],
333
+ },
334
+ description: "Conditions that trigger the watch",
335
+ },
336
+ template: { type: "string", description: "Message template with {{field}} placeholders" },
337
+ builtinTemplate: { type: "string", enum: ["invoice-overdue", "lead-stale"], description: "Use a built-in template instead" },
338
+ chatId: { type: "string", description: "Telegram chat ID for suggestions" },
339
+ threadId: { type: "number", description: "Telegram thread ID for suggestions" },
340
+ },
341
+ required: ["chatId"],
342
+ },
343
+ }, async (params, runCtx) => {
344
+ return handleRegisterWatch(ctx, params, runCtx.companyId);
345
+ });
346
+ // --- Phase 1: Escalation timeout checker job ---
347
+ ctx.jobs.register("check-escalation-timeouts", async () => {
348
+ try {
349
+ await escalationManager.checkTimeouts(ctx, token);
350
+ }
351
+ catch (err) {
352
+ ctx.logger.error("Escalation timeout check failed", { error: String(err) });
353
+ }
354
+ });
355
+ // --- Phase 5: Watch checker job ---
356
+ ctx.jobs.register("check-watches", async () => {
357
+ try {
358
+ await checkWatches(ctx, token, {
359
+ maxSuggestionsPerHourPerCompany: config.maxSuggestionsPerHourPerCompany ?? 10,
360
+ watchDeduplicationWindowMs: config.watchDeduplicationWindowMs ?? 86400000,
361
+ });
362
+ }
363
+ catch (err) {
364
+ ctx.logger.error("Watch check failed", { error: String(err) });
365
+ }
366
+ });
367
+ ctx.logger.info("Telegram bot plugin started (Chat OS v2 - all 5 phases)");
368
+ },
369
+ async onValidateConfig(config) {
370
+ if (!config.telegramBotTokenRef || typeof config.telegramBotTokenRef !== "string") {
371
+ return { ok: false, errors: ["telegramBotTokenRef is required"] };
372
+ }
373
+ if (!config.defaultChatId || typeof config.defaultChatId !== "string") {
374
+ return { ok: false, errors: ["defaultChatId is required"] };
375
+ }
376
+ return { ok: true };
377
+ },
378
+ async onHealth() {
379
+ return { status: "ok" };
380
+ },
381
+ });
382
+ async function handleUpdate(ctx, token, config, update, baseUrl) {
383
+ if (update.callback_query) {
384
+ await handleCallbackQuery(ctx, token, update.callback_query, baseUrl);
385
+ return;
386
+ }
387
+ const msg = update.message;
388
+ if (!msg)
389
+ return;
390
+ const chatId = String(msg.chat.id);
391
+ const threadId = msg.message_thread_id;
392
+ // Phase 3: Handle media messages
393
+ const hasMedia = !!(msg.voice || msg.audio || msg.video_note || msg.document || msg.photo);
394
+ if (hasMedia) {
395
+ const companyId = await resolveCompanyId(ctx, chatId);
396
+ const handled = await handleMediaMessage(ctx, token, msg, {
397
+ briefAgentId: config.briefAgentId ?? "",
398
+ briefAgentChatIds: config.briefAgentChatIds ?? [],
399
+ transcriptionApiKeyRef: config.transcriptionApiKeyRef ?? "",
400
+ }, companyId);
401
+ if (handled)
402
+ return;
403
+ }
404
+ if (!msg.text)
405
+ return;
406
+ const text = msg.text;
407
+ // Route thread messages to agent sessions
408
+ if (threadId) {
409
+ const isCommand = text.startsWith("/");
410
+ if (!isCommand) {
411
+ const companyId = await resolveCompanyId(ctx, chatId);
412
+ const replyToId = msg.reply_to_message?.message_id;
413
+ const routed = await routeMessageToAgent(ctx, token, chatId, threadId, text, replyToId, companyId);
414
+ if (routed)
415
+ return;
416
+ }
417
+ }
418
+ const botCommand = msg.entities?.find((e) => e.type === "bot_command" && e.offset === 0);
419
+ if (botCommand && config.enableCommands) {
420
+ const fullCommand = text.slice(botCommand.offset, botCommand.offset + botCommand.length);
421
+ const command = fullCommand.replace(/^\//, "").replace(/@.*$/, "");
422
+ const args = text.slice(botCommand.offset + botCommand.length).trim();
423
+ const companyId = await resolveCompanyId(ctx, chatId);
424
+ // Phase 4: Check custom commands first
425
+ if (command === "commands") {
426
+ await handleCommandsCommand(ctx, token, chatId, args, threadId, companyId);
427
+ return;
428
+ }
429
+ const handledCustom = await tryCustomCommand(ctx, token, chatId, command, args, threadId, companyId);
430
+ if (handledCustom)
431
+ return;
432
+ // Built-in commands
433
+ await handleCommand(ctx, token, chatId, command, args, threadId, baseUrl);
434
+ return;
435
+ }
436
+ if (config.enableInbound && msg.reply_to_message?.from?.is_bot) {
437
+ const replyToId = msg.reply_to_message.message_id;
438
+ const mapping = await ctx.state.get({
439
+ scopeKind: "instance",
440
+ stateKey: `msg_${chatId}_${replyToId}`,
441
+ });
442
+ if (mapping && mapping.entityType === "escalation") {
443
+ const escalationManager = new EscalationManager();
444
+ const responderId = `telegram:${msg.from?.username ?? msg.from?.id ?? chatId}`;
445
+ await escalationManager.respond(ctx, token, mapping.entityId, {
446
+ escalationId: mapping.entityId,
447
+ responderId,
448
+ responseText: text,
449
+ action: "reply_to_customer",
450
+ });
451
+ await ctx.metrics.write(METRIC_NAMES.inboundRouted, 1);
452
+ ctx.logger.info("Routed Telegram reply to escalation", {
453
+ escalationId: mapping.entityId,
454
+ from: msg.from?.username,
455
+ });
456
+ }
457
+ else if (mapping && mapping.entityType === "issue") {
458
+ try {
459
+ await ctx.http.fetch(`${baseUrl}/api/issues/${mapping.entityId}/comments`, {
460
+ method: "POST",
461
+ headers: { "Content-Type": "application/json" },
462
+ body: JSON.stringify({
463
+ body: text,
464
+ authorUserId: `telegram:${msg.from?.username ?? msg.from?.id ?? chatId}`,
465
+ }),
466
+ });
467
+ await ctx.metrics.write(METRIC_NAMES.inboundRouted, 1);
468
+ ctx.logger.info("Routed Telegram reply to issue comment", {
469
+ issueId: mapping.entityId,
470
+ from: msg.from?.username,
471
+ });
472
+ }
473
+ catch (err) {
474
+ ctx.logger.error("Failed to route inbound message", { error: String(err) });
475
+ }
476
+ }
477
+ }
478
+ }
479
+ async function handleCallbackQuery(ctx, token, query, baseUrl) {
480
+ const data = query.data;
481
+ if (!data)
482
+ return;
483
+ const actor = query.from.username ?? query.from.first_name ?? String(query.from.id);
484
+ const chatId = query.message?.chat.id ? String(query.message.chat.id) : null;
485
+ const messageId = query.message?.message_id;
486
+ if (data.startsWith("approve_")) {
487
+ const approvalId = data.replace("approve_", "");
488
+ ctx.logger.info("Approval button clicked", { approvalId, actor });
489
+ try {
490
+ await ctx.http.fetch(`${baseUrl}/api/approvals/${approvalId}/approve`, {
491
+ method: "POST",
492
+ headers: { "Content-Type": "application/json" },
493
+ body: JSON.stringify({ decidedByUserId: `telegram:${actor}` }),
494
+ });
495
+ await answerCallbackQuery(ctx, token, query.id, "Approved");
496
+ if (chatId && messageId) {
497
+ await editMessage(ctx, token, chatId, messageId, `${escapeMarkdownV2("\u2705")} *Approved* by ${escapeMarkdownV2(actor)}`, { parseMode: "MarkdownV2" });
498
+ }
499
+ }
500
+ catch (err) {
501
+ await answerCallbackQuery(ctx, token, query.id, `Failed: ${String(err)}`);
502
+ }
503
+ return;
504
+ }
505
+ if (data.startsWith("esc_")) {
506
+ const parts = data.split("_");
507
+ const action = parts[1] ?? "";
508
+ const escalationId = parts.slice(2).join("_");
509
+ const escalationManager = new EscalationManager();
510
+ await escalationManager.handleCallback(ctx, token, action, escalationId, actor, query.id, chatId, messageId);
511
+ await answerCallbackQuery(ctx, token, query.id, `Escalation: ${action}`);
512
+ return;
513
+ }
514
+ if (data.startsWith("reject_")) {
515
+ const approvalId = data.replace("reject_", "");
516
+ ctx.logger.info("Rejection button clicked", { approvalId, actor });
517
+ try {
518
+ await ctx.http.fetch(`${baseUrl}/api/approvals/${approvalId}/reject`, {
519
+ method: "POST",
520
+ headers: { "Content-Type": "application/json" },
521
+ body: JSON.stringify({ decidedByUserId: `telegram:${actor}` }),
522
+ });
523
+ await answerCallbackQuery(ctx, token, query.id, "Rejected");
524
+ if (chatId && messageId) {
525
+ await editMessage(ctx, token, chatId, messageId, `${escapeMarkdownV2("\u274c")} *Rejected* by ${escapeMarkdownV2(actor)}`, { parseMode: "MarkdownV2" });
526
+ }
527
+ }
528
+ catch (err) {
529
+ await answerCallbackQuery(ctx, token, query.id, `Failed: ${String(err)}`);
530
+ }
531
+ return;
532
+ }
533
+ if (data.startsWith("handoff_approve_")) {
534
+ const handoffId = data.replace("handoff_approve_", "");
535
+ await handleHandoffApproval(ctx, token, handoffId, actor, query.id, chatId, messageId);
536
+ await answerCallbackQuery(ctx, token, query.id, "Handoff approved");
537
+ return;
538
+ }
539
+ if (data.startsWith("handoff_reject_")) {
540
+ const handoffId = data.replace("handoff_reject_", "");
541
+ await handleHandoffRejection(ctx, token, handoffId, actor, query.id, chatId, messageId);
542
+ await answerCallbackQuery(ctx, token, query.id, "Handoff rejected");
543
+ return;
544
+ }
545
+ await answerCallbackQuery(ctx, token, query.id, "Unknown action");
546
+ }
547
+ runWorker(plugin, import.meta.url);
548
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperclip-plugin-telegram",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "paperclipPlugin": {
@@ -11,7 +11,8 @@
11
11
  "build": "tsc",
12
12
  "typecheck": "tsc --noEmit",
13
13
  "dev": "tsc --watch",
14
- "test": "vitest run"
14
+ "test": "vitest run",
15
+ "prepublishOnly": "npm run build"
15
16
  },
16
17
  "peerDependencies": {
17
18
  "@paperclipai/plugin-sdk": ">=2026.0.0",
@@ -22,5 +23,8 @@
22
23
  "@paperclipai/shared": "^2026.318.0",
23
24
  "typescript": "^5.7.0",
24
25
  "vitest": "^3.0.0"
25
- }
26
+ },
27
+ "files": [
28
+ "dist/"
29
+ ]
26
30
  }