@0xmaxma/claude-gateway 1.0.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 (192) hide show
  1. package/README.md +791 -0
  2. package/config.template.json +87 -0
  3. package/dist/agent/context-isolation.d.ts +28 -0
  4. package/dist/agent/context-isolation.d.ts.map +1 -0
  5. package/dist/agent/context-isolation.js +80 -0
  6. package/dist/agent/context-isolation.js.map +1 -0
  7. package/dist/agent/runner.d.ts +211 -0
  8. package/dist/agent/runner.d.ts.map +1 -0
  9. package/dist/agent/runner.js +1802 -0
  10. package/dist/agent/runner.js.map +1 -0
  11. package/dist/agent/workspace-loader.d.ts +31 -0
  12. package/dist/agent/workspace-loader.d.ts.map +1 -0
  13. package/dist/agent/workspace-loader.js +207 -0
  14. package/dist/agent/workspace-loader.js.map +1 -0
  15. package/dist/api/auth.d.ts +25 -0
  16. package/dist/api/auth.d.ts.map +1 -0
  17. package/dist/api/auth.js +77 -0
  18. package/dist/api/auth.js.map +1 -0
  19. package/dist/api/cron-router.d.ts +22 -0
  20. package/dist/api/cron-router.d.ts.map +1 -0
  21. package/dist/api/cron-router.js +197 -0
  22. package/dist/api/cron-router.js.map +1 -0
  23. package/dist/api/gateway-router.d.ts +52 -0
  24. package/dist/api/gateway-router.d.ts.map +1 -0
  25. package/dist/api/gateway-router.js +215 -0
  26. package/dist/api/gateway-router.js.map +1 -0
  27. package/dist/api/router.d.ts +5 -0
  28. package/dist/api/router.d.ts.map +1 -0
  29. package/dist/api/router.js +1098 -0
  30. package/dist/api/router.js.map +1 -0
  31. package/dist/api/skills-router.d.ts +5 -0
  32. package/dist/api/skills-router.d.ts.map +1 -0
  33. package/dist/api/skills-router.js +424 -0
  34. package/dist/api/skills-router.js.map +1 -0
  35. package/dist/api/workspace-router.d.ts +4 -0
  36. package/dist/api/workspace-router.d.ts.map +1 -0
  37. package/dist/api/workspace-router.js +149 -0
  38. package/dist/api/workspace-router.js.map +1 -0
  39. package/dist/config/loader.d.ts +16 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +235 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/migrator.d.ts +70 -0
  44. package/dist/config/migrator.d.ts.map +1 -0
  45. package/dist/config/migrator.js +343 -0
  46. package/dist/config/migrator.js.map +1 -0
  47. package/dist/config/watcher.d.ts +30 -0
  48. package/dist/config/watcher.d.ts.map +1 -0
  49. package/dist/config/watcher.js +170 -0
  50. package/dist/config/watcher.js.map +1 -0
  51. package/dist/cron/manager.d.ts +48 -0
  52. package/dist/cron/manager.d.ts.map +1 -0
  53. package/dist/cron/manager.js +580 -0
  54. package/dist/cron/manager.js.map +1 -0
  55. package/dist/cron/scheduler.d.ts +50 -0
  56. package/dist/cron/scheduler.d.ts.map +1 -0
  57. package/dist/cron/scheduler.js +231 -0
  58. package/dist/cron/scheduler.js.map +1 -0
  59. package/dist/discord/receiver.d.ts +17 -0
  60. package/dist/discord/receiver.d.ts.map +1 -0
  61. package/dist/discord/receiver.js +108 -0
  62. package/dist/discord/receiver.js.map +1 -0
  63. package/dist/heartbeat/history.d.ts +24 -0
  64. package/dist/heartbeat/history.d.ts.map +1 -0
  65. package/dist/heartbeat/history.js +50 -0
  66. package/dist/heartbeat/history.js.map +1 -0
  67. package/dist/heartbeat/parser.d.ts +26 -0
  68. package/dist/heartbeat/parser.d.ts.map +1 -0
  69. package/dist/heartbeat/parser.js +283 -0
  70. package/dist/heartbeat/parser.js.map +1 -0
  71. package/dist/history/cleanup.d.ts +21 -0
  72. package/dist/history/cleanup.d.ts.map +1 -0
  73. package/dist/history/cleanup.js +171 -0
  74. package/dist/history/cleanup.js.map +1 -0
  75. package/dist/history/db.d.ts +27 -0
  76. package/dist/history/db.d.ts.map +1 -0
  77. package/dist/history/db.js +323 -0
  78. package/dist/history/db.js.map +1 -0
  79. package/dist/history/media-store.d.ts +27 -0
  80. package/dist/history/media-store.d.ts.map +1 -0
  81. package/dist/history/media-store.js +158 -0
  82. package/dist/history/media-store.js.map +1 -0
  83. package/dist/history/types.d.ts +62 -0
  84. package/dist/history/types.d.ts.map +1 -0
  85. package/dist/history/types.js +3 -0
  86. package/dist/history/types.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +483 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/logger.d.ts +3 -0
  92. package/dist/logger.d.ts.map +1 -0
  93. package/dist/logger.js +81 -0
  94. package/dist/logger.js.map +1 -0
  95. package/dist/memory/manager.d.ts +45 -0
  96. package/dist/memory/manager.d.ts.map +1 -0
  97. package/dist/memory/manager.js +178 -0
  98. package/dist/memory/manager.js.map +1 -0
  99. package/dist/session/compactor.d.ts +22 -0
  100. package/dist/session/compactor.d.ts.map +1 -0
  101. package/dist/session/compactor.js +151 -0
  102. package/dist/session/compactor.js.map +1 -0
  103. package/dist/session/process.d.ts +76 -0
  104. package/dist/session/process.d.ts.map +1 -0
  105. package/dist/session/process.js +729 -0
  106. package/dist/session/process.js.map +1 -0
  107. package/dist/session/store.d.ts +102 -0
  108. package/dist/session/store.d.ts.map +1 -0
  109. package/dist/session/store.js +533 -0
  110. package/dist/session/store.js.map +1 -0
  111. package/dist/skills/index.d.ts +9 -0
  112. package/dist/skills/index.d.ts.map +1 -0
  113. package/dist/skills/index.js +15 -0
  114. package/dist/skills/index.js.map +1 -0
  115. package/dist/skills/invoker.d.ts +16 -0
  116. package/dist/skills/invoker.d.ts.map +1 -0
  117. package/dist/skills/invoker.js +36 -0
  118. package/dist/skills/invoker.js.map +1 -0
  119. package/dist/skills/loader.d.ts +23 -0
  120. package/dist/skills/loader.d.ts.map +1 -0
  121. package/dist/skills/loader.js +183 -0
  122. package/dist/skills/loader.js.map +1 -0
  123. package/dist/skills/parser.d.ts +55 -0
  124. package/dist/skills/parser.d.ts.map +1 -0
  125. package/dist/skills/parser.js +178 -0
  126. package/dist/skills/parser.js.map +1 -0
  127. package/dist/skills/sync.d.ts +10 -0
  128. package/dist/skills/sync.d.ts.map +1 -0
  129. package/dist/skills/sync.js +130 -0
  130. package/dist/skills/sync.js.map +1 -0
  131. package/dist/skills/watcher.d.ts +16 -0
  132. package/dist/skills/watcher.d.ts.map +1 -0
  133. package/dist/skills/watcher.js +25 -0
  134. package/dist/skills/watcher.js.map +1 -0
  135. package/dist/telegram/markdown.d.ts +25 -0
  136. package/dist/telegram/markdown.d.ts.map +1 -0
  137. package/dist/telegram/markdown.js +237 -0
  138. package/dist/telegram/markdown.js.map +1 -0
  139. package/dist/telegram/receiver.d.ts +17 -0
  140. package/dist/telegram/receiver.d.ts.map +1 -0
  141. package/dist/telegram/receiver.js +104 -0
  142. package/dist/telegram/receiver.js.map +1 -0
  143. package/dist/types.d.ts +224 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +3 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/ui/web-ui.d.ts +6 -0
  148. package/dist/ui/web-ui.d.ts.map +1 -0
  149. package/dist/ui/web-ui.js +227 -0
  150. package/dist/ui/web-ui.js.map +1 -0
  151. package/dist/watch/factory.d.ts +26 -0
  152. package/dist/watch/factory.d.ts.map +1 -0
  153. package/dist/watch/factory.js +43 -0
  154. package/dist/watch/factory.js.map +1 -0
  155. package/dist/webhook/manager.d.ts +34 -0
  156. package/dist/webhook/manager.d.ts.map +1 -0
  157. package/dist/webhook/manager.js +120 -0
  158. package/dist/webhook/manager.js.map +1 -0
  159. package/mcp/bun.lock +264 -0
  160. package/mcp/channel-manager.ts +115 -0
  161. package/mcp/package.json +15 -0
  162. package/mcp/router.ts +69 -0
  163. package/mcp/server.ts +129 -0
  164. package/mcp/tools/agent/handlers.ts +578 -0
  165. package/mcp/tools/agent/module.ts +163 -0
  166. package/mcp/tools/browser/module.ts +321 -0
  167. package/mcp/tools/browser/skills/open-browser/SKILL.md +89 -0
  168. package/mcp/tools/cron/client.ts +65 -0
  169. package/mcp/tools/cron/module.ts +158 -0
  170. package/mcp/tools/cron/skills/cron/SKILL.md +46 -0
  171. package/mcp/tools/discord/access.ts +197 -0
  172. package/mcp/tools/discord/client.ts +31 -0
  173. package/mcp/tools/discord/commands.ts +48 -0
  174. package/mcp/tools/discord/inbound.ts +53 -0
  175. package/mcp/tools/discord/module.ts +442 -0
  176. package/mcp/tools/discord/outbound.ts +90 -0
  177. package/mcp/tools/discord/receiver-server.ts +58 -0
  178. package/mcp/tools/discord/skills/access/SKILL.md +86 -0
  179. package/mcp/tools/discord/skills/configure/SKILL.md +53 -0
  180. package/mcp/tools/discord/threading.ts +37 -0
  181. package/mcp/tools/discord/types.ts +106 -0
  182. package/mcp/tools/skills/handlers.ts +196 -0
  183. package/mcp/tools/skills/module.ts +163 -0
  184. package/mcp/tools/telegram/module.ts +454 -0
  185. package/mcp/tools/telegram/pure.ts +224 -0
  186. package/mcp/tools/telegram/receiver-server.ts +1656 -0
  187. package/mcp/tools/telegram/skills/access/SKILL.md +169 -0
  188. package/mcp/tools/telegram/skills/configure/SKILL.md +118 -0
  189. package/mcp/tools/telegram/typing.ts +327 -0
  190. package/mcp/types.ts +128 -0
  191. package/package.json +62 -0
  192. package/resource/claude_gateway.svg +112 -0
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.watchSkills = watchSkills;
4
+ const factory_1 = require("../watch/factory");
5
+ /**
6
+ * Watch skill directories for SKILL.md file changes (add/modify/delete).
7
+ * Debounces rapid changes to avoid excessive rebuilds.
8
+ * Returns a close() handle to stop watching.
9
+ */
10
+ function watchSkills(opts) {
11
+ const debounceMs = opts.debounceMs ?? 250;
12
+ const validDirs = opts.dirs.filter(Boolean);
13
+ if (validDirs.length === 0) {
14
+ return { close: () => { } };
15
+ }
16
+ // Watch for SKILL.md files in skill subdirectories (depth 2)
17
+ const patterns = validDirs.map((dir) => `${dir}/**/SKILL.md`);
18
+ return (0, factory_1.createWatcher)({
19
+ paths: patterns,
20
+ debounceMs,
21
+ chokidarOpts: { depth: 2 },
22
+ onChange: opts.onChange,
23
+ });
24
+ }
25
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/skills/watcher.ts"],"names":[],"mappings":";;AAgBA,kCAiBC;AAjCD,8CAA8D;AAW9D;;;;GAIG;AACH,SAAgB,WAAW,CAAC,IAAyB;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;IAC7B,CAAC;IAED,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;IAE9D,OAAO,IAAA,uBAAa,EAAC;QACnB,KAAK,EAAE,QAAQ;QACf,UAAU;QACV,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Markdown detection and conversion utilities for Telegram HTML mode.
3
+ * Used by AgentRunner to auto-format agent output before forwarding.
4
+ */
5
+ /**
6
+ * Detects whether text contains markdown formatting patterns
7
+ * that warrant HTML rendering in Telegram.
8
+ */
9
+ export declare function hasMarkdown(text: string): boolean;
10
+ /**
11
+ * Converts standard Markdown to Telegram HTML format.
12
+ *
13
+ * Conversions:
14
+ * - **bold** → <b>bold</b>
15
+ * - *italic* / _italic_ → <i>italic</i>
16
+ * - `code` → <code>code</code>
17
+ * - ```block``` → <pre><code>block</code></pre>
18
+ * - [text](url) → <a href="url">text</a>
19
+ * - # Header → <b>Header</b>
20
+ * - | table | → wrapped in <pre> (pipes preserved, monospace)
21
+ * - - bullet → • bullet
22
+ * - plain text → HTML-escaped (&amp; &lt; &gt;)
23
+ */
24
+ export declare function toTelegramHtml(text: string): string;
25
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/telegram/markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYjD;AAuFD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsInD"}
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /**
3
+ * Markdown detection and conversion utilities for Telegram HTML mode.
4
+ * Used by AgentRunner to auto-format agent output before forwarding.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.hasMarkdown = hasMarkdown;
8
+ exports.toTelegramHtml = toTelegramHtml;
9
+ /**
10
+ * Detects whether text contains markdown formatting patterns
11
+ * that warrant HTML rendering in Telegram.
12
+ */
13
+ function hasMarkdown(text) {
14
+ return (/\*\*[^*\n]+\*\*/m.test(text) || // **bold**
15
+ /\*[^\s*\n][^*\n]*\*/m.test(text) || // *italic*
16
+ /_[^\s_\n][^_\n]*_/m.test(text) || // _italic_
17
+ /`[^`\n]+`/m.test(text) || // `inline code`
18
+ /^```/m.test(text) || // ```code block
19
+ /^#{1,6}\s/m.test(text) || // # header
20
+ /^\|.+\|/m.test(text) || // | table row |
21
+ /^- /m.test(text) || // - bullet list
22
+ /\[.+?\]\(https?:\/\/.+?\)/m.test(text) // [link](url)
23
+ );
24
+ }
25
+ /**
26
+ * Escapes HTML special characters in plain text.
27
+ */
28
+ function escapeHtml(text) {
29
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
30
+ }
31
+ /**
32
+ * Escapes HTML special characters in a URL attribute value.
33
+ */
34
+ function escapeHtmlAttr(url) {
35
+ return escapeHtml(url).replace(/"/g, '&quot;');
36
+ }
37
+ /**
38
+ * Measures display width of a string, treating Thai/Unicode combining chars as 0-width.
39
+ * Each base character counts as 1 column.
40
+ */
41
+ function displayWidth(s) {
42
+ // Strip Unicode combining characters (Mn category) — these include Thai tone marks,
43
+ // vowel signs above/below (U+0E31, U+0E34–U+0E3A, U+0E47–U+0E4E), and other combining marks
44
+ const stripped = s.replace(/[\u0300-\u036F\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0E4F]/g, '');
45
+ return stripped.length;
46
+ }
47
+ /**
48
+ * Pads a string on the right to reach the target display width.
49
+ */
50
+ function padEnd(s, width) {
51
+ const pad = width - displayWidth(s);
52
+ return pad > 0 ? s + ' '.repeat(pad) : s;
53
+ }
54
+ /**
55
+ * Splits a table row like `| a | b | c |` into trimmed cell strings.
56
+ */
57
+ function splitCells(line) {
58
+ return line
59
+ .replace(/^\s*\|\s*/, '')
60
+ .replace(/\s*\|\s*$/, '')
61
+ .split(/\s*\|\s*/);
62
+ }
63
+ /**
64
+ * Returns true if the line is a separator row (e.g. |---|:---:|---:|)
65
+ */
66
+ function isSeparator(line) {
67
+ return /^\s*\|[\s\-:|]+\|\s*$/.test(line);
68
+ }
69
+ /**
70
+ * Aligns table columns by padding each cell to the widest value in its column.
71
+ */
72
+ function formatTable(lines) {
73
+ const dataLines = lines.filter(l => !isSeparator(l));
74
+ const rows = dataLines.map(splitCells);
75
+ // Find column count
76
+ const colCount = rows.reduce((m, r) => Math.max(m, r.length), 0);
77
+ // Compute max display width per column
78
+ const colWidths = Array(colCount).fill(0);
79
+ for (const row of rows) {
80
+ for (let c = 0; c < row.length; c++) {
81
+ colWidths[c] = Math.max(colWidths[c], displayWidth(row[c]));
82
+ }
83
+ }
84
+ // Render rows
85
+ const rendered = rows.map(row => {
86
+ const cells = Array.from({ length: colCount }, (_, c) => padEnd(row[c] ?? '', colWidths[c]));
87
+ return '| ' + cells.join(' | ') + ' |';
88
+ });
89
+ // Rebuild separator line from computed widths
90
+ const sep = '| ' + colWidths.map(w => '-'.repeat(w)).join(' | ') + ' |';
91
+ // Insert separator after header (first row)
92
+ if (rendered.length > 1) {
93
+ rendered.splice(1, 0, sep);
94
+ }
95
+ return rendered.join('\n');
96
+ }
97
+ /**
98
+ * Converts standard Markdown to Telegram HTML format.
99
+ *
100
+ * Conversions:
101
+ * - **bold** → <b>bold</b>
102
+ * - *italic* / _italic_ → <i>italic</i>
103
+ * - `code` → <code>code</code>
104
+ * - ```block``` → <pre><code>block</code></pre>
105
+ * - [text](url) → <a href="url">text</a>
106
+ * - # Header → <b>Header</b>
107
+ * - | table | → wrapped in <pre> (pipes preserved, monospace)
108
+ * - - bullet → • bullet
109
+ * - plain text → HTML-escaped (&amp; &lt; &gt;)
110
+ */
111
+ function toTelegramHtml(text) {
112
+ // Convert bullet lists first (line-level transform, safe as pre-pass)
113
+ text = text.replace(/^- /gm, '• ');
114
+ const out = [];
115
+ let i = 0;
116
+ const len = text.length;
117
+ while (i < len) {
118
+ // Triple backtick code block: ```[lang]\n...\n```
119
+ if (text.startsWith('```', i)) {
120
+ const closeIdx = text.indexOf('\n```', i + 3);
121
+ if (closeIdx !== -1) {
122
+ const inner = text.slice(i + 3, closeIdx);
123
+ const nlIdx = inner.indexOf('\n');
124
+ const code = nlIdx > 0 ? inner.slice(nlIdx + 1) : inner.replace(/^\n/, '');
125
+ out.push('<pre><code>' + escapeHtml(code) + '</code></pre>');
126
+ i = closeIdx + 4;
127
+ continue;
128
+ }
129
+ }
130
+ // Inline code `...` (not ```)
131
+ if (text[i] === '`' && text[i + 1] !== '`') {
132
+ const closeIdx = text.indexOf('`', i + 1);
133
+ if (closeIdx !== -1) {
134
+ out.push('<code>' + escapeHtml(text.slice(i + 1, closeIdx)) + '</code>');
135
+ i = closeIdx + 1;
136
+ continue;
137
+ }
138
+ }
139
+ // Bold **...**
140
+ if (text.startsWith('**', i) && text[i + 2] !== '*' && text[i + 2] !== ' ') {
141
+ const closeIdx = text.indexOf('**', i + 2);
142
+ if (closeIdx !== -1 && !text.slice(i + 2, closeIdx).includes('\n')) {
143
+ out.push('<b>' + escapeHtml(text.slice(i + 2, closeIdx)) + '</b>');
144
+ i = closeIdx + 2;
145
+ continue;
146
+ }
147
+ }
148
+ // Italic *...* (single asterisk, not bold)
149
+ if (text[i] === '*' && text[i + 1] !== '*' && text[i + 1] !== ' ' && text[i + 1] !== undefined) {
150
+ const closeIdx = text.indexOf('*', i + 1);
151
+ if (closeIdx !== -1 && !text.slice(i + 1, closeIdx).includes('\n')) {
152
+ out.push('<i>' + escapeHtml(text.slice(i + 1, closeIdx)) + '</i>');
153
+ i = closeIdx + 1;
154
+ continue;
155
+ }
156
+ }
157
+ // Italic _..._ (underscore style)
158
+ if (text[i] === '_' && text[i + 1] !== '_' && text[i + 1] !== ' ' && text[i + 1] !== undefined) {
159
+ const closeIdx = text.indexOf('_', i + 1);
160
+ if (closeIdx !== -1 && !text.slice(i + 1, closeIdx).includes('\n')) {
161
+ out.push('<i>' + escapeHtml(text.slice(i + 1, closeIdx)) + '</i>');
162
+ i = closeIdx + 1;
163
+ continue;
164
+ }
165
+ }
166
+ // Link [text](url)
167
+ if (text[i] === '[') {
168
+ const closeBracket = text.indexOf(']', i + 1);
169
+ if (closeBracket !== -1 && text[closeBracket + 1] === '(') {
170
+ const closeParen = text.indexOf(')', closeBracket + 2);
171
+ if (closeParen !== -1) {
172
+ const linkText = text.slice(i + 1, closeBracket);
173
+ const url = text.slice(closeBracket + 2, closeParen);
174
+ out.push('<a href="' + escapeHtmlAttr(url) + '">' + escapeHtml(linkText) + '</a>');
175
+ i = closeParen + 1;
176
+ continue;
177
+ }
178
+ }
179
+ }
180
+ // Header # at start of line → bold
181
+ if ((i === 0 || text[i - 1] === '\n') && text[i] === '#') {
182
+ let level = 0;
183
+ while (i + level < len && text[i + level] === '#')
184
+ level++;
185
+ if (level <= 6 && text[i + level] === ' ') {
186
+ const lineEnd = text.indexOf('\n', i + level + 1);
187
+ const end = lineEnd === -1 ? len : lineEnd;
188
+ out.push('<b>' + escapeHtml(text.slice(i + level + 1, end)) + '</b>');
189
+ i = end;
190
+ continue;
191
+ }
192
+ }
193
+ // Table lines starting with | at line start → collect, align columns, wrap in <pre>
194
+ if ((i === 0 || text[i - 1] === '\n') && text[i] === '|') {
195
+ const tableLines = [];
196
+ let j = i;
197
+ while (j < len) {
198
+ const lineEnd = text.indexOf('\n', j);
199
+ const end = lineEnd === -1 ? len : lineEnd;
200
+ const line = text.slice(j, end);
201
+ if (/^\s*\|.*\|\s*$/.test(line)) {
202
+ tableLines.push(line);
203
+ j = lineEnd === -1 ? len : lineEnd + 1;
204
+ if (lineEnd === -1)
205
+ break;
206
+ }
207
+ else {
208
+ break;
209
+ }
210
+ }
211
+ if (tableLines.length > 0) {
212
+ out.push('<pre>' + escapeHtml(formatTable(tableLines)) + '</pre>');
213
+ i = j;
214
+ continue;
215
+ }
216
+ }
217
+ // Accumulate plain text until next markdown token
218
+ let j = i + 1;
219
+ while (j < len) {
220
+ const c = text[j];
221
+ if (text.startsWith('```', j) ||
222
+ (c === '`' && text[j + 1] !== '`') ||
223
+ text.startsWith('**', j) ||
224
+ (c === '*' && text[j + 1] !== '*' && text[j + 1] !== ' ') ||
225
+ (c === '_' && text[j + 1] !== '_' && text[j + 1] !== ' ') ||
226
+ c === '[' ||
227
+ (c === '#' && (j === 0 || text[j - 1] === '\n')) ||
228
+ (c === '|' && (j === 0 || text[j - 1] === '\n')))
229
+ break;
230
+ j++;
231
+ }
232
+ out.push(escapeHtml(text.slice(i, j)));
233
+ i = j;
234
+ }
235
+ return out.join('');
236
+ }
237
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/telegram/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { AgentConfig } from '../types';
2
+ export declare class TelegramReceiver {
3
+ private readonly agentConfig;
4
+ private readonly callbackPort;
5
+ private readonly logDir;
6
+ private process;
7
+ private stopping;
8
+ private restartCount;
9
+ private readonly logger;
10
+ constructor(agentConfig: AgentConfig, callbackPort: number, logDir: string);
11
+ start(): void;
12
+ private spawnProcess;
13
+ private scheduleRestart;
14
+ stop(): void;
15
+ isRunning(): boolean;
16
+ }
17
+ //# sourceMappingURL=receiver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receiver.d.ts","sourceRoot":"","sources":["../../src/telegram/receiver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAMvC,qBAAa,gBAAgB;IAOzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAGtC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM;IAKjC,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,eAAe;IAcvB,IAAI,IAAI,IAAI;IAKZ,SAAS,IAAI,OAAO;CAGrB"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TelegramReceiver = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const path = __importStar(require("path"));
39
+ const logger_1 = require("../logger");
40
+ const AUTO_RESTART_DELAY_MS = 5000;
41
+ const MAX_RESTARTS = 3;
42
+ class TelegramReceiver {
43
+ constructor(agentConfig, callbackPort, logDir) {
44
+ this.agentConfig = agentConfig;
45
+ this.callbackPort = callbackPort;
46
+ this.logDir = logDir;
47
+ this.process = null;
48
+ this.stopping = false;
49
+ this.restartCount = 0;
50
+ this.logger = (0, logger_1.createLogger)(`${agentConfig.id}:receiver`, logDir);
51
+ }
52
+ start() {
53
+ this.stopping = false;
54
+ this.restartCount = 0;
55
+ this.spawnProcess();
56
+ }
57
+ spawnProcess() {
58
+ const receiverPath = path.resolve(__dirname, '..', '..', 'mcp', 'tools', 'telegram', 'receiver-server.ts');
59
+ const stateDir = path.join(this.agentConfig.workspace, '.telegram-state');
60
+ this.process = (0, child_process_1.spawn)('bun', [receiverPath], {
61
+ env: {
62
+ ...process.env,
63
+ TELEGRAM_RECEIVER_MODE: 'true',
64
+ TELEGRAM_BOT_TOKEN: this.agentConfig.telegram?.botToken ?? '',
65
+ TELEGRAM_STATE_DIR: stateDir,
66
+ CLAUDE_CHANNEL_CALLBACK: `http://127.0.0.1:${this.callbackPort}/channel`,
67
+ },
68
+ stdio: ['ignore', 'pipe', 'pipe'],
69
+ });
70
+ this.process.stdout?.on('data', (d) => this.logger.debug('receiver stdout', { data: d.toString().trim() }));
71
+ this.process.stderr?.on('data', (d) => this.logger.info('receiver', { data: d.toString().trim() }));
72
+ this.process.on('exit', (code, signal) => {
73
+ this.logger.info('TelegramReceiver exited', { code, signal });
74
+ this.process = null;
75
+ if (!this.stopping)
76
+ this.scheduleRestart();
77
+ });
78
+ this.process.on('error', (err) => this.logger.error('TelegramReceiver error', { error: err.message }));
79
+ this.logger.info('TelegramReceiver started');
80
+ }
81
+ scheduleRestart() {
82
+ if (this.restartCount >= MAX_RESTARTS) {
83
+ this.logger.error('TelegramReceiver max restarts reached');
84
+ return;
85
+ }
86
+ this.restartCount++;
87
+ this.logger.warn(`Restarting TelegramReceiver in ${AUTO_RESTART_DELAY_MS}ms`, {
88
+ attempt: this.restartCount,
89
+ });
90
+ setTimeout(() => {
91
+ if (!this.stopping)
92
+ this.spawnProcess();
93
+ }, AUTO_RESTART_DELAY_MS);
94
+ }
95
+ stop() {
96
+ this.stopping = true;
97
+ this.process?.kill('SIGTERM');
98
+ }
99
+ isRunning() {
100
+ return this.process !== null && !this.process.killed;
101
+ }
102
+ }
103
+ exports.TelegramReceiver = TelegramReceiver;
104
+ //# sourceMappingURL=receiver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receiver.js","sourceRoot":"","sources":["../../src/telegram/receiver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ export interface SessionConfig {
2
+ idleTimeoutMinutes?: number;
3
+ maxConcurrent?: number;
4
+ }
5
+ export interface HistoryConfig {
6
+ retentionDays?: number;
7
+ }
8
+ export interface AgentConfig {
9
+ id: string;
10
+ description: string;
11
+ workspace: string;
12
+ env: string;
13
+ telegram?: {
14
+ botToken: string;
15
+ };
16
+ discord?: {
17
+ botToken: string;
18
+ guildAllowlist?: string[];
19
+ channelAllowlist?: string[];
20
+ dmPolicy?: 'open' | 'allowlist' | 'disabled';
21
+ dmAllowlist?: string[];
22
+ autoThread?: boolean;
23
+ };
24
+ claude: {
25
+ model: string;
26
+ dangerouslySkipPermissions: boolean;
27
+ extraFlags: string[];
28
+ };
29
+ /** Heartbeat / cron settings */
30
+ heartbeat?: {
31
+ rateLimitMinutes?: number;
32
+ };
33
+ /** Session pool settings */
34
+ session?: SessionConfig;
35
+ /** Agent's signature emoji (used in greetings/sign-offs) */
36
+ signatureEmoji?: string;
37
+ /** Allow tool calls when agent is accessed via API channel. Falls back to ApiKey.allow_tools if not set. */
38
+ allow_tools?: boolean;
39
+ /** Per-agent history retention override */
40
+ history?: HistoryConfig;
41
+ }
42
+ export interface AgentStats {
43
+ id: string;
44
+ isRunning: boolean;
45
+ messagesReceived: number;
46
+ messagesSent: number;
47
+ lastActivityAt: string | null;
48
+ }
49
+ export interface WatchHandle {
50
+ close(): void;
51
+ }
52
+ export interface ApiKey {
53
+ key: string;
54
+ description?: string;
55
+ agents: string[] | '*';
56
+ allow_tools?: boolean;
57
+ write?: boolean;
58
+ admin?: boolean;
59
+ }
60
+ export interface ModelConfig {
61
+ id: string;
62
+ label: string;
63
+ alias: string;
64
+ contextWindow: number;
65
+ multiplier?: number;
66
+ }
67
+ export interface GatewayConfig {
68
+ gateway: {
69
+ logDir: string;
70
+ timezone: string;
71
+ models?: ModelConfig[];
72
+ api?: {
73
+ keys: ApiKey[];
74
+ };
75
+ /** Global history retention/cleanup defaults */
76
+ history?: HistoryConfig & {
77
+ cleanupHour?: number;
78
+ cleanupTimezone?: string;
79
+ };
80
+ };
81
+ agents: AgentConfig[];
82
+ }
83
+ export interface WorkspaceFiles {
84
+ agentMd: string;
85
+ identityMd: string;
86
+ soulMd: string;
87
+ userMd: string;
88
+ heartbeatMd: string;
89
+ memoryMd: string;
90
+ }
91
+ export interface HeartbeatTask {
92
+ name: string;
93
+ cron: string;
94
+ prompt: string;
95
+ }
96
+ export interface HeartbeatResult {
97
+ taskName: string;
98
+ sessionId: string;
99
+ suppressed: boolean;
100
+ rateLimited: boolean;
101
+ response: string;
102
+ durationMs: number;
103
+ ts: string;
104
+ }
105
+ export interface LoadedWorkspace {
106
+ systemPrompt: string;
107
+ files: WorkspaceFiles;
108
+ truncated: boolean;
109
+ skillRegistry?: import('./skills').SkillRegistry;
110
+ }
111
+ export interface Message {
112
+ role: 'user' | 'assistant' | 'system';
113
+ content: string;
114
+ ts: number;
115
+ }
116
+ export interface SessionMeta {
117
+ id: string;
118
+ name: string;
119
+ createdAt: number;
120
+ lastActive: number;
121
+ messageCount: number;
122
+ totalTokensUsed: number;
123
+ lastInputTokens?: number;
124
+ loadedAtSpawn?: number;
125
+ archivedCount?: number;
126
+ messageCountAtSpawn?: number;
127
+ }
128
+ export interface SessionIndex {
129
+ activeSessionId: string;
130
+ sessions: SessionMeta[];
131
+ }
132
+ export type StreamEvent = {
133
+ type: 'text_delta';
134
+ text: string;
135
+ } | {
136
+ type: 'tool_use';
137
+ name: string;
138
+ id: string;
139
+ } | {
140
+ type: 'thinking';
141
+ text: string;
142
+ } | {
143
+ type: 'result';
144
+ text: string;
145
+ } | {
146
+ type: 'error';
147
+ message: string;
148
+ };
149
+ export interface Logger {
150
+ info(message: string, data?: Record<string, unknown>): void;
151
+ warn(message: string, data?: Record<string, unknown>): void;
152
+ error(message: string, data?: Record<string, unknown>): void;
153
+ debug(message: string, data?: Record<string, unknown>): void;
154
+ }
155
+ export type CronScheduleKind = 'cron' | 'at';
156
+ export type CronJobType = 'command' | 'agent';
157
+ export interface CronJobState {
158
+ lastRunAt: number | null;
159
+ lastStatus: 'ok' | 'error' | null;
160
+ lastError: string | null;
161
+ consecutiveErrors: number;
162
+ runCount: number;
163
+ }
164
+ export interface CronJob {
165
+ id: string;
166
+ agentId: string;
167
+ name: string;
168
+ scheduleKind?: CronScheduleKind;
169
+ schedule?: string;
170
+ scheduleAt?: string;
171
+ type?: CronJobType;
172
+ command?: string;
173
+ prompt?: string;
174
+ telegram?: string;
175
+ discord?: string;
176
+ timeoutMs?: number;
177
+ deleteAfterRun?: boolean;
178
+ enabled: boolean;
179
+ createdAt: number;
180
+ updatedAt: number;
181
+ state: CronJobState;
182
+ }
183
+ export interface CronJobCreate {
184
+ agentId: string;
185
+ name: string;
186
+ scheduleKind?: CronScheduleKind;
187
+ schedule?: string;
188
+ scheduleAt?: string;
189
+ type?: CronJobType;
190
+ command?: string;
191
+ prompt?: string;
192
+ telegram?: string;
193
+ discord?: string;
194
+ timeoutMs?: number;
195
+ deleteAfterRun?: boolean;
196
+ enabled?: boolean;
197
+ }
198
+ export interface CronJobUpdate {
199
+ name?: string;
200
+ scheduleKind?: CronScheduleKind;
201
+ schedule?: string;
202
+ scheduleAt?: string;
203
+ type?: CronJobType;
204
+ command?: string;
205
+ prompt?: string;
206
+ telegram?: string;
207
+ discord?: string;
208
+ timeoutMs?: number;
209
+ deleteAfterRun?: boolean;
210
+ enabled?: boolean;
211
+ }
212
+ export interface CronRunLog {
213
+ jobId: string;
214
+ startedAt: number;
215
+ durationMs: number;
216
+ status: 'ok' | 'error';
217
+ output: string;
218
+ error: string | null;
219
+ }
220
+ export interface CronManagerConfig {
221
+ storePath?: string;
222
+ runsDir?: string;
223
+ }
224
+ //# sourceMappingURL=types.d.ts.map