paperclip-plugin-telegram 0.1.0 → 0.2.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.
Files changed (48) hide show
  1. package/README.md +19 -3
  2. package/package.json +3 -10
  3. package/src/acp-bridge.ts +1273 -0
  4. package/src/adapter.ts +129 -0
  5. package/src/command-registry.ts +482 -0
  6. package/src/commands.ts +346 -0
  7. package/src/constants.ts +51 -0
  8. package/src/escalation.ts +421 -0
  9. package/src/formatters.ts +148 -0
  10. package/src/index.ts +6 -0
  11. package/src/manifest.ts +246 -0
  12. package/src/media-pipeline.ts +234 -0
  13. package/src/telegram-api.ts +202 -0
  14. package/src/watch-registry.ts +369 -0
  15. package/src/worker.ts +783 -0
  16. package/tests/acp-bridge.test.ts +314 -0
  17. package/tests/command-registry.test.ts +283 -0
  18. package/tests/commands.test.ts +213 -0
  19. package/tests/escalation.test.ts +550 -0
  20. package/tests/formatters.test.ts +185 -0
  21. package/tests/media-pipeline.test.ts +324 -0
  22. package/tests/telegram-api.test.ts +108 -0
  23. package/tests/watch-registry.test.ts +404 -0
  24. package/tsconfig.json +16 -0
  25. package/dist/acp-bridge.d.ts +0 -12
  26. package/dist/acp-bridge.js +0 -166
  27. package/dist/acp-bridge.js.map +0 -1
  28. package/dist/commands.d.ts +0 -10
  29. package/dist/commands.js +0 -212
  30. package/dist/commands.js.map +0 -1
  31. package/dist/constants.d.ts +0 -24
  32. package/dist/constants.js +0 -25
  33. package/dist/constants.js.map +0 -1
  34. package/dist/formatters.d.ts +0 -13
  35. package/dist/formatters.js +0 -130
  36. package/dist/formatters.js.map +0 -1
  37. package/dist/index.d.ts +0 -1
  38. package/dist/index.js +0 -2
  39. package/dist/index.js.map +0 -1
  40. package/dist/manifest.d.ts +0 -3
  41. package/dist/manifest.js +0 -125
  42. package/dist/manifest.js.map +0 -1
  43. package/dist/telegram-api.d.ts +0 -28
  44. package/dist/telegram-api.js +0 -147
  45. package/dist/telegram-api.js.map +0 -1
  46. package/dist/worker.d.ts +0 -1
  47. package/dist/worker.js +0 -300
  48. package/dist/worker.js.map +0 -1
