jinn-cli 0.7.8 → 0.9.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 (156) hide show
  1. package/dist/bin/jimmy.js +2 -1
  2. package/dist/bin/jimmy.js.map +1 -1
  3. package/dist/package.json +54 -0
  4. package/dist/src/cli/__tests__/migrate.test.d.ts +2 -0
  5. package/dist/src/cli/__tests__/migrate.test.d.ts.map +1 -0
  6. package/dist/src/cli/__tests__/migrate.test.js +79 -0
  7. package/dist/src/cli/__tests__/migrate.test.js.map +1 -0
  8. package/dist/src/cli/migrate.d.ts.map +1 -1
  9. package/dist/src/cli/migrate.js +3 -2
  10. package/dist/src/cli/migrate.js.map +1 -1
  11. package/dist/src/connectors/discord/index.d.ts +6 -0
  12. package/dist/src/connectors/discord/index.d.ts.map +1 -1
  13. package/dist/src/connectors/discord/index.js +9 -3
  14. package/dist/src/connectors/discord/index.js.map +1 -1
  15. package/dist/src/connectors/discord/threads.d.ts +1 -1
  16. package/dist/src/connectors/discord/threads.d.ts.map +1 -1
  17. package/dist/src/connectors/discord/threads.js +4 -4
  18. package/dist/src/connectors/discord/threads.js.map +1 -1
  19. package/dist/src/connectors/telegram/__tests__/connector.test.d.ts +2 -0
  20. package/dist/src/connectors/telegram/__tests__/connector.test.d.ts.map +1 -0
  21. package/dist/src/connectors/telegram/__tests__/connector.test.js +257 -0
  22. package/dist/src/connectors/telegram/__tests__/connector.test.js.map +1 -0
  23. package/dist/src/connectors/telegram/__tests__/format.test.d.ts +2 -0
  24. package/dist/src/connectors/telegram/__tests__/format.test.d.ts.map +1 -0
  25. package/dist/src/connectors/telegram/__tests__/format.test.js +79 -0
  26. package/dist/src/connectors/telegram/__tests__/format.test.js.map +1 -0
  27. package/dist/src/connectors/telegram/__tests__/threads.test.d.ts +2 -0
  28. package/dist/src/connectors/telegram/__tests__/threads.test.d.ts.map +1 -0
  29. package/dist/src/connectors/telegram/__tests__/threads.test.js +51 -0
  30. package/dist/src/connectors/telegram/__tests__/threads.test.js.map +1 -0
  31. package/dist/src/connectors/telegram/format.d.ts +12 -0
  32. package/dist/src/connectors/telegram/format.d.ts.map +1 -0
  33. package/dist/src/connectors/telegram/format.js +61 -0
  34. package/dist/src/connectors/telegram/format.js.map +1 -0
  35. package/dist/src/connectors/telegram/index.d.ts +26 -0
  36. package/dist/src/connectors/telegram/index.d.ts.map +1 -0
  37. package/dist/src/connectors/telegram/index.js +185 -0
  38. package/dist/src/connectors/telegram/index.js.map +1 -0
  39. package/dist/src/connectors/telegram/threads.d.ts +29 -0
  40. package/dist/src/connectors/telegram/threads.d.ts.map +1 -0
  41. package/dist/src/connectors/telegram/threads.js +26 -0
  42. package/dist/src/connectors/telegram/threads.js.map +1 -0
  43. package/dist/src/cron/runner.js.map +1 -1
  44. package/dist/src/engines/__tests__/gemini.test.d.ts +2 -0
  45. package/dist/src/engines/__tests__/gemini.test.d.ts.map +1 -0
  46. package/dist/src/engines/__tests__/gemini.test.js +404 -0
  47. package/dist/src/engines/__tests__/gemini.test.js.map +1 -0
  48. package/dist/src/engines/gemini.d.ts +32 -0
  49. package/dist/src/engines/gemini.d.ts.map +1 -0
  50. package/dist/src/engines/gemini.js +328 -0
  51. package/dist/src/engines/gemini.js.map +1 -0
  52. package/dist/src/gateway/__tests__/org-hierarchy.test.d.ts +2 -0
  53. package/dist/src/gateway/__tests__/org-hierarchy.test.d.ts.map +1 -0
  54. package/dist/src/gateway/__tests__/org-hierarchy.test.js +161 -0
  55. package/dist/src/gateway/__tests__/org-hierarchy.test.js.map +1 -0
  56. package/dist/src/gateway/__tests__/org-update.test.d.ts +2 -0
  57. package/dist/src/gateway/__tests__/org-update.test.d.ts.map +1 -0
  58. package/dist/src/gateway/__tests__/org-update.test.js +99 -0
  59. package/dist/src/gateway/__tests__/org-update.test.js.map +1 -0
  60. package/dist/src/gateway/__tests__/org.test.d.ts +2 -0
  61. package/dist/src/gateway/__tests__/org.test.d.ts.map +1 -0
  62. package/dist/src/gateway/__tests__/org.test.js +77 -0
  63. package/dist/src/gateway/__tests__/org.test.js.map +1 -0
  64. package/dist/src/gateway/__tests__/services.test.d.ts +2 -0
  65. package/dist/src/gateway/__tests__/services.test.d.ts.map +1 -0
  66. package/dist/src/gateway/__tests__/services.test.js +153 -0
  67. package/dist/src/gateway/__tests__/services.test.js.map +1 -0
  68. package/dist/src/gateway/api.d.ts +5 -0
  69. package/dist/src/gateway/api.d.ts.map +1 -1
  70. package/dist/src/gateway/api.js +302 -77
  71. package/dist/src/gateway/api.js.map +1 -1
  72. package/dist/src/gateway/org-hierarchy.d.ts +5 -0
  73. package/dist/src/gateway/org-hierarchy.d.ts.map +1 -0
  74. package/dist/src/gateway/org-hierarchy.js +174 -0
  75. package/dist/src/gateway/org-hierarchy.js.map +1 -0
  76. package/dist/src/gateway/org.d.ts +7 -0
  77. package/dist/src/gateway/org.d.ts.map +1 -1
  78. package/dist/src/gateway/org.js +64 -0
  79. package/dist/src/gateway/org.js.map +1 -1
  80. package/dist/src/gateway/server.d.ts.map +1 -1
  81. package/dist/src/gateway/server.js +262 -5
  82. package/dist/src/gateway/server.js.map +1 -1
  83. package/dist/src/gateway/services.d.ts +28 -0
  84. package/dist/src/gateway/services.d.ts.map +1 -0
  85. package/dist/src/gateway/services.js +112 -0
  86. package/dist/src/gateway/services.js.map +1 -0
  87. package/dist/src/sessions/__tests__/callbacks.test.js +36 -0
  88. package/dist/src/sessions/__tests__/callbacks.test.js.map +1 -1
  89. package/dist/src/sessions/callbacks.d.ts +2 -0
  90. package/dist/src/sessions/callbacks.d.ts.map +1 -1
  91. package/dist/src/sessions/callbacks.js +3 -1
  92. package/dist/src/sessions/callbacks.js.map +1 -1
  93. package/dist/src/sessions/context.d.ts +1 -0
  94. package/dist/src/sessions/context.d.ts.map +1 -1
  95. package/dist/src/sessions/context.js +121 -6
  96. package/dist/src/sessions/context.js.map +1 -1
  97. package/dist/src/sessions/fork.d.ts +30 -0
  98. package/dist/src/sessions/fork.d.ts.map +1 -0
  99. package/dist/src/sessions/fork.js +178 -0
  100. package/dist/src/sessions/fork.js.map +1 -0
  101. package/dist/src/sessions/manager.d.ts.map +1 -1
  102. package/dist/src/sessions/manager.js +16 -5
  103. package/dist/src/sessions/manager.js.map +1 -1
  104. package/dist/src/sessions/registry.d.ts +9 -0
  105. package/dist/src/sessions/registry.d.ts.map +1 -1
  106. package/dist/src/sessions/registry.js +40 -0
  107. package/dist/src/sessions/registry.js.map +1 -1
  108. package/dist/src/shared/types.d.ts +81 -1
  109. package/dist/src/shared/types.d.ts.map +1 -1
  110. package/dist/web/404.html +1 -1
  111. package/dist/web/_next/static/chunks/155-655a087df45da990.js +1 -0
  112. package/dist/web/_next/static/chunks/192-c0150e3d227be735.js +1 -0
  113. package/dist/web/_next/static/chunks/579-09eb1d7ab35333fc.js +1 -0
  114. package/dist/web/_next/static/chunks/943.7dec3c35287ad545.js +1 -0
  115. package/dist/web/_next/static/chunks/app/chat/page-4ba0008df3b5d032.js +1 -0
  116. package/dist/web/_next/static/chunks/app/cron/page-648f892629b4af65.js +1 -0
  117. package/dist/web/_next/static/chunks/app/kanban/{page-0aa74ece5109e58f.js → page-5e00ac0363936a53.js} +1 -1
  118. package/dist/web/_next/static/chunks/app/{layout-497d1e93737edeae.js → layout-f5c5165308a903e2.js} +1 -1
  119. package/dist/web/_next/static/chunks/app/org/page-0f7617805f6f6eb7.js +1 -0
  120. package/dist/web/_next/static/chunks/app/settings/page-5588e1b2bb8a5196.js +1 -0
  121. package/dist/web/_next/static/chunks/{webpack-2e375360ad2078fe.js → webpack-21588284a59cb80f.js} +1 -1
  122. package/dist/web/_next/static/css/334114aa3839160f.css +1 -0
  123. package/dist/web/chat.html +1 -1
  124. package/dist/web/chat.txt +5 -5
  125. package/dist/web/cron.html +1 -1
  126. package/dist/web/cron.txt +5 -5
  127. package/dist/web/index.html +1 -1
  128. package/dist/web/index.txt +5 -5
  129. package/dist/web/kanban.html +1 -1
  130. package/dist/web/kanban.txt +5 -5
  131. package/dist/web/logs.html +2 -2
  132. package/dist/web/logs.txt +5 -5
  133. package/dist/web/org.html +1 -1
  134. package/dist/web/org.txt +5 -5
  135. package/dist/web/sessions.html +1 -1
  136. package/dist/web/sessions.txt +4 -4
  137. package/dist/web/settings.html +1 -1
  138. package/dist/web/settings.txt +5 -5
  139. package/dist/web/skills.html +1 -1
  140. package/dist/web/skills.txt +5 -5
  141. package/package.json +5 -3
  142. package/template/AGENTS.md +132 -31
  143. package/template/CLAUDE.md +186 -24
  144. package/template/migrations/0.8.0/MIGRATION.md +73 -0
  145. package/template/skills/management/SKILL.md +32 -9
  146. package/dist/web/_next/static/chunks/155-5843f8840f40f6f8.js +0 -1
  147. package/dist/web/_next/static/chunks/192-f566317c5713c743.js +0 -1
  148. package/dist/web/_next/static/chunks/660-7b281827cf68988a.js +0 -1
  149. package/dist/web/_next/static/chunks/943.c30215b2dbec402b.js +0 -1
  150. package/dist/web/_next/static/chunks/app/chat/page-01d396112fbc8623.js +0 -1
  151. package/dist/web/_next/static/chunks/app/cron/page-9787c557594dc688.js +0 -1
  152. package/dist/web/_next/static/chunks/app/org/page-b14614ed22c7a80d.js +0 -1
  153. package/dist/web/_next/static/chunks/app/settings/page-c2b014fb0706aa88.js +0 -1
  154. package/dist/web/_next/static/css/29fd6f6f1915cce0.css +0 -1
  155. /package/dist/web/_next/static/{73aF2gsMYJ-t64sWQw1Av → VBCQXj1bVyMDiXQTiHQ-p}/_buildManifest.js +0 -0
  156. /package/dist/web/_next/static/{73aF2gsMYJ-t64sWQw1Av → VBCQXj1bVyMDiXQTiHQ-p}/_ssgManifest.js +0 -0
