@odience-network/paperclip-plugin-telegram-enhanced 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.
- package/LICENSE +21 -0
- package/README.md +215 -0
- package/dist/acp-bridge.d.ts +35 -0
- package/dist/acp-bridge.js +891 -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/agent-labels.d.ts +12 -0
- package/dist/agent-labels.js +96 -0
- package/dist/agent-labels.js.map +1 -0
- package/dist/allowlist.d.ts +27 -0
- package/dist/allowlist.js +34 -0
- package/dist/allowlist.js.map +1 -0
- package/dist/approval-routing.d.ts +2 -0
- package/dist/approval-routing.js +7 -0
- package/dist/approval-routing.js.map +1 -0
- package/dist/command-registry.d.ts +3 -0
- package/dist/command-registry.js +268 -0
- package/dist/command-registry.js.map +1 -0
- package/dist/commands.d.ts +11 -0
- package/dist/commands.js +516 -0
- package/dist/commands.js.map +1 -0
- package/dist/constants.d.ts +76 -0
- package/dist/constants.js +71 -0
- package/dist/constants.js.map +1 -0
- package/dist/escalation.d.ts +42 -0
- package/dist/escalation.js +252 -0
- package/dist/escalation.js.map +1 -0
- package/dist/file-routing.d.ts +51 -0
- package/dist/file-routing.js +212 -0
- package/dist/file-routing.js.map +1 -0
- package/dist/formatters.d.ts +31 -0
- package/dist/formatters.js +336 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction-delivery.d.ts +90 -0
- package/dist/interaction-delivery.js +142 -0
- package/dist/interaction-delivery.js.map +1 -0
- package/dist/manifest.d.ts +3 -0
- package/dist/manifest.js +111 -0
- package/dist/manifest.js.map +1 -0
- package/dist/media-pipeline.d.ts +47 -0
- package/dist/media-pipeline.js +162 -0
- package/dist/media-pipeline.js.map +1 -0
- package/dist/notification-filters.d.ts +23 -0
- package/dist/notification-filters.js +93 -0
- package/dist/notification-filters.js.map +1 -0
- package/dist/paperclip-api.d.ts +25 -0
- package/dist/paperclip-api.js +69 -0
- package/dist/paperclip-api.js.map +1 -0
- package/dist/polling-offset.d.ts +22 -0
- package/dist/polling-offset.js +68 -0
- package/dist/polling-offset.js.map +1 -0
- package/dist/secret-ref-validation.d.ts +7 -0
- package/dist/secret-ref-validation.js +49 -0
- package/dist/secret-ref-validation.js.map +1 -0
- package/dist/telegram-api.d.ts +40 -0
- package/dist/telegram-api.js +251 -0
- package/dist/telegram-api.js.map +1 -0
- package/dist/topic-projects.d.ts +2 -0
- package/dist/topic-projects.js +45 -0
- package/dist/topic-projects.js.map +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1446 -0
- package/dist/ui/index.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 +162 -0
- package/dist/worker.js +1520 -0
- package/dist/worker.js.map +1 -0
- package/package.json +59 -0
package/dist/commands.js
ADDED
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { sendMessage, escapeMarkdownV2, sendChatAction } from "./telegram-api.js";
|
|
2
|
+
import { METRIC_NAMES } from "./constants.js";
|
|
3
|
+
import { handleAcpCommand } from "./acp-bridge.js";
|
|
4
|
+
import { buildPaperclipAuthHeaders, fetchPaperclipApi } from "./paperclip-api.js";
|
|
5
|
+
export const BOT_COMMANDS = [
|
|
6
|
+
{ command: "create", description: "Create a new task (assigned to CEO agent)" },
|
|
7
|
+
{ command: "status", description: "Company health: active agents, open issues" },
|
|
8
|
+
{ command: "issues", description: "List open issues (optionally by project)" },
|
|
9
|
+
{ command: "agents", description: "List agents with current status" },
|
|
10
|
+
{ command: "approve", description: "Approve a pending request by ID" },
|
|
11
|
+
{ command: "help", description: "Show available commands" },
|
|
12
|
+
{ command: "connect", description: "Link this chat to a Paperclip company" },
|
|
13
|
+
{ command: "connect_topic", description: "Map a project to a forum topic" },
|
|
14
|
+
{ command: "topics", description: "List or remove forum topic mappings" },
|
|
15
|
+
{ command: "acp", description: "Manage agent sessions (spawn, status, cancel, close)" },
|
|
16
|
+
{ command: "commands", description: "Manage custom workflow commands (list, import, run, delete)" },
|
|
17
|
+
];
|
|
18
|
+
export async function handleCommand(ctx, token, chatId, command, args, messageThreadId, baseUrl, publicUrl, companyId, boardApiToken, maxAgentsPerThread) {
|
|
19
|
+
await ctx.metrics.write(METRIC_NAMES.commandsHandled, 1);
|
|
20
|
+
switch (command) {
|
|
21
|
+
case "create":
|
|
22
|
+
await handleCreate(ctx, token, chatId, args, messageThreadId, publicUrl || baseUrl, companyId);
|
|
23
|
+
break;
|
|
24
|
+
case "status":
|
|
25
|
+
await handleStatus(ctx, token, chatId, messageThreadId, publicUrl, companyId);
|
|
26
|
+
break;
|
|
27
|
+
case "issues":
|
|
28
|
+
await handleIssues(ctx, token, chatId, args, messageThreadId, publicUrl || baseUrl, companyId);
|
|
29
|
+
break;
|
|
30
|
+
case "agents":
|
|
31
|
+
await handleAgents(ctx, token, chatId, messageThreadId, publicUrl, companyId);
|
|
32
|
+
break;
|
|
33
|
+
case "approve":
|
|
34
|
+
await handleApprove(ctx, token, chatId, args, messageThreadId, baseUrl, boardApiToken);
|
|
35
|
+
break;
|
|
36
|
+
case "help":
|
|
37
|
+
await handleHelp(ctx, token, chatId, messageThreadId);
|
|
38
|
+
break;
|
|
39
|
+
case "connect":
|
|
40
|
+
await handleConnect(ctx, token, chatId, args, messageThreadId);
|
|
41
|
+
break;
|
|
42
|
+
case "connect_topic":
|
|
43
|
+
await handleConnectTopic(ctx, token, chatId, args, messageThreadId);
|
|
44
|
+
break;
|
|
45
|
+
case "topics":
|
|
46
|
+
await handleTopicsCommand(ctx, token, chatId, args, messageThreadId);
|
|
47
|
+
break;
|
|
48
|
+
case "acp":
|
|
49
|
+
await handleAcpCommand(ctx, token, chatId, args, messageThreadId, companyId, maxAgentsPerThread);
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
await sendMessage(ctx, token, chatId, `Unknown command: /${command}. Try /help`, {
|
|
53
|
+
messageThreadId,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function isExternalUrl(url) {
|
|
58
|
+
return !!url && url.startsWith("https://");
|
|
59
|
+
}
|
|
60
|
+
async function handleStatus(ctx, token, chatId, messageThreadId, publicUrl, resolvedCompanyId) {
|
|
61
|
+
await sendChatAction(ctx, token, chatId);
|
|
62
|
+
try {
|
|
63
|
+
const companyId = resolvedCompanyId ?? await resolveCompanyId(ctx, chatId);
|
|
64
|
+
const agents = await ctx.agents.list({ companyId });
|
|
65
|
+
const activeAgents = agents.filter((a) => a.status === "active");
|
|
66
|
+
const issues = await ctx.issues.list({ companyId, limit: 10 });
|
|
67
|
+
const doneIssues = issues.filter((i) => i.status === "done");
|
|
68
|
+
const lines = [
|
|
69
|
+
escapeMarkdownV2("📊") + " *Paperclip Status*",
|
|
70
|
+
"",
|
|
71
|
+
`${escapeMarkdownV2("🤖")} Active agents: *${activeAgents.length}*/${escapeMarkdownV2(String(agents.length))}`,
|
|
72
|
+
`${escapeMarkdownV2("📋")} Recent issues: *${escapeMarkdownV2(String(issues.length))}* \\(${escapeMarkdownV2(String(doneIssues.length))} done\\)`,
|
|
73
|
+
];
|
|
74
|
+
const inlineKeyboard = isExternalUrl(publicUrl)
|
|
75
|
+
? [[{ text: "Open Dashboard ↗", url: publicUrl }]]
|
|
76
|
+
: undefined;
|
|
77
|
+
await sendMessage(ctx, token, chatId, lines.join("\n"), {
|
|
78
|
+
parseMode: "MarkdownV2",
|
|
79
|
+
messageThreadId,
|
|
80
|
+
inlineKeyboard,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
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."), {
|
|
85
|
+
parseMode: "MarkdownV2",
|
|
86
|
+
messageThreadId,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function handleIssues(ctx, token, chatId, projectFilter, messageThreadId, baseUrl, resolvedCompanyId) {
|
|
91
|
+
await sendChatAction(ctx, token, chatId);
|
|
92
|
+
try {
|
|
93
|
+
const companyId = resolvedCompanyId ?? await resolveCompanyId(ctx, chatId);
|
|
94
|
+
const company = await ctx.companies.get(companyId);
|
|
95
|
+
const issues = await ctx.issues.list({ companyId, limit: 10 });
|
|
96
|
+
const filtered = projectFilter
|
|
97
|
+
? issues.filter((i) => {
|
|
98
|
+
const projName = i.project?.name ?? "";
|
|
99
|
+
return projName.toLowerCase().includes(projectFilter.toLowerCase());
|
|
100
|
+
})
|
|
101
|
+
: issues;
|
|
102
|
+
if (filtered.length === 0) {
|
|
103
|
+
const filter = projectFilter ? ` for project "${projectFilter}"` : "";
|
|
104
|
+
await sendMessage(ctx, token, chatId, `No issues found${filter}.`, { messageThreadId });
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const issuePrefix = company?.issuePrefix;
|
|
108
|
+
const statusEmoji = { done: "✅", todo: "📋", in_progress: "🔄", backlog: "📥" };
|
|
109
|
+
const lines = [escapeMarkdownV2("📋") + " *Open Issues*", ""];
|
|
110
|
+
for (const issue of filtered) {
|
|
111
|
+
const emoji = statusEmoji[issue.status] ?? "📋";
|
|
112
|
+
const id = issue.identifier ?? issue.id;
|
|
113
|
+
const idText = issuePrefix && baseUrl
|
|
114
|
+
? `[${escapeMarkdownV2(id)}](${baseUrl}/${issuePrefix}/issues/${id})`
|
|
115
|
+
: escapeMarkdownV2(id);
|
|
116
|
+
lines.push(`${escapeMarkdownV2(emoji)} ${idText} \\- ${escapeMarkdownV2(issue.title)}`);
|
|
117
|
+
}
|
|
118
|
+
await sendMessage(ctx, token, chatId, lines.join("\n"), {
|
|
119
|
+
parseMode: "MarkdownV2",
|
|
120
|
+
messageThreadId,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
const filter = projectFilter ? ` for project "${projectFilter}"` : "";
|
|
125
|
+
await sendMessage(ctx, token, chatId, `Could not fetch issues${filter}. Make sure this chat is linked with /connect.`, { messageThreadId });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function handleAgents(ctx, token, chatId, messageThreadId, publicUrl, resolvedCompanyId) {
|
|
129
|
+
await sendChatAction(ctx, token, chatId);
|
|
130
|
+
try {
|
|
131
|
+
const companyId = resolvedCompanyId ?? await resolveCompanyId(ctx, chatId);
|
|
132
|
+
const agents = await ctx.agents.list({ companyId });
|
|
133
|
+
if (agents.length === 0) {
|
|
134
|
+
await sendMessage(ctx, token, chatId, "No agents found.", { messageThreadId });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const hasLinks = isExternalUrl(publicUrl);
|
|
138
|
+
const statusEmoji = { active: "🟢", error: "🔴", paused: "🟡", idle: "⚪", running: "🔵" };
|
|
139
|
+
const lines = [escapeMarkdownV2("🤖") + " *Agents*", ""];
|
|
140
|
+
for (const agent of agents) {
|
|
141
|
+
const emoji = statusEmoji[agent.status] ?? "⚪";
|
|
142
|
+
if (hasLinks) {
|
|
143
|
+
const url = `${publicUrl}/agents/${agent.id}`;
|
|
144
|
+
lines.push(`${escapeMarkdownV2(emoji)} [${escapeMarkdownV2(agent.name)}](${url}) \\- ${escapeMarkdownV2(agent.status)}`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
lines.push(`${escapeMarkdownV2(emoji)} *${escapeMarkdownV2(agent.name)}* \\- ${escapeMarkdownV2(agent.status)}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await sendMessage(ctx, token, chatId, lines.join("\n"), {
|
|
151
|
+
parseMode: "MarkdownV2",
|
|
152
|
+
messageThreadId,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
await sendMessage(ctx, token, chatId, "Could not fetch agents. Make sure this chat is linked with /connect.", { messageThreadId });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async function handleApprove(ctx, token, chatId, approvalId, messageThreadId, baseUrl = "http://localhost:3100", boardApiToken) {
|
|
160
|
+
if (!approvalId.trim()) {
|
|
161
|
+
await sendMessage(ctx, token, chatId, "Usage: /approve <approval-id>", {
|
|
162
|
+
messageThreadId,
|
|
163
|
+
});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
await fetchPaperclipApi(ctx, `${baseUrl}/api/approvals/${approvalId.trim()}/approve`, {
|
|
168
|
+
method: "POST",
|
|
169
|
+
headers: {
|
|
170
|
+
"Content-Type": "application/json",
|
|
171
|
+
...buildPaperclipAuthHeaders(boardApiToken),
|
|
172
|
+
},
|
|
173
|
+
body: JSON.stringify({ decidedByUserId: `telegram:${chatId}` }),
|
|
174
|
+
});
|
|
175
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("✅")} *Approved*: \`${escapeMarkdownV2(approvalId.trim())}\``, { parseMode: "MarkdownV2", messageThreadId });
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
await sendMessage(ctx, token, chatId, `Failed to approve ${approvalId}: ${err instanceof Error ? err.message : String(err)}`, { messageThreadId });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function handleHelp(ctx, token, chatId, messageThreadId) {
|
|
182
|
+
const lines = [
|
|
183
|
+
escapeMarkdownV2("📎") + " *Paperclip Bot Commands*",
|
|
184
|
+
"",
|
|
185
|
+
...BOT_COMMANDS.map((cmd) => `/${escapeMarkdownV2(cmd.command)} \\- ${escapeMarkdownV2(cmd.description)}`),
|
|
186
|
+
];
|
|
187
|
+
await sendMessage(ctx, token, chatId, lines.join("\n"), {
|
|
188
|
+
parseMode: "MarkdownV2",
|
|
189
|
+
messageThreadId,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async function handleConnect(ctx, token, chatId, companyArg, messageThreadId) {
|
|
193
|
+
if (!companyArg.trim()) {
|
|
194
|
+
try {
|
|
195
|
+
const companies = await ctx.companies.list();
|
|
196
|
+
const names = companies.map((c) => c.name || c.id).join(", ");
|
|
197
|
+
await sendMessage(ctx, token, chatId, `Usage: /connect <company-name>\nAvailable: ${names || "none"}`, { messageThreadId });
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
await sendMessage(ctx, token, chatId, "Usage: /connect <company-name>", { messageThreadId });
|
|
201
|
+
}
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const input = companyArg.trim();
|
|
206
|
+
const companies = await ctx.companies.list();
|
|
207
|
+
const match = companies.find((c) => c.id === input ||
|
|
208
|
+
c.name?.toLowerCase() === input.toLowerCase());
|
|
209
|
+
if (!match) {
|
|
210
|
+
const names = companies.map((c) => c.name || c.id).join(", ");
|
|
211
|
+
await sendMessage(ctx, token, chatId, `Company "${input}" not found. Available: ${names || "none"}`, { messageThreadId });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// Inbound: chat → company (for commands like /status)
|
|
215
|
+
await ctx.state.set({ scopeKind: "instance", stateKey: `chat_${chatId}` }, { companyId: match.id, companyName: match.name ?? input, linkedAt: new Date().toISOString() });
|
|
216
|
+
// Outbound: company → chat (for notifications)
|
|
217
|
+
await ctx.state.set({ scopeKind: "company", scopeId: match.id, stateKey: "telegram-chat" }, chatId);
|
|
218
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("🔗")} ${escapeMarkdownV2("Linked this chat to company:")} *${escapeMarkdownV2(match.name ?? input)}*`, { parseMode: "MarkdownV2", messageThreadId });
|
|
219
|
+
ctx.logger.info("Chat linked to company", { chatId, companyId: match.id, companyName: match.name });
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
await sendMessage(ctx, token, chatId, `Failed to connect: ${err instanceof Error ? err.message : String(err)}`, { messageThreadId });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function handleCreate(ctx, token, chatId, titleArg, messageThreadId, linkBaseUrl, resolvedCompanyId) {
|
|
226
|
+
const title = titleArg.trim();
|
|
227
|
+
if (!title) {
|
|
228
|
+
await sendMessage(ctx, token, chatId, "Usage: /create <task title>", { messageThreadId });
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
await sendChatAction(ctx, token, chatId);
|
|
232
|
+
try {
|
|
233
|
+
const companyId = resolvedCompanyId ?? await resolveCompanyId(ctx, chatId);
|
|
234
|
+
const company = await ctx.companies.get(companyId);
|
|
235
|
+
const issuePrefix = company?.issuePrefix;
|
|
236
|
+
const projectId = await resolveProjectIdForTopic(ctx, chatId, companyId, messageThreadId);
|
|
237
|
+
// Find the CEO agent to assign to
|
|
238
|
+
const agents = await ctx.agents.list({ companyId });
|
|
239
|
+
const ceo = agents.find((a) => a.role === "ceo" && a.status !== "paused" && a.status !== "error");
|
|
240
|
+
// Create the issue WITHOUT assignee first, then update with both status and assignee.
|
|
241
|
+
// This ordering is load-bearing: the issue_assigned wake only fires when the assignee
|
|
242
|
+
// *transitions* from null to an agent. If we set the assignee at creation time, there's
|
|
243
|
+
// no transition and the agent never gets woken.
|
|
244
|
+
let issue = await ctx.issues.create({ companyId, title, ...(projectId ? { projectId } : {}) });
|
|
245
|
+
if (ceo) {
|
|
246
|
+
issue = await ctx.issues.update(issue.id, { status: "todo", assigneeAgentId: ceo.id }, companyId);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// No CEO to assign to — still bump status to todo so it's visible in the backlog
|
|
250
|
+
issue = await ctx.issues.update(issue.id, { status: "todo" }, companyId);
|
|
251
|
+
}
|
|
252
|
+
const id = issue.identifier ?? issue.id;
|
|
253
|
+
const hasLink = linkBaseUrl && isExternalUrl(linkBaseUrl) && issuePrefix;
|
|
254
|
+
const idText = hasLink
|
|
255
|
+
? `[${escapeMarkdownV2(id)}](${linkBaseUrl}/${issuePrefix}/issues/${id})`
|
|
256
|
+
: `\`${escapeMarkdownV2(id)}\``;
|
|
257
|
+
const assigneeText = ceo ? ` ${escapeMarkdownV2("→")} *${escapeMarkdownV2(ceo.name)}*` : "";
|
|
258
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("✅")} *Task created*: ${idText}${assigneeText}\n${escapeMarkdownV2(title)}`, { parseMode: "MarkdownV2", messageThreadId });
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
await sendMessage(ctx, token, chatId, `Failed to create task: ${err instanceof Error ? err.message : String(err)}`, { messageThreadId });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export async function handleConnectTopic(ctx, token, chatId, args, messageThreadId) {
|
|
265
|
+
const trimmedArgs = args.trim();
|
|
266
|
+
if (!trimmedArgs) {
|
|
267
|
+
await sendMessage(ctx, token, chatId, "Usage: /connect\\_topic <project\\-name> \\[topic\\-id\\]", {
|
|
268
|
+
parseMode: "MarkdownV2",
|
|
269
|
+
messageThreadId,
|
|
270
|
+
});
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const parts = trimmedArgs.split(/\s+/);
|
|
274
|
+
if (parts.length < 2 && !messageThreadId) {
|
|
275
|
+
await sendMessage(ctx, token, chatId, "Usage: /connect\\_topic <project\\-name> \\[topic\\-id\\]", {
|
|
276
|
+
parseMode: "MarkdownV2",
|
|
277
|
+
messageThreadId,
|
|
278
|
+
});
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
let topicId;
|
|
282
|
+
let projectNameInput;
|
|
283
|
+
const explicitTopicId = parts.length >= 2 && /^\d+$/.test(parts[parts.length - 1]);
|
|
284
|
+
if (explicitTopicId) {
|
|
285
|
+
topicId = parts.pop();
|
|
286
|
+
projectNameInput = parts.join(" ");
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
if (!messageThreadId) {
|
|
290
|
+
await sendMessage(ctx, token, chatId, "Usage: /connect\\_topic <project\\-name> \\[topic\\-id\\]", {
|
|
291
|
+
parseMode: "MarkdownV2",
|
|
292
|
+
messageThreadId,
|
|
293
|
+
});
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
topicId = String(messageThreadId);
|
|
297
|
+
projectNameInput = parts.join(" ");
|
|
298
|
+
}
|
|
299
|
+
const companyId = await resolveCompanyId(ctx, chatId);
|
|
300
|
+
const project = await resolveProjectByName(ctx, companyId, projectNameInput);
|
|
301
|
+
if (!project) {
|
|
302
|
+
await sendProjectNotFoundMessage(ctx, token, chatId, companyId, projectNameInput, messageThreadId);
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const topicMap = await getTopicMap(ctx, chatId);
|
|
306
|
+
const existingKey = findTopicMapKey(topicMap, project.name) ?? findTopicMapKey(topicMap, projectNameInput);
|
|
307
|
+
if (existingKey && existingKey !== project.name) {
|
|
308
|
+
delete topicMap[existingKey];
|
|
309
|
+
}
|
|
310
|
+
topicMap[project.name] = { projectId: project.id, projectName: project.name, topicId };
|
|
311
|
+
await setTopicMap(ctx, chatId, topicMap);
|
|
312
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("🔗")} ${escapeMarkdownV2(`Mapped project "${project.name}" to topic ${topicId}`)}`, { parseMode: "MarkdownV2", messageThreadId });
|
|
313
|
+
ctx.logger.info("Topic mapped", { chatId, projectId: project.id, projectName: project.name, topicId });
|
|
314
|
+
}
|
|
315
|
+
async function handleTopicsCommand(ctx, token, chatId, args, messageThreadId) {
|
|
316
|
+
const [subcommand = "list", ...rest] = args.trim().split(/\s+/).filter(Boolean);
|
|
317
|
+
switch (subcommand.toLowerCase()) {
|
|
318
|
+
case "list":
|
|
319
|
+
await handleTopicsList(ctx, token, chatId, messageThreadId);
|
|
320
|
+
break;
|
|
321
|
+
case "remove":
|
|
322
|
+
await handleTopicsRemove(ctx, token, chatId, rest.join(" "), messageThreadId);
|
|
323
|
+
break;
|
|
324
|
+
case "clear":
|
|
325
|
+
await handleTopicsClear(ctx, token, chatId, messageThreadId);
|
|
326
|
+
break;
|
|
327
|
+
default:
|
|
328
|
+
await sendTopicsUsage(ctx, token, chatId, messageThreadId);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
async function handleTopicsList(ctx, token, chatId, messageThreadId) {
|
|
332
|
+
const topicMap = await getTopicMap(ctx, chatId);
|
|
333
|
+
const entries = Object.entries(topicMap);
|
|
334
|
+
if (entries.length === 0) {
|
|
335
|
+
await sendMessage(ctx, token, chatId, "No topic mappings found for this chat.", { messageThreadId });
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const lines = [
|
|
339
|
+
escapeMarkdownV2("🧭") + " *Topic mappings*",
|
|
340
|
+
"",
|
|
341
|
+
...entries.map(([key, value]) => {
|
|
342
|
+
const mapping = normalizeTopicMapping(key, value);
|
|
343
|
+
return `• ${escapeMarkdownV2(mapping.projectName)} ${escapeMarkdownV2("→")} ${escapeMarkdownV2(mapping.topicId)}`;
|
|
344
|
+
}),
|
|
345
|
+
];
|
|
346
|
+
await sendMessage(ctx, token, chatId, lines.join("\n"), {
|
|
347
|
+
parseMode: "MarkdownV2",
|
|
348
|
+
messageThreadId,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
async function handleTopicsRemove(ctx, token, chatId, projectName, messageThreadId) {
|
|
352
|
+
const input = projectName.trim();
|
|
353
|
+
if (!input) {
|
|
354
|
+
await sendMessage(ctx, token, chatId, "Usage: /topics remove <project\\-name>", {
|
|
355
|
+
parseMode: "MarkdownV2",
|
|
356
|
+
messageThreadId,
|
|
357
|
+
});
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const topicMap = await getTopicMap(ctx, chatId);
|
|
361
|
+
const key = findTopicMapKey(topicMap, input);
|
|
362
|
+
if (!key) {
|
|
363
|
+
await sendMessage(ctx, token, chatId, `No topic mapping found for "${input}".`, { messageThreadId });
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const mapping = normalizeTopicMapping(key, topicMap[key]);
|
|
367
|
+
delete topicMap[key];
|
|
368
|
+
await setTopicMap(ctx, chatId, topicMap);
|
|
369
|
+
await sendMessage(ctx, token, chatId, `${escapeMarkdownV2("🗑️")} ${escapeMarkdownV2(`Removed topic mapping for "${mapping.projectName}".`)}`, { parseMode: "MarkdownV2", messageThreadId });
|
|
370
|
+
}
|
|
371
|
+
async function handleTopicsClear(ctx, token, chatId, messageThreadId) {
|
|
372
|
+
await setTopicMap(ctx, chatId, {});
|
|
373
|
+
await sendMessage(ctx, token, chatId, "Cleared all topic mappings for this chat.", { messageThreadId });
|
|
374
|
+
}
|
|
375
|
+
async function sendTopicsUsage(ctx, token, chatId, messageThreadId) {
|
|
376
|
+
await sendMessage(ctx, token, chatId, [
|
|
377
|
+
escapeMarkdownV2("🧭") + " *Topic Commands*",
|
|
378
|
+
"",
|
|
379
|
+
`/topics list \\- ${escapeMarkdownV2("Show mappings for this chat")}`,
|
|
380
|
+
`/topics remove <project\\-name> \\- ${escapeMarkdownV2("Remove one mapping")}`,
|
|
381
|
+
`/topics clear \\- ${escapeMarkdownV2("Remove all mappings for this chat")}`,
|
|
382
|
+
].join("\n"), { parseMode: "MarkdownV2", messageThreadId });
|
|
383
|
+
}
|
|
384
|
+
async function resolveProjectByName(ctx, companyId, projectName) {
|
|
385
|
+
const input = projectName.trim();
|
|
386
|
+
if (!input)
|
|
387
|
+
return undefined;
|
|
388
|
+
const projects = await ctx.projects.list({ companyId, limit: 100 });
|
|
389
|
+
return projects.find((project) => project.id === input)
|
|
390
|
+
?? projects.find((project) => project.name === input)
|
|
391
|
+
?? projects.find((project) => project.name?.toLowerCase() === input.toLowerCase());
|
|
392
|
+
}
|
|
393
|
+
async function sendProjectNotFoundMessage(ctx, token, chatId, companyId, projectName, messageThreadId) {
|
|
394
|
+
try {
|
|
395
|
+
const projects = await ctx.projects.list({ companyId, limit: 100 });
|
|
396
|
+
const names = projects.map((project) => project.name || project.id).filter(Boolean).join(", ");
|
|
397
|
+
await sendMessage(ctx, token, chatId, `Project "${projectName.trim()}" not found. Available: ${names || "none"}`, { messageThreadId });
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
await sendMessage(ctx, token, chatId, `Project "${projectName.trim()}" not found.`, { messageThreadId });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
async function getTopicMap(ctx, chatId) {
|
|
404
|
+
const existing = await ctx.state.get({
|
|
405
|
+
scopeKind: "instance",
|
|
406
|
+
stateKey: `topic-map-${chatId}`,
|
|
407
|
+
});
|
|
408
|
+
if (!existing || typeof existing !== "object" || Array.isArray(existing))
|
|
409
|
+
return {};
|
|
410
|
+
return existing;
|
|
411
|
+
}
|
|
412
|
+
async function setTopicMap(ctx, chatId, topicMap) {
|
|
413
|
+
await ctx.state.set({ scopeKind: "instance", stateKey: `topic-map-${chatId}` }, topicMap);
|
|
414
|
+
}
|
|
415
|
+
function findTopicMapKey(topicMap, projectName) {
|
|
416
|
+
const input = projectName.trim().toLowerCase();
|
|
417
|
+
if (!input)
|
|
418
|
+
return undefined;
|
|
419
|
+
return Object.entries(topicMap).find(([key, value]) => {
|
|
420
|
+
const mapping = normalizeTopicMapping(key, value);
|
|
421
|
+
return key.toLowerCase() === input
|
|
422
|
+
|| mapping.projectName.toLowerCase() === input
|
|
423
|
+
|| mapping.projectId?.toLowerCase() === input;
|
|
424
|
+
})?.[0];
|
|
425
|
+
}
|
|
426
|
+
function normalizeTopicMapping(projectName, value) {
|
|
427
|
+
if (typeof value === "string") {
|
|
428
|
+
return { projectName, topicId: value };
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
projectId: value.projectId,
|
|
432
|
+
projectName: value.projectName || projectName,
|
|
433
|
+
topicId: String(value.topicId),
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
export async function getTopicForProject(ctx, chatId, projectName) {
|
|
437
|
+
if (!projectName)
|
|
438
|
+
return undefined;
|
|
439
|
+
const topicMap = await getTopicMap(ctx, chatId);
|
|
440
|
+
const key = findTopicMapKey(topicMap, projectName);
|
|
441
|
+
if (!key)
|
|
442
|
+
return undefined;
|
|
443
|
+
const mapping = normalizeTopicMapping(key, topicMap[key]);
|
|
444
|
+
return Number(mapping.topicId);
|
|
445
|
+
}
|
|
446
|
+
async function getProjectNameForTopic(ctx, chatId, messageThreadId) {
|
|
447
|
+
if (!messageThreadId)
|
|
448
|
+
return undefined;
|
|
449
|
+
const topicMap = (await ctx.state.get({
|
|
450
|
+
scopeKind: "instance",
|
|
451
|
+
stateKey: `topic-map-${chatId}`,
|
|
452
|
+
}));
|
|
453
|
+
if (!topicMap)
|
|
454
|
+
return undefined;
|
|
455
|
+
const topicId = String(messageThreadId);
|
|
456
|
+
const match = Object.entries(topicMap).find(([, mappedTopicId]) => mappedTopicId === topicId);
|
|
457
|
+
return match?.[0];
|
|
458
|
+
}
|
|
459
|
+
async function resolveProjectIdForTopic(ctx, chatId, companyId, messageThreadId) {
|
|
460
|
+
const projectName = await getProjectNameForTopic(ctx, chatId, messageThreadId);
|
|
461
|
+
if (!projectName)
|
|
462
|
+
return undefined;
|
|
463
|
+
try {
|
|
464
|
+
const projects = await ctx.projects.list({ companyId, limit: 100 });
|
|
465
|
+
const exactMatch = projects.find((project) => project.name === projectName);
|
|
466
|
+
if (exactMatch)
|
|
467
|
+
return exactMatch.id;
|
|
468
|
+
return projects.find((project) => project.name?.toLowerCase() === projectName.toLowerCase())?.id;
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
return undefined;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
export async function resolveNotificationThreadId(ctx, chatId, event, topicRouting) {
|
|
475
|
+
if (!topicRouting)
|
|
476
|
+
return undefined;
|
|
477
|
+
const projectName = await resolveEventProjectName(ctx, event);
|
|
478
|
+
return getTopicForProject(ctx, chatId, projectName);
|
|
479
|
+
}
|
|
480
|
+
async function resolveEventProjectName(ctx, event) {
|
|
481
|
+
const payload = event.payload;
|
|
482
|
+
const payloadProjectName = payload.projectName ? String(payload.projectName) : undefined;
|
|
483
|
+
if (payloadProjectName)
|
|
484
|
+
return payloadProjectName;
|
|
485
|
+
const payloadProjectId = payload.projectId ? String(payload.projectId) : undefined;
|
|
486
|
+
if (payloadProjectId) {
|
|
487
|
+
try {
|
|
488
|
+
const project = await ctx.projects.get(payloadProjectId, event.companyId);
|
|
489
|
+
if (project?.name)
|
|
490
|
+
return project.name;
|
|
491
|
+
}
|
|
492
|
+
catch {
|
|
493
|
+
return undefined;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (event.entityType !== "issue" || !event.entityId)
|
|
497
|
+
return undefined;
|
|
498
|
+
try {
|
|
499
|
+
const issue = await ctx.issues.get(event.entityId, event.companyId);
|
|
500
|
+
if (!issue?.projectId)
|
|
501
|
+
return undefined;
|
|
502
|
+
const project = await ctx.projects.get(issue.projectId, event.companyId);
|
|
503
|
+
return project?.name;
|
|
504
|
+
}
|
|
505
|
+
catch {
|
|
506
|
+
return undefined;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
async function resolveCompanyId(ctx, chatId) {
|
|
510
|
+
const mapping = await ctx.state.get({
|
|
511
|
+
scopeKind: "instance",
|
|
512
|
+
stateKey: `chat_${chatId}`,
|
|
513
|
+
});
|
|
514
|
+
return mapping?.companyId ?? mapping?.companyName ?? chatId;
|
|
515
|
+
}
|
|
516
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare const PLUGIN_ID = "paperclip-plugin-telegram-enhanced";
|
|
2
|
+
export declare const PLUGIN_VERSION = "0.2.0";
|
|
3
|
+
export declare const MAX_AGENTS_PER_THREAD = 5;
|
|
4
|
+
export declare const DEFAULT_CONFIG: {
|
|
5
|
+
readonly telegramBotTokenRef: "";
|
|
6
|
+
readonly defaultChatId: "";
|
|
7
|
+
readonly approvalsChatId: "";
|
|
8
|
+
readonly approvalsTopicId: "";
|
|
9
|
+
readonly errorsChatId: "";
|
|
10
|
+
readonly errorsTopicId: "";
|
|
11
|
+
readonly digestChatId: "";
|
|
12
|
+
readonly digestTopicId: "";
|
|
13
|
+
readonly paperclipBaseUrl: "http://localhost:3100";
|
|
14
|
+
readonly paperclipBoardApiTokenRef: "";
|
|
15
|
+
readonly paperclipPublicUrl: "";
|
|
16
|
+
readonly notifyOnIssueCreated: true;
|
|
17
|
+
readonly notifyOnIssueDone: true;
|
|
18
|
+
readonly notifyOnIssueAssigned: false;
|
|
19
|
+
readonly onlyNotifyIfAssignedTo: "";
|
|
20
|
+
readonly notifyOnApprovalCreated: true;
|
|
21
|
+
readonly onlyNotifyBoardApprovals: false;
|
|
22
|
+
readonly notifyOnAgentError: true;
|
|
23
|
+
readonly notifyOnAgentRunStarted: false;
|
|
24
|
+
readonly notifyOnAgentRunFinished: false;
|
|
25
|
+
readonly enableCommands: true;
|
|
26
|
+
readonly enableInbound: true;
|
|
27
|
+
readonly allowedTelegramUserIds: string[];
|
|
28
|
+
readonly allowedTelegramChatIds: string[];
|
|
29
|
+
readonly fileRoutes: Array<{
|
|
30
|
+
name: string;
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
projectKey: string;
|
|
33
|
+
chatId: string;
|
|
34
|
+
topicId?: string;
|
|
35
|
+
}>;
|
|
36
|
+
readonly opsRoutes: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
companyId?: string;
|
|
40
|
+
companyName?: string;
|
|
41
|
+
chatId: string;
|
|
42
|
+
topicId?: string;
|
|
43
|
+
}>;
|
|
44
|
+
readonly digestMode: "off" | "daily" | "bidaily" | "tridaily";
|
|
45
|
+
readonly dailyDigestTime: "09:00";
|
|
46
|
+
readonly bidailySecondTime: "17:00";
|
|
47
|
+
readonly tridailyTimes: "07:00,13:00,19:00";
|
|
48
|
+
readonly topicRouting: false;
|
|
49
|
+
readonly maxAgentsPerThread: 5;
|
|
50
|
+
readonly escalationChatId: "";
|
|
51
|
+
readonly escalationTimeoutMs: 900000;
|
|
52
|
+
readonly escalationDefaultAction: "defer";
|
|
53
|
+
readonly escalationHoldMessage: "Let me check on that - I'll get back to you shortly.";
|
|
54
|
+
readonly briefAgentId: "";
|
|
55
|
+
readonly briefAgentChatIds: string[];
|
|
56
|
+
readonly transcriptionApiKeyRef: "";
|
|
57
|
+
readonly maxSuggestionsPerHourPerCompany: 10;
|
|
58
|
+
readonly watchDeduplicationWindowMs: 86400000;
|
|
59
|
+
};
|
|
60
|
+
export declare const AGENT_ERROR_DEDUPLICATION_WINDOW_MS: number;
|
|
61
|
+
export declare const MAX_CONVERSATION_TURNS = 50;
|
|
62
|
+
export declare const DEFAULT_CONVERSATION_TURNS = 10;
|
|
63
|
+
export declare const METRIC_NAMES: {
|
|
64
|
+
readonly sent: "telegram_notifications_sent";
|
|
65
|
+
readonly failed: "telegram_notification_failures";
|
|
66
|
+
readonly commandsHandled: "telegram_commands_handled";
|
|
67
|
+
readonly inboundRouted: "telegram_inbound_routed";
|
|
68
|
+
readonly escalationsCreated: "telegram_escalations_created";
|
|
69
|
+
readonly escalationsResolved: "telegram_escalations_resolved";
|
|
70
|
+
readonly escalationsTimedOut: "telegram_escalations_timed_out";
|
|
71
|
+
readonly mediaProcessed: "telegram_media_processed";
|
|
72
|
+
readonly commandsExecuted: "telegram_custom_commands_executed";
|
|
73
|
+
readonly suggestionsEmitted: "telegram_suggestions_emitted";
|
|
74
|
+
};
|
|
75
|
+
export declare const ACP_SPAWN_EVENT = "acp-spawn";
|
|
76
|
+
export declare const ACP_OUTPUT_EVENT = "plugin.paperclip-plugin-acp.output";
|