package/dist/commands.js DELETED
@@ -1,212 +0,0 @@
1
- import { sendMessage, escapeMarkdownV2, sendChatAction } from "./telegram-api.js";
2
- import { METRIC_NAMES } from "./constants.js";
3
- import { handleAcpCommand } from "./acp-bridge.js";
4
- export const BOT_COMMANDS = [
5
- { command: "status", description: "Company health: active agents, open issues" },
6
- { command: "issues", description: "List open issues (optionally by project)" },
7
- { command: "agents", description: "List agents with current status" },
8
- { command: "approve", description: "Approve a pending request by ID" },
9
- { command: "help", description: "Show available commands" },
10
- { command: "acp", description: "Manage ACP coding agent sessions (spawn, status, cancel, close)" },
11
- ];
12
- export async function handleCommand(ctx, token, chatId, command, args, messageThreadId, baseUrl) {
13
- await ctx.metrics.write(METRIC_NAMES.commandsHandled, 1);
14
- switch (command) {
15
- case "status":
16
- await handleStatus(ctx, token, chatId, messageThreadId);
17
- break;
18
- case "issues":
19
- await handleIssues(ctx, token, chatId, args, messageThreadId);
20
- break;
21
- case "agents":
22
- await handleAgents(ctx, token, chatId, messageThreadId);
23
- break;
24
- case "approve":
25
- await handleApprove(ctx, token, chatId, args, messageThreadId, baseUrl);
26
- break;
27
- case "help":
28
- await handleHelp(ctx, token, chatId, messageThreadId);
29
- break;
30
- case "connect":
31
- await handleConnect(ctx, token, chatId, args, messageThreadId);
32
- break;
33
- case "connect-topic":
34
- await handleConnectTopic(ctx, token, chatId, args, messageThreadId);
35
- break;
36
- case "acp":
37
- await handleAcpCommand(ctx, token, chatId, args, messageThreadId);
38
- break;
39
- default:
40
- await sendMessage(ctx, token, chatId, `Unknown command: /${command}. Try /help`, {
41
- messageThreadId,
42
- });
43
- }
44
- }
45
- async function handleStatus(ctx, token, chatId, messageThreadId) {
46
- await sendChatAction(ctx, token, chatId);
47
- try {
48
- const companyId = await resolveCompanyId(ctx, chatId);
49
- const agents = await ctx.agents.list({ companyId });
50
- const activeAgents = agents.filter((a) => a.status === "active");
51
- const issues = await ctx.issues.list({ companyId, limit: 10 });
52
- const doneIssues = issues.filter((i) => i.status === "done");
53
- const lines = [
54
- escapeMarkdownV2("📊") + " *Paperclip Status*",
55
- "",
56
- `${escapeMarkdownV2("🤖")} Active agents: *${activeAgents.length}*/${escapeMarkdownV2(String(agents.length))}`,
57
- `${escapeMarkdownV2("📋")} Recent issues: *${escapeMarkdownV2(String(issues.length))}* \\(${escapeMarkdownV2(String(doneIssues.length))} done\\)`,
58
- ];
59
- await sendMessage(ctx, token, chatId, lines.join("\n"), {
60
- parseMode: "MarkdownV2",
61
- messageThreadId,
62
- });
63
- }
64
- catch {
65
- await sendMessage(ctx, token, chatId, escapeMarkdownV2("📊") + " *Paperclip Status*\n\n" + escapeMarkdownV2("Could not fetch status. Make sure this chat is linked to a company with /connect."), {
66
- parseMode: "MarkdownV2",
67
- messageThreadId,
68
- });
69
- }
70
- }
71
- async function handleIssues(ctx, token, chatId, projectFilter, messageThreadId) {
72
- await sendChatAction(ctx, token, chatId);
73
- try {
74
- const companyId = await resolveCompanyId(ctx, chatId);
75
- const issues = await ctx.issues.list({ companyId, limit: 10 });
76
- const filtered = projectFilter
77
- ? issues.filter((i) => {
78
- const projName = i.project?.name ?? "";
79
- return projName.toLowerCase().includes(projectFilter.toLowerCase());
80
- })
81
- : issues;
82
- if (filtered.length === 0) {
83
- const filter = projectFilter ? ` for project "${projectFilter}"` : "";
84
- await sendMessage(ctx, token, chatId, `No issues found${filter}.`, { messageThreadId });
85
- return;
86
- }
87
- const statusEmoji = { done: "✅", todo: "📋", in_progress: "🔄", backlog: "📥" };
88
- const lines = [escapeMarkdownV2("📋") + " *Open Issues*", ""];
89
- for (const issue of filtered) {
90
- const emoji = statusEmoji[issue.status] ?? "📋";
91
- const id = issue.identifier ?? issue.id;
92
- lines.push(`${escapeMarkdownV2(emoji)} ${escapeMarkdownV2(id)} \\- ${escapeMarkdownV2(issue.title)}`);
93
- }
94
- await sendMessage(ctx, token, chatId, lines.join("\n"), {
95
- parseMode: "MarkdownV2",
96
- messageThreadId,
97
- });
98
- }
99
- catch {
100
- const filter = projectFilter ? ` for project "${projectFilter}"` : "";
101
- await sendMessage(ctx, token, chatId, `Could not fetch issues${filter}. Make sure this chat is linked with /connect.`, { messageThreadId });
102
- }
103
- }
104
- async function handleAgents(ctx, token, chatId, messageThreadId) {
105
- await sendChatAction(ctx, token, chatId);
106
- try {
107
- const companyId = await resolveCompanyId(ctx, chatId);
108
- const agents = await ctx.agents.list({ companyId });
109
- if (agents.length === 0) {
110
- await sendMessage(ctx, token, chatId, "No agents found.", { messageThreadId });
111
- return;
112
- }
113
- const statusEmoji = { active: "🟢", error: "🔴", paused: "🟡", idle: "⚪", running: "🔵" };
114
- const lines = [escapeMarkdownV2("🤖") + " *Agents*", ""];
115
- for (const agent of agents) {
116
- const emoji = statusEmoji[agent.status] ?? "⚪";
117
- lines.push(`${escapeMarkdownV2(emoji)} *${escapeMarkdownV2(agent.name)}* \\- ${escapeMarkdownV2(agent.status)}`);
118
- }
119
- await sendMessage(ctx, token, chatId, lines.join("\n"), {
120
- parseMode: "MarkdownV2",
121
- messageThreadId,
122
- });
123
- }
124
- catch {
125
- await sendMessage(ctx, token, chatId, "Could not fetch agents. Make sure this chat is linked with /connect.", { messageThreadId });
126
- }
127
- }
128
- async function handleApprove(ctx, token, chatId, approvalId, messageThreadId, baseUrl = "http://localhost:3100") {
129
- if (!approvalId.trim()) {
130
- await sendMessage(ctx, token, chatId, "Usage: /approve <approval-id>", {
131
- messageThreadId,
132
- });
133
- return;
134
- }
135
- try {
136
- await ctx.http.fetch(`${baseUrl}/api/approvals/${approvalId.trim()}/approve`, {
137
- method: "POST",
138
- headers: { "Content-Type": "application/json" },
139
- body: JSON.stringify({ decidedByUserId: `telegram:${chatId}` }),
140
- });
141
- await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("✅")} *Approved*: \`${escapeMarkdownV2(approvalId.trim())}\``, { parseMode: "MarkdownV2", messageThreadId });
142
- }
143
- catch (err) {
144
- await sendMessage(ctx, token, chatId, `Failed to approve ${approvalId}: ${err instanceof Error ? err.message : String(err)}`, { messageThreadId });
145
- }
146
- }
147
- async function handleHelp(ctx, token, chatId, messageThreadId) {
148
- const lines = [
149
- escapeMarkdownV2("📎") + " *Paperclip Bot Commands*",
150
- "",
151
- ...BOT_COMMANDS.map((cmd) => `/${escapeMarkdownV2(cmd.command)} \\- ${escapeMarkdownV2(cmd.description)}`),
152
- "",
153
- `/${escapeMarkdownV2("connect")} \\- ${escapeMarkdownV2("Link this chat to a Paperclip company")}`,
154
- `/${escapeMarkdownV2("connect-topic")} \\- ${escapeMarkdownV2("Map a project to a forum topic")}`,
155
- ];
156
- await sendMessage(ctx, token, chatId, lines.join("\n"), {
157
- parseMode: "MarkdownV2",
158
- messageThreadId,
159
- });
160
- }
161
- async function handleConnect(ctx, token, chatId, companyName, messageThreadId) {
162
- if (!companyName.trim()) {
163
- await sendMessage(ctx, token, chatId, "Usage: /connect <company-name>", {
164
- messageThreadId,
165
- });
166
- return;
167
- }
168
- await ctx.state.set({ scopeKind: "instance", stateKey: `chat_${chatId}` }, { companyName: companyName.trim(), linkedAt: new Date().toISOString() });
169
- await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("🔗")} ${escapeMarkdownV2("Linked this chat to company:")} *${escapeMarkdownV2(companyName.trim())}*`, { parseMode: "MarkdownV2", messageThreadId });
170
- ctx.logger.info("Chat linked to company", { chatId, companyName: companyName.trim() });
171
- }
172
- export async function handleConnectTopic(ctx, token, chatId, args, messageThreadId) {
173
- const parts = args.trim().split(/\s+/);
174
- if (parts.length < 2) {
175
- await sendMessage(ctx, token, chatId, "Usage: /connect\\-topic <project\\-name> <topic\\-id>", {
176
- parseMode: "MarkdownV2",
177
- messageThreadId,
178
- });
179
- return;
180
- }
181
- const topicId = parts.pop();
182
- const projectName = parts.join(" ");
183
- const existing = (await ctx.state.get({
184
- scopeKind: "instance",
185
- stateKey: `topic-map-${chatId}`,
186
- }));
187
- const topicMap = existing ?? {};
188
- topicMap[projectName] = topicId;
189
- await ctx.state.set({ scopeKind: "instance", stateKey: `topic-map-${chatId}` }, topicMap);
190
- await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("🔗")} ${escapeMarkdownV2(`Mapped project "${projectName}" to topic ${topicId}`)}`, { parseMode: "MarkdownV2", messageThreadId });
191
- ctx.logger.info("Topic mapped", { chatId, projectName, topicId });
192
- }
193
- export async function getTopicForProject(ctx, chatId, projectName) {
194
- if (!projectName)
195
- return undefined;
196
- const topicMap = (await ctx.state.get({
197
- scopeKind: "instance",
198
- stateKey: `topic-map-${chatId}`,
199
- }));
200
- if (!topicMap)
201
- return undefined;
202
- const topicId = topicMap[projectName];
203
- return topicId ? Number(topicId) : undefined;
204
- }
205
- async function resolveCompanyId(ctx, chatId) {
206
- const mapping = await ctx.state.get({
207
- scopeKind: "instance",
208
- stateKey: `chat_${chatId}`,
209
- });
210
- return mapping?.companyName ?? chatId;
211
- }
212
- //# sourceMappingURL=commands.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- export declare const PLUGIN_ID = "paperclip-plugin-telegram";
2
- export declare const PLUGIN_VERSION = "0.1.0";
3
- export declare const DEFAULT_CONFIG: {
4
- readonly telegramBotTokenRef: "";
5
- readonly defaultChatId: "";
6
- readonly approvalsChatId: "";
7
- readonly errorsChatId: "";
8
- readonly paperclipBaseUrl: "http://localhost:3100";
9
- readonly notifyOnIssueCreated: true;
10
- readonly notifyOnIssueDone: true;
11
- readonly notifyOnApprovalCreated: true;
12
- readonly notifyOnAgentError: true;
13
- readonly enableCommands: true;
14
- readonly enableInbound: true;
15
- readonly dailyDigestEnabled: false;
16
- readonly dailyDigestTime: "09:00";
17
- readonly topicRouting: false;
18
- };
19
- export declare const METRIC_NAMES: {
20
- readonly sent: "telegram_notifications_sent";
21
- readonly failed: "telegram_notification_failures";
22
- readonly commandsHandled: "telegram_commands_handled";
23
- readonly inboundRouted: "telegram_inbound_routed";
24
- };
package/dist/constants.js DELETED
@@ -1,25 +0,0 @@
1
- export const PLUGIN_ID = "paperclip-plugin-telegram";
2
- export const PLUGIN_VERSION = "0.1.0";
3
- export const DEFAULT_CONFIG = {
4
- telegramBotTokenRef: "",
5
- defaultChatId: "",
6
- approvalsChatId: "",
7
- errorsChatId: "",
8
- paperclipBaseUrl: "http://localhost:3100",
9
- notifyOnIssueCreated: true,
10
- notifyOnIssueDone: true,
11
- notifyOnApprovalCreated: true,
12
- notifyOnAgentError: true,
13
- enableCommands: true,
14
- enableInbound: true,
15
- dailyDigestEnabled: false,
16
- dailyDigestTime: "09:00",
17
- topicRouting: false,
18
- };
19
- export const METRIC_NAMES = {
20
- sent: "telegram_notifications_sent",
21
- failed: "telegram_notification_failures",
22
- commandsHandled: "telegram_commands_handled",
23
- inboundRouted: "telegram_inbound_routed",
24
- };
25
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,2BAA2B,CAAC;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,mBAAmB,EAAE,EAAE;IACvB,aAAa,EAAE,EAAE;IACjB,eAAe,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE;IAChB,gBAAgB,EAAE,uBAAuB;IACzC,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAE,IAAI;IACvB,uBAAuB,EAAE,IAAI;IAC7B,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,kBAAkB,EAAE,KAAK;IACzB,eAAe,EAAE,OAAO;IACxB,YAAY,EAAE,KAAK;CACX,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,6BAA6B;IACnC,MAAM,EAAE,gCAAgC;IACxC,eAAe,EAAE,2BAA2B;IAC5C,aAAa,EAAE,yBAAyB;CAChC,CAAC"}
@@ -1,13 +0,0 @@
1
- import type { PluginEvent } from "@paperclipai/plugin-sdk";
2
- import type { SendMessageOptions } from "./telegram-api.js";
3
- type FormattedMessage = {
4
- text: string;
5
- options: SendMessageOptions;
6
- };
7
- export declare function formatIssueCreated(event: PluginEvent): FormattedMessage;
8
- export declare function formatIssueDone(event: PluginEvent): FormattedMessage;
9
- export declare function formatApprovalCreated(event: PluginEvent): FormattedMessage;
10
- export declare function formatAgentError(event: PluginEvent): FormattedMessage;
11
- export declare function formatAgentRunStarted(event: PluginEvent): FormattedMessage;
12
- export declare function formatAgentRunFinished(event: PluginEvent): FormattedMessage;
13
- export {};
@@ -1,130 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export { default as manifest } from "./manifest.js";
package/dist/index.js DELETED
@@ -1,2 +0,0 @@
1
- export { default as manifest } from "./manifest.js";
2
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { PaperclipPluginManifestV1 } from "@paperclipai/plugin-sdk";
2
- declare const manifest: PaperclipPluginManifestV1;
3
- export default manifest;
package/dist/manifest.js DELETED
@@ -1,125 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
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 {};