paperclip-plugin-telegram 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/dist/acp-bridge.d.ts +34 -0
- package/dist/acp-bridge.js +805 -0
- package/dist/acp-bridge.js.map +1 -0
- package/dist/adapter.d.ts +35 -0
- package/dist/adapter.js +75 -0
- package/dist/adapter.js.map +1 -0
- package/dist/command-registry.d.ts +3 -0
- package/dist/command-registry.js +273 -0
- package/dist/command-registry.js.map +1 -0
- package/dist/commands.d.ts +10 -0
- package/dist/commands.js +213 -0
- package/dist/commands.js.map +1 -0
- package/dist/constants.d.ts +44 -0
- package/dist/constants.js +48 -0
- package/dist/constants.js.map +1 -0
- package/dist/escalation.d.ts +41 -0
- package/dist/escalation.js +254 -0
- package/dist/escalation.js.map +1 -0
- package/dist/formatters.d.ts +13 -0
- package/dist/formatters.js +130 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +3 -0
- package/dist/manifest.js +230 -0
- package/dist/manifest.js.map +1 -0
- package/dist/media-pipeline.d.ts +46 -0
- package/dist/media-pipeline.js +161 -0
- package/dist/media-pipeline.js.map +1 -0
- package/dist/telegram-api.d.ts +28 -0
- package/dist/telegram-api.js +147 -0
- package/dist/telegram-api.js.map +1 -0
- package/dist/watch-registry.d.ts +9 -0
- package/dist/watch-registry.js +272 -0
- package/dist/watch-registry.js.map +1 -0
- package/dist/worker.d.ts +1 -0
- package/dist/worker.js +548 -0
- package/dist/worker.js.map +1 -0
- package/package.json +7 -3
- package/src/acp-bridge.ts +0 -1273
- package/src/adapter.ts +0 -129
- package/src/command-registry.ts +0 -482
- package/src/commands.ts +0 -346
- package/src/constants.ts +0 -51
- package/src/escalation.ts +0 -421
- package/src/formatters.ts +0 -148
- package/src/manifest.ts +0 -246
- package/src/media-pipeline.ts +0 -234
- package/src/telegram-api.ts +0 -202
- package/src/watch-registry.ts +0 -369
- package/src/worker.ts +0 -783
- package/tests/acp-bridge.test.ts +0 -314
- package/tests/command-registry.test.ts +0 -283
- package/tests/commands.test.ts +0 -213
- package/tests/escalation.test.ts +0 -550
- package/tests/formatters.test.ts +0 -185
- package/tests/media-pipeline.test.ts +0 -324
- package/tests/telegram-api.test.ts +0 -108
- package/tests/watch-registry.test.ts +0 -404
- package/tsconfig.json +0 -16
- /package/{src/index.ts → dist/index.d.ts} +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
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 {};
|
|
@@ -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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"}
|
package/dist/index.js
ADDED
|
@@ -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;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { DEFAULT_CONFIG, PLUGIN_ID, PLUGIN_VERSION, MAX_AGENTS_PER_THREAD } 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, bot commands, escalation to humans, multi-agent sessions (native + ACP), media pipeline with transcription, custom workflow commands, and proactive suggestion watches.",
|
|
8
|
+
author: "mvanhorn",
|
|
9
|
+
categories: ["connector", "automation"],
|
|
10
|
+
capabilities: [
|
|
11
|
+
"companies.read",
|
|
12
|
+
"issues.read",
|
|
13
|
+
"issues.create",
|
|
14
|
+
"agents.read",
|
|
15
|
+
"agents.invoke",
|
|
16
|
+
"agent.sessions.create",
|
|
17
|
+
"agent.sessions.list",
|
|
18
|
+
"agent.sessions.send",
|
|
19
|
+
"agent.sessions.close",
|
|
20
|
+
"agent.tools.register",
|
|
21
|
+
"events.subscribe",
|
|
22
|
+
"events.emit",
|
|
23
|
+
"plugin.state.read",
|
|
24
|
+
"plugin.state.write",
|
|
25
|
+
"http.outbound",
|
|
26
|
+
"secrets.read-ref",
|
|
27
|
+
"activity.log.write",
|
|
28
|
+
"metrics.write",
|
|
29
|
+
"jobs.schedule",
|
|
30
|
+
],
|
|
31
|
+
entrypoints: {
|
|
32
|
+
worker: "./dist/worker.js",
|
|
33
|
+
},
|
|
34
|
+
instanceConfigSchema: {
|
|
35
|
+
type: "object",
|
|
36
|
+
properties: {
|
|
37
|
+
telegramBotTokenRef: {
|
|
38
|
+
type: "string",
|
|
39
|
+
title: "Telegram Bot Token (secret reference)",
|
|
40
|
+
description: "Reference to the Telegram Bot token stored in your secret provider. Get one from @BotFather.",
|
|
41
|
+
default: DEFAULT_CONFIG.telegramBotTokenRef,
|
|
42
|
+
},
|
|
43
|
+
defaultChatId: {
|
|
44
|
+
type: "string",
|
|
45
|
+
title: "Default Chat ID",
|
|
46
|
+
description: "Telegram chat ID to send notifications to. Use a group chat ID (negative number) or a user chat ID.",
|
|
47
|
+
default: DEFAULT_CONFIG.defaultChatId,
|
|
48
|
+
},
|
|
49
|
+
approvalsChatId: {
|
|
50
|
+
type: "string",
|
|
51
|
+
title: "Approvals Chat ID",
|
|
52
|
+
description: "Chat ID for approval requests. Falls back to default chat.",
|
|
53
|
+
default: DEFAULT_CONFIG.approvalsChatId,
|
|
54
|
+
},
|
|
55
|
+
errorsChatId: {
|
|
56
|
+
type: "string",
|
|
57
|
+
title: "Errors Chat ID",
|
|
58
|
+
description: "Chat ID for agent error notifications. Falls back to default chat.",
|
|
59
|
+
default: DEFAULT_CONFIG.errorsChatId,
|
|
60
|
+
},
|
|
61
|
+
notifyOnIssueCreated: {
|
|
62
|
+
type: "boolean",
|
|
63
|
+
title: "Notify on issue created",
|
|
64
|
+
default: DEFAULT_CONFIG.notifyOnIssueCreated,
|
|
65
|
+
},
|
|
66
|
+
notifyOnIssueDone: {
|
|
67
|
+
type: "boolean",
|
|
68
|
+
title: "Notify on issue completed",
|
|
69
|
+
default: DEFAULT_CONFIG.notifyOnIssueDone,
|
|
70
|
+
},
|
|
71
|
+
notifyOnApprovalCreated: {
|
|
72
|
+
type: "boolean",
|
|
73
|
+
title: "Notify on approval requested",
|
|
74
|
+
default: DEFAULT_CONFIG.notifyOnApprovalCreated,
|
|
75
|
+
},
|
|
76
|
+
notifyOnAgentError: {
|
|
77
|
+
type: "boolean",
|
|
78
|
+
title: "Notify on agent error",
|
|
79
|
+
default: DEFAULT_CONFIG.notifyOnAgentError,
|
|
80
|
+
},
|
|
81
|
+
enableCommands: {
|
|
82
|
+
type: "boolean",
|
|
83
|
+
title: "Enable bot commands",
|
|
84
|
+
description: "Allow users to interact with Paperclip via Telegram bot commands (/status, /issues, /agents).",
|
|
85
|
+
default: DEFAULT_CONFIG.enableCommands,
|
|
86
|
+
},
|
|
87
|
+
enableInbound: {
|
|
88
|
+
type: "boolean",
|
|
89
|
+
title: "Enable inbound message routing",
|
|
90
|
+
description: "Route Telegram messages to Paperclip issue comments. Messages sent in reply to a notification get attached to that issue.",
|
|
91
|
+
default: DEFAULT_CONFIG.enableInbound,
|
|
92
|
+
},
|
|
93
|
+
dailyDigestEnabled: {
|
|
94
|
+
type: "boolean",
|
|
95
|
+
title: "Daily digest",
|
|
96
|
+
description: "Send a daily summary of agent activity.",
|
|
97
|
+
default: DEFAULT_CONFIG.dailyDigestEnabled,
|
|
98
|
+
},
|
|
99
|
+
dailyDigestTime: {
|
|
100
|
+
type: "string",
|
|
101
|
+
title: "Digest time (HH:MM UTC)",
|
|
102
|
+
description: "Time to send the daily digest in UTC.",
|
|
103
|
+
default: DEFAULT_CONFIG.dailyDigestTime,
|
|
104
|
+
},
|
|
105
|
+
topicRouting: {
|
|
106
|
+
type: "boolean",
|
|
107
|
+
title: "Forum topic routing",
|
|
108
|
+
description: "Map Telegram forum topics to Paperclip projects. Requires the bot to be in a group with forum topics enabled.",
|
|
109
|
+
default: DEFAULT_CONFIG.topicRouting,
|
|
110
|
+
},
|
|
111
|
+
paperclipBaseUrl: {
|
|
112
|
+
type: "string",
|
|
113
|
+
title: "Paperclip Base URL",
|
|
114
|
+
description: "Base URL of the Paperclip API server.",
|
|
115
|
+
default: DEFAULT_CONFIG.paperclipBaseUrl,
|
|
116
|
+
},
|
|
117
|
+
escalationChatId: {
|
|
118
|
+
type: "string",
|
|
119
|
+
title: "Escalation Chat ID",
|
|
120
|
+
description: "Telegram chat ID where escalations are sent for human review. If empty, escalations are logged but not forwarded.",
|
|
121
|
+
default: DEFAULT_CONFIG.escalationChatId,
|
|
122
|
+
},
|
|
123
|
+
escalationTimeoutMs: {
|
|
124
|
+
type: "number",
|
|
125
|
+
title: "Escalation Timeout (ms)",
|
|
126
|
+
description: "How long to wait for a human response before taking the default action. Default: 900000 (15 minutes).",
|
|
127
|
+
default: DEFAULT_CONFIG.escalationTimeoutMs,
|
|
128
|
+
},
|
|
129
|
+
escalationDefaultAction: {
|
|
130
|
+
type: "string",
|
|
131
|
+
title: "Escalation Default Action",
|
|
132
|
+
description: "What to do when an escalation times out: defer (do nothing), auto_reply (send suggested reply), or close.",
|
|
133
|
+
enum: ["defer", "auto_reply", "close"],
|
|
134
|
+
default: DEFAULT_CONFIG.escalationDefaultAction,
|
|
135
|
+
},
|
|
136
|
+
escalationHoldMessage: {
|
|
137
|
+
type: "string",
|
|
138
|
+
title: "Escalation Hold Message",
|
|
139
|
+
description: "Message sent to the user when their conversation is escalated to a human.",
|
|
140
|
+
default: DEFAULT_CONFIG.escalationHoldMessage,
|
|
141
|
+
},
|
|
142
|
+
maxAgentsPerThread: {
|
|
143
|
+
type: "number",
|
|
144
|
+
title: "Max Agents Per Thread",
|
|
145
|
+
description: "Maximum number of concurrent agent sessions allowed in a single thread.",
|
|
146
|
+
default: MAX_AGENTS_PER_THREAD,
|
|
147
|
+
},
|
|
148
|
+
briefAgentId: {
|
|
149
|
+
type: "string",
|
|
150
|
+
title: "Brief Agent ID",
|
|
151
|
+
description: "Agent ID for processing media intake briefs. Leave empty to disable media pipeline.",
|
|
152
|
+
default: DEFAULT_CONFIG.briefAgentId,
|
|
153
|
+
},
|
|
154
|
+
briefAgentChatIds: {
|
|
155
|
+
type: "array",
|
|
156
|
+
items: { type: "string" },
|
|
157
|
+
title: "Brief Agent Intake Chat IDs",
|
|
158
|
+
description: "Telegram chat IDs where media is routed to the Brief Agent. Media in other chats goes to active agent sessions.",
|
|
159
|
+
default: DEFAULT_CONFIG.briefAgentChatIds,
|
|
160
|
+
},
|
|
161
|
+
transcriptionApiKeyRef: {
|
|
162
|
+
type: "string",
|
|
163
|
+
title: "Transcription API Key (secret reference)",
|
|
164
|
+
description: "Reference to OpenAI API key for Whisper transcription of voice/audio messages.",
|
|
165
|
+
default: DEFAULT_CONFIG.transcriptionApiKeyRef,
|
|
166
|
+
},
|
|
167
|
+
maxSuggestionsPerHourPerCompany: {
|
|
168
|
+
type: "number",
|
|
169
|
+
title: "Max Suggestions per Hour per Company",
|
|
170
|
+
description: "Rate limit for proactive watch suggestions.",
|
|
171
|
+
default: DEFAULT_CONFIG.maxSuggestionsPerHourPerCompany,
|
|
172
|
+
},
|
|
173
|
+
watchDeduplicationWindowMs: {
|
|
174
|
+
type: "number",
|
|
175
|
+
title: "Watch Deduplication Window (ms)",
|
|
176
|
+
description: "Suppress duplicate watch suggestions for the same entity within this window. Default: 86400000 (24 hours).",
|
|
177
|
+
default: DEFAULT_CONFIG.watchDeduplicationWindowMs,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
required: ["telegramBotTokenRef", "defaultChatId"],
|
|
181
|
+
},
|
|
182
|
+
jobs: [
|
|
183
|
+
{
|
|
184
|
+
jobKey: "telegram-daily-digest",
|
|
185
|
+
displayName: "Telegram Daily Digest",
|
|
186
|
+
description: "Send a daily summary of agent activity to Telegram.",
|
|
187
|
+
schedule: "0 9 * * *",
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
jobKey: "check-escalation-timeouts",
|
|
191
|
+
displayName: "Check Escalation Timeouts",
|
|
192
|
+
description: "Check for timed-out escalations and apply default actions.",
|
|
193
|
+
schedule: "* * * * *",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
jobKey: "check-watches",
|
|
197
|
+
displayName: "Check Proactive Watches",
|
|
198
|
+
description: "Evaluate registered watches and send suggestions when conditions are met.",
|
|
199
|
+
schedule: "*/15 * * * *",
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
tools: [
|
|
203
|
+
{
|
|
204
|
+
name: "escalate_to_human",
|
|
205
|
+
displayName: "Escalate to Human",
|
|
206
|
+
description: "Escalate a conversation to a human when you cannot handle it confidently",
|
|
207
|
+
parametersSchema: { type: "object" },
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: "handoff_to_agent",
|
|
211
|
+
displayName: "Handoff to Agent",
|
|
212
|
+
description: "Hand off work to another agent in this thread",
|
|
213
|
+
parametersSchema: { type: "object" },
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: "discuss_with_agent",
|
|
217
|
+
displayName: "Discuss with Agent",
|
|
218
|
+
description: "Start a back-and-forth conversation with another agent",
|
|
219
|
+
parametersSchema: { type: "object" },
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: "register_watch",
|
|
223
|
+
displayName: "Register Watch",
|
|
224
|
+
description: "Register a proactive watch that monitors entities and sends suggestions",
|
|
225
|
+
parametersSchema: { type: "object" },
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
};
|
|
229
|
+
export default manifest;
|
|
230
|
+
//# 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,46 @@
|
|
|
1
|
+
import type { PluginContext } from "@paperclipai/plugin-sdk";
|
|
2
|
+
type MediaConfig = {
|
|
3
|
+
briefAgentId: string;
|
|
4
|
+
briefAgentChatIds: string[];
|
|
5
|
+
transcriptionApiKeyRef: string;
|
|
6
|
+
};
|
|
7
|
+
type TelegramMediaMessage = {
|
|
8
|
+
message_id: number;
|
|
9
|
+
chat: {
|
|
10
|
+
id: number;
|
|
11
|
+
};
|
|
12
|
+
message_thread_id?: number;
|
|
13
|
+
from?: {
|
|
14
|
+
id: number;
|
|
15
|
+
username?: string;
|
|
16
|
+
first_name?: string;
|
|
17
|
+
};
|
|
18
|
+
voice?: {
|
|
19
|
+
file_id: string;
|
|
20
|
+
duration: number;
|
|
21
|
+
mime_type?: string;
|
|
22
|
+
};
|
|
23
|
+
audio?: {
|
|
24
|
+
file_id: string;
|
|
25
|
+
duration: number;
|
|
26
|
+
title?: string;
|
|
27
|
+
mime_type?: string;
|
|
28
|
+
};
|
|
29
|
+
video_note?: {
|
|
30
|
+
file_id: string;
|
|
31
|
+
duration: number;
|
|
32
|
+
};
|
|
33
|
+
document?: {
|
|
34
|
+
file_id: string;
|
|
35
|
+
file_name?: string;
|
|
36
|
+
mime_type?: string;
|
|
37
|
+
};
|
|
38
|
+
photo?: Array<{
|
|
39
|
+
file_id: string;
|
|
40
|
+
width: number;
|
|
41
|
+
height: number;
|
|
42
|
+
}>;
|
|
43
|
+
caption?: string;
|
|
44
|
+
};
|
|
45
|
+
export declare function handleMediaMessage(ctx: PluginContext, token: string, msg: TelegramMediaMessage, config: MediaConfig, companyId: string): Promise<boolean>;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { sendMessage, escapeMarkdownV2, sendChatAction } from "./telegram-api.js";
|
|
2
|
+
import { METRIC_NAMES } from "./constants.js";
|
|
3
|
+
import { getSessions } from "./acp-bridge.js";
|
|
4
|
+
const TELEGRAM_API = "https://api.telegram.org";
|
|
5
|
+
export async function handleMediaMessage(ctx, token, msg, config, companyId) {
|
|
6
|
+
const chatId = String(msg.chat.id);
|
|
7
|
+
const threadId = msg.message_thread_id;
|
|
8
|
+
// Determine if this is an intake channel (brief agent) or an agent thread
|
|
9
|
+
const isIntakeChannel = config.briefAgentChatIds.includes(chatId);
|
|
10
|
+
const hasActiveSession = threadId
|
|
11
|
+
? (await getSessions(ctx, chatId, threadId)).some((s) => s.status === "active")
|
|
12
|
+
: false;
|
|
13
|
+
if (!isIntakeChannel && !hasActiveSession) {
|
|
14
|
+
return false; // Not a media-relevant context
|
|
15
|
+
}
|
|
16
|
+
await sendChatAction(ctx, token, chatId);
|
|
17
|
+
// Extract media file info
|
|
18
|
+
const fileId = extractFileId(msg);
|
|
19
|
+
if (!fileId)
|
|
20
|
+
return false;
|
|
21
|
+
const isAudio = !!(msg.voice || msg.audio || msg.video_note);
|
|
22
|
+
let textContent = msg.caption ?? "";
|
|
23
|
+
// Transcribe audio/voice if applicable
|
|
24
|
+
if (isAudio && config.transcriptionApiKeyRef) {
|
|
25
|
+
try {
|
|
26
|
+
const transcription = await transcribeAudio(ctx, token, fileId, config.transcriptionApiKeyRef);
|
|
27
|
+
if (transcription) {
|
|
28
|
+
textContent = transcription;
|
|
29
|
+
// Send transcription preview
|
|
30
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("\ud83c\udfa4")} *Transcription:*\n${escapeMarkdownV2(textContent.slice(0, 500))}${textContent.length > 500 ? escapeMarkdownV2("...") : ""}`, {
|
|
31
|
+
parseMode: "MarkdownV2",
|
|
32
|
+
messageThreadId: threadId,
|
|
33
|
+
replyToMessageId: msg.message_id,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
ctx.logger.error("Transcription failed", { error: String(err) });
|
|
39
|
+
textContent = msg.caption ?? "[Audio - transcription failed]";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (isIntakeChannel && config.briefAgentId) {
|
|
43
|
+
// Route to Brief Agent via one-shot invocation
|
|
44
|
+
try {
|
|
45
|
+
const prompt = buildBriefPrompt(msg, textContent);
|
|
46
|
+
const { runId } = await ctx.agents.invoke(config.briefAgentId, companyId, {
|
|
47
|
+
prompt,
|
|
48
|
+
reason: "media_intake",
|
|
49
|
+
});
|
|
50
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("\ud83d\udcdd")} Media sent to Brief Agent \\(run: \`${escapeMarkdownV2(runId)}\`\\)`, {
|
|
51
|
+
parseMode: "MarkdownV2",
|
|
52
|
+
messageThreadId: threadId,
|
|
53
|
+
replyToMessageId: msg.message_id,
|
|
54
|
+
});
|
|
55
|
+
ctx.logger.info("Media routed to brief agent", { runId, briefAgentId: config.briefAgentId });
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
ctx.logger.error("Failed to invoke brief agent", { error: String(err) });
|
|
59
|
+
await sendMessage(ctx, token, chatId, `Failed to route media to brief agent: ${String(err)}`, { messageThreadId: threadId });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (hasActiveSession && threadId) {
|
|
63
|
+
// Route to the active agent in the thread
|
|
64
|
+
const sessions = await getSessions(ctx, chatId, threadId);
|
|
65
|
+
const activeSessions = sessions.filter((s) => s.status === "active");
|
|
66
|
+
const target = activeSessions.sort((a, b) => new Date(b.lastActivityAt).getTime() - new Date(a.lastActivityAt).getTime())[0];
|
|
67
|
+
if (target) {
|
|
68
|
+
const mediaLabel = isAudio ? "Audio message" : msg.photo ? "Photo" : "Document";
|
|
69
|
+
const prompt = `[${mediaLabel}] ${textContent || "(no caption)"}`;
|
|
70
|
+
if (target.transport === "native") {
|
|
71
|
+
try {
|
|
72
|
+
await ctx.agents.sessions.sendMessage(target.sessionId, companyId, {
|
|
73
|
+
prompt,
|
|
74
|
+
reason: "media_message",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
ctx.logger.error("Failed to send media to native session", { error: String(err) });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
ctx.events.emit("acp-spawn", companyId, {
|
|
83
|
+
type: "message",
|
|
84
|
+
sessionId: target.sessionId,
|
|
85
|
+
chatId,
|
|
86
|
+
threadId,
|
|
87
|
+
text: prompt,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
await ctx.metrics.write(METRIC_NAMES.mediaProcessed, 1);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
function extractFileId(msg) {
|
|
96
|
+
if (msg.voice)
|
|
97
|
+
return msg.voice.file_id;
|
|
98
|
+
if (msg.audio)
|
|
99
|
+
return msg.audio.file_id;
|
|
100
|
+
if (msg.video_note)
|
|
101
|
+
return msg.video_note.file_id;
|
|
102
|
+
if (msg.document)
|
|
103
|
+
return msg.document.file_id;
|
|
104
|
+
if (msg.photo && msg.photo.length > 0) {
|
|
105
|
+
// Use the largest photo
|
|
106
|
+
return msg.photo.sort((a, b) => b.width * b.height - a.width * a.height)[0].file_id;
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
async function transcribeAudio(ctx, botToken, fileId, transcriptionApiKeyRef) {
|
|
111
|
+
// 1. Get file path from Telegram
|
|
112
|
+
const fileRes = await ctx.http.fetch(`${TELEGRAM_API}/bot${botToken}/getFile?file_id=${fileId}`, { method: "GET" });
|
|
113
|
+
const fileData = (await fileRes.json());
|
|
114
|
+
if (!fileData.ok || !fileData.result?.file_path) {
|
|
115
|
+
ctx.logger.error("Failed to get file path from Telegram", { fileId });
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
// 2. Download the file
|
|
119
|
+
const downloadUrl = `${TELEGRAM_API}/file/bot${botToken}/${fileData.result.file_path}`;
|
|
120
|
+
const audioRes = await ctx.http.fetch(downloadUrl, { method: "GET" });
|
|
121
|
+
const audioBlob = await audioRes.blob();
|
|
122
|
+
// 3. Send to Whisper API
|
|
123
|
+
const apiKey = await ctx.secrets.resolve(transcriptionApiKeyRef);
|
|
124
|
+
const formData = new FormData();
|
|
125
|
+
formData.append("file", audioBlob, "audio.ogg");
|
|
126
|
+
formData.append("model", "whisper-1");
|
|
127
|
+
const whisperRes = await ctx.http.fetch("https://api.openai.com/v1/audio/transcriptions", {
|
|
128
|
+
method: "POST",
|
|
129
|
+
headers: {
|
|
130
|
+
Authorization: `Bearer ${apiKey}`,
|
|
131
|
+
},
|
|
132
|
+
body: formData,
|
|
133
|
+
});
|
|
134
|
+
const whisperData = (await whisperRes.json());
|
|
135
|
+
return whisperData.text ?? null;
|
|
136
|
+
}
|
|
137
|
+
function buildBriefPrompt(msg, textContent) {
|
|
138
|
+
const parts = [];
|
|
139
|
+
if (msg.voice) {
|
|
140
|
+
parts.push(`[Voice message, ${msg.voice.duration}s]`);
|
|
141
|
+
}
|
|
142
|
+
else if (msg.audio) {
|
|
143
|
+
parts.push(`[Audio: ${msg.audio.title ?? "untitled"}, ${msg.audio.duration}s]`);
|
|
144
|
+
}
|
|
145
|
+
else if (msg.video_note) {
|
|
146
|
+
parts.push(`[Video note, ${msg.video_note.duration}s]`);
|
|
147
|
+
}
|
|
148
|
+
else if (msg.document) {
|
|
149
|
+
parts.push(`[Document: ${msg.document.file_name ?? "unknown"}]`);
|
|
150
|
+
}
|
|
151
|
+
else if (msg.photo) {
|
|
152
|
+
parts.push("[Photo]");
|
|
153
|
+
}
|
|
154
|
+
if (textContent) {
|
|
155
|
+
parts.push(textContent);
|
|
156
|
+
}
|
|
157
|
+
const sender = msg.from?.username ?? msg.from?.first_name ?? "unknown";
|
|
158
|
+
parts.push(`\nFrom: ${sender}`);
|
|
159
|
+
return parts.join("\n");
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=media-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-pipeline.js","sourceRoot":"","sources":["../src/media-pipeline.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 {};
|