paperclip-plugin-telegram 0.1.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.
@@ -0,0 +1,130 @@
1
+ import { escapeMarkdownV2, truncateAtWord } from "./telegram-api.js";
2
+ function esc(s) {
3
+ return escapeMarkdownV2(s);
4
+ }
5
+ function bold(s) {
6
+ return `*${esc(s)}*`;
7
+ }
8
+ function code(s) {
9
+ return `\`${esc(s)}\``;
10
+ }
11
+ export function formatIssueCreated(event) {
12
+ const p = event.payload;
13
+ const identifier = String(p.identifier ?? event.entityId);
14
+ const title = String(p.title ?? "Untitled");
15
+ const status = p.status ? String(p.status) : null;
16
+ const priority = p.priority ? String(p.priority) : null;
17
+ const assigneeName = p.assigneeName ? String(p.assigneeName) : null;
18
+ const projectName = p.projectName ? String(p.projectName) : null;
19
+ const lines = [
20
+ `${esc("📋")} ${bold("Issue Created")}: ${bold(identifier)}`,
21
+ bold(title),
22
+ ];
23
+ const meta = [];
24
+ if (status)
25
+ meta.push(`Status: ${code(status)}`);
26
+ if (priority)
27
+ meta.push(`Priority: ${code(priority)}`);
28
+ if (assigneeName)
29
+ meta.push(`Assignee: ${esc(assigneeName)}`);
30
+ if (projectName)
31
+ meta.push(`Project: ${esc(projectName)}`);
32
+ if (meta.length > 0)
33
+ lines.push(meta.join(" \\| "));
34
+ if (p.description) {
35
+ const desc = truncateAtWord(String(p.description), 200);
36
+ lines.push(`\n${esc(">")} ${esc(desc)}`);
37
+ }
38
+ return {
39
+ text: lines.join("\n"),
40
+ options: { parseMode: "MarkdownV2" },
41
+ };
42
+ }
43
+ export function formatIssueDone(event) {
44
+ const p = event.payload;
45
+ const identifier = String(p.identifier ?? event.entityId);
46
+ const title = String(p.title ?? "");
47
+ return {
48
+ text: [
49
+ `${esc("✅")} ${bold("Issue Completed")}: ${bold(identifier)}`,
50
+ `${bold(title)} ${esc("is now done.")}`,
51
+ ].join("\n"),
52
+ options: { parseMode: "MarkdownV2" },
53
+ };
54
+ }
55
+ export function formatApprovalCreated(event) {
56
+ const p = event.payload;
57
+ const approvalType = String(p.type ?? "unknown");
58
+ const approvalId = String(p.approvalId ?? event.entityId);
59
+ const title = String(p.title ?? "Approval Requested");
60
+ const description = p.description ? String(p.description) : null;
61
+ const agentName = p.agentName ? String(p.agentName) : null;
62
+ const lines = [
63
+ `${esc("🔔")} ${bold("Approval Requested")}`,
64
+ bold(title),
65
+ ];
66
+ if (agentName)
67
+ lines.push(`Agent: ${esc(agentName)} \\| Type: ${code(approvalType)}`);
68
+ if (description)
69
+ lines.push(`\n${esc(truncateAtWord(description, 300))}`);
70
+ // Add linked issues if present
71
+ const linkedIssues = Array.isArray(p.linkedIssues) ? p.linkedIssues : [];
72
+ if (linkedIssues.length > 0) {
73
+ lines.push(`\n${bold(`Linked Issues (${String(linkedIssues.length)})`)}`);
74
+ for (const issue of linkedIssues.slice(0, 5)) {
75
+ const issueParts = [`${bold(String(issue.identifier ?? "?"))} ${esc(String(issue.title ?? ""))}`];
76
+ const issueMeta = [];
77
+ if (issue.status)
78
+ issueMeta.push(String(issue.status));
79
+ if (issue.priority)
80
+ issueMeta.push(String(issue.priority));
81
+ if (issue.assignee)
82
+ issueMeta.push(`-> ${String(issue.assignee)}`);
83
+ if (issueMeta.length > 0)
84
+ issueParts.push(`\\(${esc(issueMeta.join(" | "))}\\)`);
85
+ lines.push(issueParts.join(" "));
86
+ }
87
+ }
88
+ return {
89
+ text: lines.join("\n"),
90
+ options: {
91
+ parseMode: "MarkdownV2",
92
+ inlineKeyboard: [
93
+ [
94
+ { text: "Approve", callback_data: `approve_${approvalId}` },
95
+ { text: "Reject", callback_data: `reject_${approvalId}` },
96
+ ],
97
+ ],
98
+ },
99
+ };
100
+ }
101
+ export function formatAgentError(event) {
102
+ const p = event.payload;
103
+ const agentName = String(p.agentName ?? p.name ?? event.entityId);
104
+ const errorMessage = String(p.error ?? p.message ?? "Unknown error");
105
+ return {
106
+ text: [
107
+ `${esc("❌")} ${bold("Agent Error")}`,
108
+ `${bold(agentName)} ${esc("encountered an error")}`,
109
+ `\n${code(truncateAtWord(errorMessage, 500))}`,
110
+ ].join("\n"),
111
+ options: { parseMode: "MarkdownV2" },
112
+ };
113
+ }
114
+ export function formatAgentRunStarted(event) {
115
+ const p = event.payload;
116
+ const agentName = String(p.agentName ?? event.entityId);
117
+ return {
118
+ text: `${esc("▶️")} ${bold(agentName)} ${esc("started a new run")}`,
119
+ options: { parseMode: "MarkdownV2", disableNotification: true },
120
+ };
121
+ }
122
+ export function formatAgentRunFinished(event) {
123
+ const p = event.payload;
124
+ const agentName = String(p.agentName ?? event.entityId);
125
+ return {
126
+ text: `${esc("⏹️")} ${bold(agentName)} ${esc("completed successfully")}`,
127
+ options: { parseMode: "MarkdownV2", disableNotification: true },
128
+ };
129
+ }
130
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { default as manifest } from "./manifest.js";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { default as manifest } from "./manifest.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PaperclipPluginManifestV1 } from "@paperclipai/plugin-sdk";
2
+ declare const manifest: PaperclipPluginManifestV1;
3
+ export default manifest;
@@ -0,0 +1,125 @@
1
+ import { DEFAULT_CONFIG, PLUGIN_ID, PLUGIN_VERSION } from "./constants.js";
2
+ const manifest = {
3
+ id: PLUGIN_ID,
4
+ apiVersion: 1,
5
+ version: PLUGIN_VERSION,
6
+ displayName: "Telegram Bot",
7
+ description: "Bidirectional Telegram integration: push notifications on agent events, receive bot commands, approve requests with inline buttons, and route forum topics to projects.",
8
+ author: "mvanhorn",
9
+ categories: ["connector", "automation"],
10
+ capabilities: [
11
+ "companies.read",
12
+ "issues.read",
13
+ "issues.create",
14
+ "agents.read",
15
+ "events.subscribe",
16
+ "plugin.state.read",
17
+ "plugin.state.write",
18
+ "http.outbound",
19
+ "secrets.read-ref",
20
+ "activity.log.write",
21
+ "metrics.write",
22
+ "jobs.schedule",
23
+ "events.emit",
24
+ "events.subscribe",
25
+ ],
26
+ entrypoints: {
27
+ worker: "./dist/worker.js",
28
+ },
29
+ instanceConfigSchema: {
30
+ type: "object",
31
+ properties: {
32
+ telegramBotTokenRef: {
33
+ type: "string",
34
+ title: "Telegram Bot Token (secret reference)",
35
+ description: "Reference to the Telegram Bot token stored in your secret provider. Get one from @BotFather.",
36
+ default: DEFAULT_CONFIG.telegramBotTokenRef,
37
+ },
38
+ defaultChatId: {
39
+ type: "string",
40
+ title: "Default Chat ID",
41
+ description: "Telegram chat ID to send notifications to. Use a group chat ID (negative number) or a user chat ID.",
42
+ default: DEFAULT_CONFIG.defaultChatId,
43
+ },
44
+ approvalsChatId: {
45
+ type: "string",
46
+ title: "Approvals Chat ID",
47
+ description: "Chat ID for approval requests. Falls back to default chat.",
48
+ default: DEFAULT_CONFIG.approvalsChatId,
49
+ },
50
+ errorsChatId: {
51
+ type: "string",
52
+ title: "Errors Chat ID",
53
+ description: "Chat ID for agent error notifications. Falls back to default chat.",
54
+ default: DEFAULT_CONFIG.errorsChatId,
55
+ },
56
+ notifyOnIssueCreated: {
57
+ type: "boolean",
58
+ title: "Notify on issue created",
59
+ default: DEFAULT_CONFIG.notifyOnIssueCreated,
60
+ },
61
+ notifyOnIssueDone: {
62
+ type: "boolean",
63
+ title: "Notify on issue completed",
64
+ default: DEFAULT_CONFIG.notifyOnIssueDone,
65
+ },
66
+ notifyOnApprovalCreated: {
67
+ type: "boolean",
68
+ title: "Notify on approval requested",
69
+ default: DEFAULT_CONFIG.notifyOnApprovalCreated,
70
+ },
71
+ notifyOnAgentError: {
72
+ type: "boolean",
73
+ title: "Notify on agent error",
74
+ default: DEFAULT_CONFIG.notifyOnAgentError,
75
+ },
76
+ enableCommands: {
77
+ type: "boolean",
78
+ title: "Enable bot commands",
79
+ description: "Allow users to interact with Paperclip via Telegram bot commands (/status, /issues, /agents).",
80
+ default: DEFAULT_CONFIG.enableCommands,
81
+ },
82
+ enableInbound: {
83
+ type: "boolean",
84
+ title: "Enable inbound message routing",
85
+ description: "Route Telegram messages to Paperclip issue comments. Messages sent in reply to a notification get attached to that issue.",
86
+ default: DEFAULT_CONFIG.enableInbound,
87
+ },
88
+ dailyDigestEnabled: {
89
+ type: "boolean",
90
+ title: "Daily digest",
91
+ description: "Send a daily summary of agent activity.",
92
+ default: DEFAULT_CONFIG.dailyDigestEnabled,
93
+ },
94
+ dailyDigestTime: {
95
+ type: "string",
96
+ title: "Digest time (HH:MM UTC)",
97
+ description: "Time to send the daily digest in UTC.",
98
+ default: DEFAULT_CONFIG.dailyDigestTime,
99
+ },
100
+ topicRouting: {
101
+ type: "boolean",
102
+ title: "Forum topic routing",
103
+ description: "Map Telegram forum topics to Paperclip projects. Requires the bot to be in a group with forum topics enabled.",
104
+ default: DEFAULT_CONFIG.topicRouting,
105
+ },
106
+ paperclipBaseUrl: {
107
+ type: "string",
108
+ title: "Paperclip Base URL",
109
+ description: "Base URL of the Paperclip API server.",
110
+ default: DEFAULT_CONFIG.paperclipBaseUrl,
111
+ },
112
+ },
113
+ required: ["telegramBotTokenRef", "defaultChatId"],
114
+ },
115
+ jobs: [
116
+ {
117
+ jobKey: "telegram-daily-digest",
118
+ displayName: "Telegram Daily Digest",
119
+ description: "Send a daily summary of agent activity to Telegram.",
120
+ schedule: "0 9 * * *",
121
+ },
122
+ ],
123
+ };
124
+ export default manifest;
125
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { PluginContext } from "@paperclipai/plugin-sdk";
2
+ type InlineButton = {
3
+ text: string;
4
+ callback_data?: string;
5
+ url?: string;
6
+ };
7
+ type InlineKeyboard = InlineButton[][];
8
+ export type SendMessageOptions = {
9
+ parseMode?: "MarkdownV2" | "HTML";
10
+ replyToMessageId?: number;
11
+ messageThreadId?: number;
12
+ inlineKeyboard?: InlineKeyboard;
13
+ disableNotification?: boolean;
14
+ };
15
+ export declare function sendMessage(ctx: PluginContext, token: string, chatId: string, text: string, options?: SendMessageOptions): Promise<number | null>;
16
+ export declare function editMessage(ctx: PluginContext, token: string, chatId: string, messageId: number, text: string, options?: {
17
+ parseMode?: "MarkdownV2" | "HTML";
18
+ inlineKeyboard?: InlineKeyboard;
19
+ }): Promise<boolean>;
20
+ export declare function answerCallbackQuery(ctx: PluginContext, token: string, callbackQueryId: string, text: string): Promise<void>;
21
+ export declare function setMyCommands(ctx: PluginContext, token: string, commands: Array<{
22
+ command: string;
23
+ description: string;
24
+ }>): Promise<boolean>;
25
+ export declare function sendChatAction(ctx: PluginContext, token: string, chatId: string, action?: "typing"): Promise<void>;
26
+ export declare function escapeMarkdownV2(text: string): string;
27
+ export declare function truncateAtWord(text: string, maxLen: number): string;
28
+ export {};
@@ -0,0 +1,147 @@
1
+ import { METRIC_NAMES } from "./constants.js";
2
+ const TELEGRAM_API = "https://api.telegram.org";
3
+ export async function sendMessage(ctx, token, chatId, text, options = {}) {
4
+ const body = {
5
+ chat_id: chatId,
6
+ text,
7
+ };
8
+ if (options.parseMode)
9
+ body.parse_mode = options.parseMode;
10
+ if (options.replyToMessageId)
11
+ body.reply_to_message_id = options.replyToMessageId;
12
+ if (options.messageThreadId)
13
+ body.message_thread_id = options.messageThreadId;
14
+ if (options.disableNotification)
15
+ body.disable_notification = true;
16
+ if (options.inlineKeyboard) {
17
+ body.reply_markup = {
18
+ inline_keyboard: options.inlineKeyboard,
19
+ };
20
+ }
21
+ for (let attempt = 0; attempt < 3; attempt++) {
22
+ try {
23
+ const res = await ctx.http.fetch(`${TELEGRAM_API}/bot${token}/sendMessage`, {
24
+ method: "POST",
25
+ headers: { "Content-Type": "application/json" },
26
+ body: JSON.stringify(body),
27
+ });
28
+ const data = (await res.json());
29
+ if (!data.ok) {
30
+ if (data.parameters?.retry_after && attempt < 2) {
31
+ const wait = data.parameters.retry_after * 1000;
32
+ ctx.logger.warn("Telegram rate limited, retrying", { retryAfter: data.parameters.retry_after, attempt });
33
+ await new Promise((r) => setTimeout(r, wait));
34
+ continue;
35
+ }
36
+ if (options.parseMode === "MarkdownV2") {
37
+ ctx.logger.warn("MarkdownV2 send failed, retrying as plain text", {
38
+ error: data.description,
39
+ });
40
+ return sendMessage(ctx, token, chatId, stripMarkdown(text), {
41
+ ...options,
42
+ parseMode: undefined,
43
+ });
44
+ }
45
+ ctx.logger.error("Telegram sendMessage failed", { error: data.description });
46
+ await ctx.metrics.write(METRIC_NAMES.failed, 1);
47
+ return null;
48
+ }
49
+ await ctx.metrics.write(METRIC_NAMES.sent, 1);
50
+ return data.result?.message_id ?? null;
51
+ }
52
+ catch (err) {
53
+ ctx.logger.error("Telegram API error", { error: String(err) });
54
+ await ctx.metrics.write(METRIC_NAMES.failed, 1);
55
+ return null;
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ export async function editMessage(ctx, token, chatId, messageId, text, options = {}) {
61
+ const body = {
62
+ chat_id: chatId,
63
+ message_id: messageId,
64
+ text,
65
+ };
66
+ if (options.parseMode)
67
+ body.parse_mode = options.parseMode;
68
+ if (options.inlineKeyboard) {
69
+ body.reply_markup = { inline_keyboard: options.inlineKeyboard };
70
+ }
71
+ else {
72
+ body.reply_markup = { inline_keyboard: [] };
73
+ }
74
+ try {
75
+ const res = await ctx.http.fetch(`${TELEGRAM_API}/bot${token}/editMessageText`, {
76
+ method: "POST",
77
+ headers: { "Content-Type": "application/json" },
78
+ body: JSON.stringify(body),
79
+ });
80
+ const data = (await res.json());
81
+ return data.ok;
82
+ }
83
+ catch (err) {
84
+ ctx.logger.error("Telegram editMessage failed", { error: String(err) });
85
+ return false;
86
+ }
87
+ }
88
+ export async function answerCallbackQuery(ctx, token, callbackQueryId, text) {
89
+ try {
90
+ await ctx.http.fetch(`${TELEGRAM_API}/bot${token}/answerCallbackQuery`, {
91
+ method: "POST",
92
+ headers: { "Content-Type": "application/json" },
93
+ body: JSON.stringify({
94
+ callback_query_id: callbackQueryId,
95
+ text,
96
+ }),
97
+ });
98
+ }
99
+ catch (err) {
100
+ ctx.logger.error("Telegram answerCallbackQuery failed", { error: String(err) });
101
+ }
102
+ }
103
+ export async function setMyCommands(ctx, token, commands) {
104
+ try {
105
+ const res = await ctx.http.fetch(`${TELEGRAM_API}/bot${token}/setMyCommands`, {
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json" },
108
+ body: JSON.stringify({ commands }),
109
+ });
110
+ const data = (await res.json());
111
+ return data.ok;
112
+ }
113
+ catch (err) {
114
+ ctx.logger.error("Telegram setMyCommands failed", { error: String(err) });
115
+ return false;
116
+ }
117
+ }
118
+ export async function sendChatAction(ctx, token, chatId, action = "typing") {
119
+ try {
120
+ await ctx.http.fetch(`${TELEGRAM_API}/bot${token}/sendChatAction`, {
121
+ method: "POST",
122
+ headers: { "Content-Type": "application/json" },
123
+ body: JSON.stringify({ chat_id: chatId, action }),
124
+ });
125
+ }
126
+ catch {
127
+ // Typing indicator failures are non-critical
128
+ }
129
+ }
130
+ // MarkdownV2 requires escaping these characters
131
+ const MD_ESCAPE_CHARS = /([_*\[\]()~`>#+\-=|{}.!\\])/g;
132
+ export function escapeMarkdownV2(text) {
133
+ return text.replace(MD_ESCAPE_CHARS, "\\$1");
134
+ }
135
+ export function truncateAtWord(text, maxLen) {
136
+ if (text.length <= maxLen)
137
+ return text;
138
+ const truncated = text.slice(0, maxLen);
139
+ const lastSpace = truncated.lastIndexOf(" ");
140
+ return (lastSpace > maxLen * 0.7 ? truncated.slice(0, lastSpace) : truncated) + "...";
141
+ }
142
+ function stripMarkdown(text) {
143
+ return text
144
+ .replace(/\\([_*\[\]()~`>#+\-=|{}.!\\])/g, "$1")
145
+ .replace(/[*_`~]/g, "");
146
+ }
147
+ //# sourceMappingURL=telegram-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-api.js","sourceRoot":"","sources":["../src/telegram-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};