@@ -0,0 +1,257 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ // Mock node-telegram-bot-api before importing connector
3
+ const mockSendMessage = vi.fn().mockResolvedValue({ message_id: 1 });
4
+ const mockEditMessageText = vi.fn().mockResolvedValue(true);
5
+ const mockGetMe = vi.fn().mockResolvedValue({ id: 999, username: "test_bot" });
6
+ const mockStartPolling = vi.fn();
7
+ const mockStopPolling = vi.fn().mockResolvedValue(undefined);
8
+ const mockOn = vi.fn();
9
+ vi.mock("node-telegram-bot-api", () => {
10
+ const MockBot = vi.fn(function () {
11
+ this.sendMessage = mockSendMessage;
12
+ this.editMessageText = mockEditMessageText;
13
+ this.getMe = mockGetMe;
14
+ this.startPolling = mockStartPolling;
15
+ this.stopPolling = mockStopPolling;
16
+ this.on = mockOn;
17
+ });
18
+ return { default: MockBot };
19
+ });
20
+ vi.mock("../../../shared/logger.js", () => ({
21
+ logger: {
22
+ info: vi.fn(),
23
+ warn: vi.fn(),
24
+ debug: vi.fn(),
25
+ error: vi.fn(),
26
+ },
27
+ }));
28
+ // Import after mocks are set up
29
+ const { TelegramConnector } = await import("../index.js");
30
+ describe("TelegramConnector", () => {
31
+ let connector;
32
+ beforeEach(() => {
33
+ vi.clearAllMocks();
34
+ connector = new TelegramConnector({
35
+ botToken: "123456:ABC-DEF",
36
+ });
37
+ });
38
+ describe("constructor", () => {
39
+ it("sets the connector name to telegram", () => {
40
+ expect(connector.name).toBe("telegram");
41
+ });
42
+ });
43
+ describe("getCapabilities", () => {
44
+ it("returns correct capabilities", () => {
45
+ expect(connector.getCapabilities()).toEqual({
46
+ threading: false,
47
+ messageEdits: true,
48
+ reactions: false,
49
+ attachments: true,
50
+ });
51
+ });
52
+ });
53
+ describe("getHealth", () => {
54
+ it("returns stopped before start", () => {
55
+ const health = connector.getHealth();
56
+ expect(health.status).toBe("stopped");
57
+ });
58
+ });
59
+ describe("start", () => {
60
+ it("registers message handler and starts polling after validation", async () => {
61
+ await connector.start();
62
+ const health = connector.getHealth();
63
+ expect(health.status).toBe("running");
64
+ expect(mockGetMe).toHaveBeenCalledOnce();
65
+ expect(mockStartPolling).toHaveBeenCalledOnce();
66
+ expect(mockOn).toHaveBeenCalledWith("message", expect.any(Function));
67
+ });
68
+ it("does not start polling if getMe fails (invalid token)", async () => {
69
+ mockGetMe.mockRejectedValueOnce(new Error("Invalid token"));
70
+ await connector.start();
71
+ const health = connector.getHealth();
72
+ expect(health.status).toBe("error");
73
+ expect(health.detail).toContain("Invalid token");
74
+ expect(mockStartPolling).not.toHaveBeenCalled();
75
+ });
76
+ });
77
+ describe("stop", () => {
78
+ it("stops polling and sets stopped state", async () => {
79
+ await connector.start();
80
+ await connector.stop();
81
+ expect(mockStopPolling).toHaveBeenCalledOnce();
82
+ expect(connector.getHealth().status).toBe("stopped");
83
+ });
84
+ });
85
+ describe("onMessage", () => {
86
+ it("routes incoming messages to the handler", async () => {
87
+ const handler = vi.fn();
88
+ connector.onMessage(handler);
89
+ await connector.start();
90
+ // Get the registered message callback
91
+ const messageCallback = mockOn.mock.calls.find((call) => call[0] === "message")?.[1];
92
+ expect(messageCallback).toBeDefined();
93
+ // Simulate incoming Telegram message
94
+ const telegramMsg = {
95
+ message_id: 42,
96
+ chat: { id: 12345, type: "private" },
97
+ from: { id: 67890, username: "testuser", first_name: "Test", is_bot: false },
98
+ date: Math.floor(Date.now() / 1000) + 10,
99
+ text: "Hello bot!",
100
+ };
101
+ await messageCallback(telegramMsg);
102
+ expect(handler).toHaveBeenCalledOnce();
103
+ const msg = handler.mock.calls[0][0];
104
+ expect(msg.connector).toBe("telegram");
105
+ expect(msg.source).toBe("telegram");
106
+ expect(msg.sessionKey).toBe("telegram:12345");
107
+ expect(msg.text).toBe("Hello bot!");
108
+ expect(msg.user).toBe("testuser");
109
+ expect(msg.userId).toBe("67890");
110
+ expect(msg.channel).toBe("12345");
111
+ });
112
+ it("ignores messages from bots", async () => {
113
+ const handler = vi.fn();
114
+ connector.onMessage(handler);
115
+ await connector.start();
116
+ const messageCallback = mockOn.mock.calls.find((call) => call[0] === "message")?.[1];
117
+ const botMsg = {
118
+ message_id: 1,
119
+ chat: { id: 12345, type: "private" },
120
+ from: { id: 999, username: "test_bot", first_name: "Bot", is_bot: true },
121
+ date: Math.floor(Date.now() / 1000) + 10,
122
+ text: "Bot message",
123
+ };
124
+ await messageCallback(botMsg);
125
+ expect(handler).not.toHaveBeenCalled();
126
+ });
127
+ it("ignores messages from unauthorized users when allowFrom is set", async () => {
128
+ const restricted = new TelegramConnector({
129
+ botToken: "123456:ABC-DEF",
130
+ allowFrom: [67890],
131
+ });
132
+ const handler = vi.fn();
133
+ restricted.onMessage(handler);
134
+ await restricted.start();
135
+ const messageCallback = mockOn.mock.calls.find((call) => call[0] === "message")?.[1];
136
+ // Unauthorized user
137
+ const msg = {
138
+ message_id: 1,
139
+ chat: { id: 11111, type: "private" },
140
+ from: { id: 99999, username: "stranger", first_name: "Stranger", is_bot: false },
141
+ date: Math.floor(Date.now() / 1000) + 10,
142
+ text: "Hello",
143
+ };
144
+ await messageCallback(msg);
145
+ expect(handler).not.toHaveBeenCalled();
146
+ });
147
+ it("rejects messages with from: undefined when allowFrom is set", async () => {
148
+ const restricted = new TelegramConnector({
149
+ botToken: "123456:ABC-DEF",
150
+ allowFrom: [67890],
151
+ });
152
+ const handler = vi.fn();
153
+ restricted.onMessage(handler);
154
+ await restricted.start();
155
+ const messageCallback = mockOn.mock.calls.find((call) => call[0] === "message")?.[1];
156
+ // Channel post or forwarded message with no `from`
157
+ const msg = {
158
+ message_id: 1,
159
+ chat: { id: 11111, type: "channel" },
160
+ date: Math.floor(Date.now() / 1000) + 10,
161
+ text: "Channel post",
162
+ };
163
+ await messageCallback(msg);
164
+ expect(handler).not.toHaveBeenCalled();
165
+ });
166
+ it("allows messages from authorized users through allowFrom", async () => {
167
+ const restricted = new TelegramConnector({
168
+ botToken: "123456:ABC-DEF",
169
+ allowFrom: [67890],
170
+ });
171
+ const handler = vi.fn();
172
+ restricted.onMessage(handler);
173
+ await restricted.start();
174
+ const messageCallback = mockOn.mock.calls.find((call) => call[0] === "message")?.[1];
175
+ const msg = {
176
+ message_id: 1,
177
+ chat: { id: 12345, type: "private" },
178
+ from: { id: 67890, username: "allowed_user", first_name: "Allowed", is_bot: false },
179
+ date: Math.floor(Date.now() / 1000) + 10,
180
+ text: "Hello",
181
+ };
182
+ await messageCallback(msg);
183
+ expect(handler).toHaveBeenCalledOnce();
184
+ });
185
+ });
186
+ describe("sendMessage", () => {
187
+ it("sends a message to the target chat", async () => {
188
+ const target = { channel: "12345" };
189
+ await connector.sendMessage(target, "Hello!");
190
+ expect(mockSendMessage).toHaveBeenCalledWith("12345", "Hello!", {
191
+ parse_mode: "Markdown",
192
+ });
193
+ });
194
+ it("does not send empty messages", async () => {
195
+ const target = { channel: "12345" };
196
+ await connector.sendMessage(target, "");
197
+ expect(mockSendMessage).not.toHaveBeenCalled();
198
+ });
199
+ it("chunks long messages", async () => {
200
+ const target = { channel: "12345" };
201
+ const longText = "A".repeat(5000);
202
+ await connector.sendMessage(target, longText);
203
+ expect(mockSendMessage).toHaveBeenCalledTimes(2);
204
+ });
205
+ it("retries without parse_mode on Markdown parse error", async () => {
206
+ mockSendMessage
207
+ .mockRejectedValueOnce(new Error("Bad Request: can't parse entities"))
208
+ .mockResolvedValueOnce({ message_id: 2 });
209
+ const target = { channel: "12345" };
210
+ const result = await connector.sendMessage(target, "**bad markdown");
211
+ // First call with Markdown, second without
212
+ expect(mockSendMessage).toHaveBeenCalledTimes(2);
213
+ expect(mockSendMessage.mock.calls[0][2]).toEqual({ parse_mode: "Markdown" });
214
+ expect(mockSendMessage.mock.calls[1][2]).toEqual({});
215
+ expect(result).toBe("2");
216
+ });
217
+ });
218
+ describe("replyMessage", () => {
219
+ it("sends a reply to a specific message", async () => {
220
+ const target = {
221
+ channel: "12345",
222
+ replyContext: { chatId: 12345, messageId: 42 },
223
+ };
224
+ await connector.replyMessage(target, "Reply!");
225
+ expect(mockSendMessage).toHaveBeenCalledWith("12345", "Reply!", {
226
+ parse_mode: "Markdown",
227
+ reply_to_message_id: 42,
228
+ });
229
+ });
230
+ });
231
+ describe("editMessage", () => {
232
+ it("edits an existing message", async () => {
233
+ const target = {
234
+ channel: "12345",
235
+ messageTs: "42",
236
+ };
237
+ await connector.editMessage(target, "Edited!");
238
+ expect(mockEditMessageText).toHaveBeenCalledWith("Edited!", {
239
+ chat_id: "12345",
240
+ message_id: 42,
241
+ parse_mode: "Markdown",
242
+ });
243
+ });
244
+ });
245
+ describe("reconstructTarget", () => {
246
+ it("reconstructs target from reply context", () => {
247
+ const target = connector.reconstructTarget({
248
+ chatId: 12345,
249
+ messageId: 42,
250
+ });
251
+ expect(target.channel).toBe("12345");
252
+ expect(target.messageTs).toBe("42");
253
+ expect(target.replyContext).toEqual({ chatId: 12345, messageId: 42 });
254
+ });
255
+ });
256
+ });
257
+ //# sourceMappingURL=connector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.test.js","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/connector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=format.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/format.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { markdownToTelegram, formatResponse } from "../format.js";
3
+ describe("markdownToTelegram", () => {
4
+ describe("headings", () => {
5
+ it("converts markdown headings to bold text", () => {
6
+ expect(markdownToTelegram("# Heading 1")).toBe("*Heading 1*");
7
+ expect(markdownToTelegram("## Heading 2")).toBe("*Heading 2*");
8
+ expect(markdownToTelegram("### Heading 3")).toBe("*Heading 3*");
9
+ });
10
+ });
11
+ describe("bold", () => {
12
+ it("preserves **bold** as *bold*", () => {
13
+ expect(markdownToTelegram("**bold text**")).toBe("*bold text*");
14
+ });
15
+ it("converts __bold__ to *bold*", () => {
16
+ expect(markdownToTelegram("__bold text__")).toBe("*bold text*");
17
+ });
18
+ });
19
+ describe("italic", () => {
20
+ it("converts single *italic* to _italic_", () => {
21
+ expect(markdownToTelegram("*italic text*")).toBe("_italic text_");
22
+ });
23
+ });
24
+ describe("strikethrough", () => {
25
+ it("preserves ~~strikethrough~~", () => {
26
+ expect(markdownToTelegram("~~deleted~~")).toBe("~deleted~");
27
+ });
28
+ });
29
+ describe("links", () => {
30
+ it("converts markdown links to Telegram inline links", () => {
31
+ expect(markdownToTelegram("[Google](https://google.com)")).toBe("[Google](https://google.com)");
32
+ });
33
+ });
34
+ describe("bullet lists", () => {
35
+ it("converts - items to bullet points", () => {
36
+ expect(markdownToTelegram("- item one\n- item two")).toBe("• item one\n• item two");
37
+ });
38
+ it("converts * items to bullet points", () => {
39
+ expect(markdownToTelegram("* item one\n* item two")).toBe("• item one\n• item two");
40
+ });
41
+ it("preserves indentation", () => {
42
+ expect(markdownToTelegram(" - nested")).toBe(" • nested");
43
+ });
44
+ });
45
+ describe("code blocks", () => {
46
+ it("preserves inline code untouched", () => {
47
+ expect(markdownToTelegram("`**not bold**`")).toBe("`**not bold**`");
48
+ });
49
+ it("preserves fenced code blocks untouched", () => {
50
+ const input = "```\n**not bold**\n```";
51
+ expect(markdownToTelegram(input)).toBe(input);
52
+ });
53
+ });
54
+ describe("mixed content", () => {
55
+ it("handles mixed markdown correctly", () => {
56
+ const input = "## Title\n\n**Bold** and ~~deleted~~ with `code`";
57
+ const expected = "*Title*\n\n*Bold* and ~deleted~ with `code`";
58
+ expect(markdownToTelegram(input)).toBe(expected);
59
+ });
60
+ });
61
+ });
62
+ describe("formatResponse", () => {
63
+ it("returns a single chunk for short messages", () => {
64
+ const result = formatResponse("Hello world");
65
+ expect(result).toEqual(["Hello world"]);
66
+ });
67
+ it("splits long messages at newline boundaries", () => {
68
+ const line = "A".repeat(4000);
69
+ const input = `${line}\n${"B".repeat(4000)}`;
70
+ const result = formatResponse(input);
71
+ expect(result.length).toBe(2);
72
+ expect(result[0]).toBe(line);
73
+ });
74
+ it("applies markdown conversion before chunking", () => {
75
+ const result = formatResponse("## Hello");
76
+ expect(result).toEqual(["*Hello*"]);
77
+ });
78
+ });
79
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=threads.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.test.d.ts","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/threads.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { deriveSessionKey, buildReplyContext, isOldTelegramMessage } from "../threads.js";
3
+ describe("deriveSessionKey", () => {
4
+ it("returns telegram:<chatId> for a private chat", () => {
5
+ expect(deriveSessionKey({ chat: { id: 12345, type: "private" }, message_id: 1 })).toBe("telegram:12345");
6
+ });
7
+ it("returns telegram:<chatId> for a group chat", () => {
8
+ expect(deriveSessionKey({ chat: { id: -100999, type: "group" }, message_id: 1 })).toBe("telegram:-100999");
9
+ });
10
+ it("returns telegram:<chatId> for a supergroup", () => {
11
+ expect(deriveSessionKey({ chat: { id: -1001234, type: "supergroup" }, message_id: 1 })).toBe("telegram:-1001234");
12
+ });
13
+ });
14
+ describe("buildReplyContext", () => {
15
+ it("builds reply context for a private message", () => {
16
+ const ctx = buildReplyContext({
17
+ chat: { id: 12345, type: "private" },
18
+ message_id: 42,
19
+ });
20
+ expect(ctx).toEqual({
21
+ chatId: 12345,
22
+ messageId: 42,
23
+ });
24
+ });
25
+ it("builds reply context for a group message", () => {
26
+ const ctx = buildReplyContext({
27
+ chat: { id: -100999, type: "group" },
28
+ message_id: 99,
29
+ });
30
+ expect(ctx).toEqual({
31
+ chatId: -100999,
32
+ messageId: 99,
33
+ });
34
+ });
35
+ });
36
+ describe("isOldTelegramMessage", () => {
37
+ it("returns true for messages before boot time", () => {
38
+ const bootTime = 1700000000000; // ms
39
+ const msgDate = 1699999990; // seconds — before boot
40
+ expect(isOldTelegramMessage(msgDate, bootTime)).toBe(true);
41
+ });
42
+ it("returns false for messages after boot time", () => {
43
+ const bootTime = 1700000000000;
44
+ const msgDate = 1700000010; // seconds — after boot
45
+ expect(isOldTelegramMessage(msgDate, bootTime)).toBe(false);
46
+ });
47
+ it("returns false for undefined date", () => {
48
+ expect(isOldTelegramMessage(undefined, Date.now())).toBe(false);
49
+ });
50
+ });
51
+ //# sourceMappingURL=threads.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads.test.js","sourceRoot":"","sources":["../../../../../src/connectors/telegram/__tests__/threads.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Convert standard markdown to Telegram Markdown format.
3
+ * Handles headings, bold, italic, strikethrough, links, and bullet lists.
4
+ * Preserves code blocks and inline code untouched.
5
+ */
6
+ export declare function markdownToTelegram(text: string): string;
7
+ /**
8
+ * Split text into chunks that fit within Telegram's message length limit (4096 chars).
9
+ * Converts markdown to Telegram format before chunking.
10
+ */
11
+ export declare function formatResponse(text: string): string[];
12
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/format.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA8BrD"}
@@ -0,0 +1,61 @@
1
+ const TELEGRAM_MAX_LENGTH = 4096;
2
+ /**
3
+ * Convert standard markdown to Telegram Markdown format.
4
+ * Handles headings, bold, italic, strikethrough, links, and bullet lists.
5
+ * Preserves code blocks and inline code untouched.
6
+ */
7
+ export function markdownToTelegram(text) {
8
+ // Split text into code and non-code segments to protect code from conversion
9
+ const segments = text.split(/(```[\s\S]*?```|`[^`]+`)/g);
10
+ return segments
11
+ .map((segment, i) => {
12
+ // Odd indices are code matches — leave them untouched
13
+ if (i % 2 === 1)
14
+ return segment;
15
+ return (segment
16
+ // Headings: ## text → bold (placeholder to avoid italic capture)
17
+ .replace(/^(#{1,6})\s+(.+)$/gm, (_match, _hashes, content) => `\x00BOLD${content}\x00BOLD`)
18
+ // Bold: **text** or __text__ → placeholder
19
+ .replace(/\*\*(.+?)\*\*/g, "\x00BOLD$1\x00BOLD")
20
+ .replace(/__(.+?)__/g, "\x00BOLD$1\x00BOLD")
21
+ // Italic: *text* → _text_ (after bold is extracted)
22
+ .replace(/\*(.+?)\*/g, "_$1_")
23
+ // Restore bold markers → *text*
24
+ .replace(/\x00BOLD(.+?)\x00BOLD/g, "*$1*")
25
+ // Strikethrough: ~~text~~ → ~text~
26
+ .replace(/~~(.+?)~~/g, "~$1~")
27
+ // Bullet lists: - item or * item → • item
28
+ .replace(/^(\s*)[-*]\s+/gm, "$1• "));
29
+ })
30
+ .join("");
31
+ }
32
+ /**
33
+ * Split text into chunks that fit within Telegram's message length limit (4096 chars).
34
+ * Converts markdown to Telegram format before chunking.
35
+ */
36
+ export function formatResponse(text) {
37
+ const converted = markdownToTelegram(text);
38
+ if (converted.length <= TELEGRAM_MAX_LENGTH) {
39
+ return [converted];
40
+ }
41
+ const chunks = [];
42
+ let remaining = converted;
43
+ while (remaining.length > 0) {
44
+ if (remaining.length <= TELEGRAM_MAX_LENGTH) {
45
+ chunks.push(remaining);
46
+ break;
47
+ }
48
+ // Try to split at a newline boundary within the limit
49
+ let splitIndex = remaining.lastIndexOf("\n", TELEGRAM_MAX_LENGTH);
50
+ if (splitIndex <= 0) {
51
+ splitIndex = remaining.lastIndexOf(" ", TELEGRAM_MAX_LENGTH);
52
+ }
53
+ if (splitIndex <= 0) {
54
+ splitIndex = TELEGRAM_MAX_LENGTH;
55
+ }
56
+ chunks.push(remaining.slice(0, splitIndex));
57
+ remaining = remaining.slice(splitIndex).trimStart();
58
+ }
59
+ return chunks;
60
+ }
61
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../../src/connectors/telegram/format.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAEzD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QAClB,sDAAsD;QACtD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QAEhC,OAAO,CACL,OAAO;YACL,iEAAiE;aAChE,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,OAAO,UAAU,CAAC;YAC3F,2CAA2C;aAC1C,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;aAC/C,OAAO,CAAC,YAAY,EAAE,oBAAoB,CAAC;YAC5C,oDAAoD;aACnD,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;YAC9B,gCAAgC;aAC/B,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC;YAC1C,mCAAmC;aAClC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;YAC9B,0CAA0C;aACzC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CACtC,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE3C,IAAI,SAAS,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;QAC5C,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,SAAS,CAAC;IAE1B,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QAED,sDAAsD;QACtD,IAAI,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAClE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,UAAU,GAAG,mBAAmB,CAAC;QACnC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Connector, ConnectorCapabilities, ConnectorHealth, IncomingMessage, ReplyContext, Target, TelegramConnectorConfig } from "../../shared/types.js";
2
+ export declare class TelegramConnector implements Connector {
3
+ name: string;
4
+ private bot;
5
+ private handler;
6
+ private readonly allowedUsers;
7
+ private readonly ignoreOldMessagesOnBoot;
8
+ private readonly bootTimeMs;
9
+ private started;
10
+ private lastError;
11
+ private readonly capabilities;
12
+ constructor(config: TelegramConnectorConfig);
13
+ start(): Promise<void>;
14
+ stop(): Promise<void>;
15
+ getCapabilities(): ConnectorCapabilities;
16
+ getHealth(): ConnectorHealth;
17
+ reconstructTarget(replyContext: ReplyContext): Target;
18
+ private safeSend;
19
+ sendMessage(target: Target, text: string): Promise<string | undefined>;
20
+ replyMessage(target: Target, text: string): Promise<string | undefined>;
21
+ addReaction(_target: Target, _emoji: string): Promise<void>;
22
+ removeReaction(_target: Target, _emoji: string): Promise<void>;
23
+ editMessage(target: Target, text: string): Promise<void>;
24
+ onMessage(handler: (msg: IncomingMessage) => void): void;
25
+ }
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/connectors/telegram/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,MAAM,EACN,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAK/B,qBAAa,iBAAkB,YAAW,SAAS;IACjD,IAAI,SAAc;IAClB,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IAExC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAK3B;gBAEU,MAAM,EAAE,uBAAuB;IASrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,eAAe,IAAI,qBAAqB;IAIxC,SAAS,IAAI,eAAe;IAQ5B,iBAAiB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM;YAQvC,QAAQ;IAwBhB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAYtE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAoBvE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9D,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;CAGzD"}