@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,533 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SessionStore = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const crypto_1 = require("crypto");
43
+ const p_queue_1 = __importDefault(require("p-queue"));
44
+ class SessionStore {
45
+ constructor(agentsBaseDir) {
46
+ this.queues = new Map();
47
+ this.agentsBaseDir = agentsBaseDir;
48
+ }
49
+ /**
50
+ * Return the base directory where all agents' data is stored.
51
+ */
52
+ getAgentsBaseDir() {
53
+ return this.agentsBaseDir;
54
+ }
55
+ /**
56
+ * Return the session key for a given agent + chat combination.
57
+ */
58
+ resolveKey(agentId, chatId) {
59
+ return `agent:${agentId}:telegram:${chatId}`;
60
+ }
61
+ /**
62
+ * Resolve the file path for a legacy API session (JSONL format).
63
+ */
64
+ resolvePath(agentId, chatId) {
65
+ return path.join(this.agentsBaseDir, agentId, 'sessions', `${chatId}.jsonl`);
66
+ }
67
+ /**
68
+ * Get or create a per-file serialization queue (prevents concurrent write corruption).
69
+ * For telegram multi-session operations the key is prefixed with 'telegram-'.
70
+ */
71
+ getQueue(agentId, chatId) {
72
+ const key = this.resolveKey(agentId, chatId);
73
+ if (!this.queues.has(key)) {
74
+ this.queues.set(key, new p_queue_1.default({ concurrency: 1 }));
75
+ }
76
+ return this.queues.get(key);
77
+ }
78
+ /**
79
+ * Get or create a serialization queue keyed on telegram-{chatId} for index operations.
80
+ */
81
+ getTelegramQueue(agentId, chatId) {
82
+ const key = `agent:${agentId}:telegram-index:${chatId}`;
83
+ if (!this.queues.has(key)) {
84
+ this.queues.set(key, new p_queue_1.default({ concurrency: 1 }));
85
+ }
86
+ return this.queues.get(key);
87
+ }
88
+ /**
89
+ * Load all messages from a session file.
90
+ * Returns empty array if file doesn't exist.
91
+ * Resets to empty (and logs) if file is corrupt.
92
+ */
93
+ async loadSession(agentId, chatId) {
94
+ const filePath = this.resolvePath(agentId, chatId);
95
+ if (!fs.existsSync(filePath)) {
96
+ return [];
97
+ }
98
+ const raw = fs.readFileSync(filePath, 'utf-8');
99
+ const lines = raw.split('\n').filter((l) => l.trim() !== '');
100
+ const messages = [];
101
+ for (const line of lines) {
102
+ try {
103
+ const msg = JSON.parse(line);
104
+ messages.push(msg);
105
+ }
106
+ catch {
107
+ // Corrupted line — reset the session
108
+ console.error(`[SessionStore] Corrupted session file at ${filePath}, resetting.`);
109
+ await this.resetSession(agentId, chatId);
110
+ return [];
111
+ }
112
+ }
113
+ return messages;
114
+ }
115
+ /**
116
+ * Append a single message to a session file.
117
+ * Creates the file (and parent directories) if needed.
118
+ * Serialized per-session via p-queue to prevent concurrent corruption.
119
+ */
120
+ async appendMessage(agentId, chatId, message) {
121
+ const queue = this.getQueue(agentId, chatId);
122
+ await queue.add(async () => {
123
+ const filePath = this.resolvePath(agentId, chatId);
124
+ const dir = path.dirname(filePath);
125
+ fs.mkdirSync(dir, { recursive: true });
126
+ const line = JSON.stringify(message) + '\n';
127
+ fs.appendFileSync(filePath, line, 'utf-8');
128
+ });
129
+ }
130
+ /**
131
+ * Reset a session by deleting (or truncating) the session file.
132
+ */
133
+ async resetSession(agentId, chatId) {
134
+ const queue = this.getQueue(agentId, chatId);
135
+ await queue.add(async () => {
136
+ const filePath = this.resolvePath(agentId, chatId);
137
+ try {
138
+ fs.writeFileSync(filePath, '', 'utf-8');
139
+ }
140
+ catch {
141
+ // File might not exist yet; that's fine
142
+ }
143
+ });
144
+ }
145
+ /**
146
+ * Delete session files older than maxAgeDays.
147
+ * Returns the count of deleted files.
148
+ */
149
+ async pruneOldSessions(agentId, maxAgeDays) {
150
+ const sessionsDir = path.join(this.agentsBaseDir, agentId, 'sessions');
151
+ if (!fs.existsSync(sessionsDir)) {
152
+ return 0;
153
+ }
154
+ const now = Date.now();
155
+ const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
156
+ let deleted = 0;
157
+ const entries = fs.readdirSync(sessionsDir);
158
+ for (const entry of entries) {
159
+ if (!entry.endsWith('.jsonl'))
160
+ continue;
161
+ const filePath = path.join(sessionsDir, entry);
162
+ try {
163
+ const stat = fs.statSync(filePath);
164
+ if (now - stat.mtimeMs > maxAgeMs) {
165
+ fs.unlinkSync(filePath);
166
+ deleted++;
167
+ }
168
+ }
169
+ catch {
170
+ // Ignore errors for individual files
171
+ }
172
+ }
173
+ return deleted;
174
+ }
175
+ // ─── Multi-session Telegram/Discord support ──────────────────────────────────
176
+ /**
177
+ * Resolve the directory for a chat's multi-session data.
178
+ */
179
+ resolveTelegramDir(agentId, chatId, channel = 'telegram') {
180
+ return path.join(this.agentsBaseDir, agentId, 'sessions', `${channel}-${chatId}`);
181
+ }
182
+ /**
183
+ * Resolve the path to the session index file for a chat.
184
+ */
185
+ resolveTelegramIndexPath(agentId, chatId, channel = 'telegram') {
186
+ return path.join(this.resolveTelegramDir(agentId, chatId, channel), 'index.json');
187
+ }
188
+ /**
189
+ * Resolve the path to a specific session's message file.
190
+ */
191
+ resolveTelegramSessionPath(agentId, chatId, sessionId, channel = 'telegram') {
192
+ return path.join(this.resolveTelegramDir(agentId, chatId, channel), `${sessionId}.json`);
193
+ }
194
+ /**
195
+ * Read index.json for a chat. Returns null if file doesn't exist.
196
+ */
197
+ async loadIndex(agentId, chatId, channel = 'telegram') {
198
+ const indexPath = this.resolveTelegramIndexPath(agentId, chatId, channel);
199
+ if (!fs.existsSync(indexPath)) {
200
+ return null;
201
+ }
202
+ try {
203
+ const raw = fs.readFileSync(indexPath, 'utf-8');
204
+ return JSON.parse(raw);
205
+ }
206
+ catch {
207
+ return null;
208
+ }
209
+ }
210
+ /**
211
+ * Write index.json atomically (tmp + rename).
212
+ */
213
+ async saveIndex(agentId, chatId, index, channel = 'telegram') {
214
+ const indexPath = this.resolveTelegramIndexPath(agentId, chatId, channel);
215
+ const dir = path.dirname(indexPath);
216
+ fs.mkdirSync(dir, { recursive: true });
217
+ const tmp = indexPath + '.tmp';
218
+ fs.writeFileSync(tmp, JSON.stringify(index, null, 2) + '\n', 'utf-8');
219
+ fs.renameSync(tmp, indexPath);
220
+ }
221
+ /**
222
+ * Get or create the session index for a telegram chat.
223
+ *
224
+ * Migration logic:
225
+ * 1. If telegram-{chatId}/index.json exists → return it
226
+ * 2. If old {chatId}.jsonl exists → migrate to new layout, delete old file
227
+ * 3. Otherwise → create a fresh index with one empty "Session 1"
228
+ *
229
+ * All operations are serialized via the telegram index queue.
230
+ */
231
+ /**
232
+ * Internal (unlocked) version — call this only from WITHIN a getTelegramQueue task
233
+ * to avoid deadlock. The public getOrCreateIndex wraps this in the queue.
234
+ */
235
+ async loadOrCreateIndexUnlocked(agentId, chatId, channel = 'telegram') {
236
+ // 1. Check for existing index
237
+ const existingIndex = await this.loadIndex(agentId, chatId, channel);
238
+ if (existingIndex !== null) {
239
+ return existingIndex;
240
+ }
241
+ // 2. Check for old JSONL file → migrate
242
+ const oldPath = this.resolvePath(agentId, chatId);
243
+ if (fs.existsSync(oldPath)) {
244
+ const raw = fs.readFileSync(oldPath, 'utf-8');
245
+ const lines = raw.split('\n').filter((l) => l.trim() !== '');
246
+ const messages = [];
247
+ for (const line of lines) {
248
+ try {
249
+ messages.push(JSON.parse(line));
250
+ }
251
+ catch {
252
+ // Skip corrupted lines during migration
253
+ }
254
+ }
255
+ const newId = (0, crypto_1.randomUUID)();
256
+ const now = Date.now();
257
+ const meta = {
258
+ id: newId,
259
+ name: 'Session 1',
260
+ createdAt: now,
261
+ lastActive: now,
262
+ messageCount: messages.length,
263
+ totalTokensUsed: 0,
264
+ };
265
+ const index = {
266
+ activeSessionId: newId,
267
+ sessions: [meta],
268
+ };
269
+ const sessionDir = this.resolveTelegramDir(agentId, chatId, channel);
270
+ fs.mkdirSync(sessionDir, { recursive: true });
271
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, newId, channel);
272
+ fs.writeFileSync(sessionPath, JSON.stringify(messages, null, 2) + '\n', 'utf-8');
273
+ await this.saveIndex(agentId, chatId, index, channel);
274
+ try {
275
+ fs.unlinkSync(oldPath);
276
+ }
277
+ catch { /* non-fatal */ }
278
+ return index;
279
+ }
280
+ // 3. Create fresh index with one empty session
281
+ const newId = (0, crypto_1.randomUUID)();
282
+ const now = Date.now();
283
+ const meta = {
284
+ id: newId,
285
+ name: 'Session 1',
286
+ createdAt: now,
287
+ lastActive: now,
288
+ messageCount: 0,
289
+ totalTokensUsed: 0,
290
+ };
291
+ const index = {
292
+ activeSessionId: newId,
293
+ sessions: [meta],
294
+ };
295
+ const sessionDir = this.resolveTelegramDir(agentId, chatId, channel);
296
+ fs.mkdirSync(sessionDir, { recursive: true });
297
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, newId, channel);
298
+ fs.writeFileSync(sessionPath, JSON.stringify([], null, 2) + '\n', 'utf-8');
299
+ await this.saveIndex(agentId, chatId, index, channel);
300
+ return index;
301
+ }
302
+ async getOrCreateIndex(agentId, chatId, channel = 'telegram') {
303
+ const queue = this.getTelegramQueue(agentId, chatId);
304
+ return queue.add(() => this.loadOrCreateIndexUnlocked(agentId, chatId, channel));
305
+ }
306
+ /**
307
+ * Create a new session for a chat, add it to the index, and return the SessionMeta.
308
+ * If name is not provided, auto-generates "Session N" based on current session count.
309
+ */
310
+ async createTelegramSession(agentId, chatId, name, channel = 'telegram') {
311
+ const queue = this.getTelegramQueue(agentId, chatId);
312
+ return queue.add(async () => {
313
+ const index = await this.loadOrCreateIndexUnlocked(agentId, chatId, channel);
314
+ const newId = (0, crypto_1.randomUUID)();
315
+ const now = Date.now();
316
+ const sessionName = name ?? `Session ${index.sessions.length + 1}`;
317
+ const meta = {
318
+ id: newId,
319
+ name: sessionName,
320
+ createdAt: now,
321
+ lastActive: now,
322
+ messageCount: 0,
323
+ totalTokensUsed: 0,
324
+ };
325
+ // Write empty messages file
326
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, newId, channel);
327
+ const sessionDir = this.resolveTelegramDir(agentId, chatId, channel);
328
+ fs.mkdirSync(sessionDir, { recursive: true });
329
+ fs.writeFileSync(sessionPath, JSON.stringify([], null, 2) + '\n', 'utf-8');
330
+ // Update index
331
+ index.sessions.push(meta);
332
+ await this.saveIndex(agentId, chatId, index, channel);
333
+ return meta;
334
+ });
335
+ }
336
+ async listSessions(agentId, chatId, channel = 'telegram') {
337
+ return this.getOrCreateIndex(agentId, chatId, channel);
338
+ }
339
+ async getActiveSessionId(agentId, chatId, channel = 'telegram') {
340
+ const index = await this.getOrCreateIndex(agentId, chatId, channel);
341
+ return index.activeSessionId;
342
+ }
343
+ async setActiveSession(agentId, chatId, sessionId, channel = 'telegram') {
344
+ const queue = this.getTelegramQueue(agentId, chatId);
345
+ await queue.add(async () => {
346
+ const index = await this.loadIndex(agentId, chatId, channel);
347
+ if (!index) {
348
+ throw new Error(`No session index found for chat ${chatId}`);
349
+ }
350
+ const exists = index.sessions.some((s) => s.id === sessionId);
351
+ if (!exists) {
352
+ throw new Error(`Session ${sessionId} not found in index for chat ${chatId}`);
353
+ }
354
+ index.activeSessionId = sessionId;
355
+ await this.saveIndex(agentId, chatId, index, channel);
356
+ });
357
+ }
358
+ async deleteTelegramSession(agentId, chatId, sessionId, channel = 'telegram') {
359
+ const queue = this.getTelegramQueue(agentId, chatId);
360
+ await queue.add(async () => {
361
+ const index = await this.loadIndex(agentId, chatId, channel);
362
+ if (!index) {
363
+ throw new Error(`No session index found for chat ${chatId}`);
364
+ }
365
+ if (index.sessions.length <= 1) {
366
+ throw new Error(`Cannot delete the last session for chat ${chatId}`);
367
+ }
368
+ const sessionIdx = index.sessions.findIndex((s) => s.id === sessionId);
369
+ if (sessionIdx === -1) {
370
+ throw new Error(`Session ${sessionId} not found in index for chat ${chatId}`);
371
+ }
372
+ // Remove from index
373
+ index.sessions.splice(sessionIdx, 1);
374
+ // If we deleted the active session, promote the first remaining session
375
+ if (index.activeSessionId === sessionId) {
376
+ index.activeSessionId = index.sessions[0].id;
377
+ }
378
+ await this.saveIndex(agentId, chatId, index, channel);
379
+ // Delete the session messages file
380
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, sessionId, channel);
381
+ try {
382
+ fs.unlinkSync(sessionPath);
383
+ }
384
+ catch {
385
+ // Non-fatal if file doesn't exist
386
+ }
387
+ });
388
+ }
389
+ async clearTelegramSessionHistory(agentId, chatId, sessionId, channel = 'telegram') {
390
+ const queue = this.getTelegramQueue(agentId, chatId);
391
+ await queue.add(async () => {
392
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, sessionId, channel);
393
+ fs.mkdirSync(path.dirname(sessionPath), { recursive: true });
394
+ fs.writeFileSync(sessionPath, JSON.stringify([], null, 2) + '\n', 'utf-8');
395
+ // Update meta: reset messageCount
396
+ const index = await this.loadIndex(agentId, chatId, channel);
397
+ if (index) {
398
+ const meta = index.sessions.find((s) => s.id === sessionId);
399
+ if (meta) {
400
+ meta.messageCount = 0;
401
+ meta.lastActive = Date.now();
402
+ await this.saveIndex(agentId, chatId, index, channel);
403
+ }
404
+ }
405
+ });
406
+ }
407
+ async updateSessionMeta(agentId, chatId, sessionId, meta, channel = 'telegram') {
408
+ const queue = this.getTelegramQueue(agentId, chatId);
409
+ await queue.add(async () => {
410
+ const index = await this.loadIndex(agentId, chatId, channel);
411
+ if (!index) {
412
+ throw new Error(`No session index found for chat ${chatId}`);
413
+ }
414
+ const session = index.sessions.find((s) => s.id === sessionId);
415
+ if (!session) {
416
+ throw new Error(`Session ${sessionId} not found in index for chat ${chatId}`);
417
+ }
418
+ Object.assign(session, meta);
419
+ session.lastActive = Date.now();
420
+ await this.saveIndex(agentId, chatId, index, channel);
421
+ });
422
+ }
423
+ async loadTelegramSession(agentId, chatId, sessionId, channel = 'telegram') {
424
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, sessionId, channel);
425
+ if (!fs.existsSync(sessionPath)) {
426
+ return [];
427
+ }
428
+ try {
429
+ const raw = fs.readFileSync(sessionPath, 'utf-8');
430
+ return JSON.parse(raw);
431
+ }
432
+ catch {
433
+ console.error(`[SessionStore] Corrupted session file at ${sessionPath}, returning empty.`);
434
+ return [];
435
+ }
436
+ }
437
+ async saveTelegramSession(agentId, chatId, sessionId, messages, channel = 'telegram') {
438
+ const queue = this.getTelegramQueue(agentId, chatId);
439
+ await queue.add(async () => {
440
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, sessionId, channel);
441
+ const dir = path.dirname(sessionPath);
442
+ fs.mkdirSync(dir, { recursive: true });
443
+ const tmp = sessionPath + '.tmp';
444
+ fs.writeFileSync(tmp, JSON.stringify(messages, null, 2) + '\n', 'utf-8');
445
+ fs.renameSync(tmp, sessionPath);
446
+ // Update meta messageCount and lastActive
447
+ await this._updateMessageCountInIndex(agentId, chatId, sessionId, messages.length, channel);
448
+ });
449
+ }
450
+ async appendTelegramMessage(agentId, chatId, sessionId, message, channel = 'telegram') {
451
+ const queue = this.getTelegramQueue(agentId, chatId);
452
+ await queue.add(async () => {
453
+ const sessionPath = this.resolveTelegramSessionPath(agentId, chatId, sessionId, channel);
454
+ const dir = path.dirname(sessionPath);
455
+ fs.mkdirSync(dir, { recursive: true });
456
+ // Load existing messages
457
+ let messages = [];
458
+ if (fs.existsSync(sessionPath)) {
459
+ try {
460
+ const raw = fs.readFileSync(sessionPath, 'utf-8');
461
+ messages = JSON.parse(raw);
462
+ }
463
+ catch {
464
+ messages = [];
465
+ }
466
+ }
467
+ messages.push(message);
468
+ // Write atomically
469
+ const tmp = sessionPath + '.tmp';
470
+ fs.writeFileSync(tmp, JSON.stringify(messages, null, 2) + '\n', 'utf-8');
471
+ fs.renameSync(tmp, sessionPath);
472
+ // Update meta
473
+ await this._updateMessageCountInIndex(agentId, chatId, sessionId, messages.length, channel);
474
+ });
475
+ }
476
+ async _updateMessageCountInIndex(agentId, chatId, sessionId, count, channel = 'telegram') {
477
+ const index = await this.loadIndex(agentId, chatId, channel);
478
+ if (index) {
479
+ const meta = index.sessions.find((s) => s.id === sessionId);
480
+ if (meta) {
481
+ meta.messageCount = count;
482
+ meta.lastActive = Date.now();
483
+ await this.saveIndex(agentId, chatId, index, channel);
484
+ }
485
+ }
486
+ }
487
+ async ensureApiSession(agentId, internalChatId, sessionId) {
488
+ const queue = this.getTelegramQueue(agentId, internalChatId);
489
+ await queue.add(async () => {
490
+ const index = await this.loadOrCreateIndexUnlocked(agentId, internalChatId, 'api');
491
+ if (index.sessions.some((s) => s.id === sessionId))
492
+ return;
493
+ const now = Date.now();
494
+ index.sessions.push({
495
+ id: sessionId,
496
+ name: `Session ${index.sessions.length + 1}`,
497
+ createdAt: now,
498
+ lastActive: now,
499
+ messageCount: 0,
500
+ totalTokensUsed: 0,
501
+ });
502
+ if (!index.activeSessionId)
503
+ index.activeSessionId = sessionId;
504
+ await this.saveIndex(agentId, internalChatId, index, 'api');
505
+ });
506
+ }
507
+ async getAllSessionNames(agentId) {
508
+ const nameMap = new Map();
509
+ const sessionsDir = path.join(this.agentsBaseDir, agentId, 'sessions');
510
+ let entries;
511
+ try {
512
+ entries = fs.readdirSync(sessionsDir, { withFileTypes: true });
513
+ }
514
+ catch {
515
+ return nameMap;
516
+ }
517
+ const reads = entries
518
+ .filter((e) => e.isDirectory() && (e.name.startsWith('telegram-') || e.name.startsWith('discord-')))
519
+ .map(async (e) => {
520
+ const channel = e.name.startsWith('discord-') ? 'discord' : 'telegram';
521
+ const chatId = e.name.slice(channel.length + 1);
522
+ const index = await this.loadIndex(agentId, chatId, channel);
523
+ if (index) {
524
+ for (const s of index.sessions)
525
+ nameMap.set(s.id, s.name);
526
+ }
527
+ });
528
+ await Promise.all(reads);
529
+ return nameMap;
530
+ }
531
+ }
532
+ exports.SessionStore = SessionStore;
533
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { parseSkill, extractFrontmatter } from './parser';
2
+ export type { SkillDefinition, SkillRequires, SkillInstallDescriptor, ParseSkillOptions } from './parser';
3
+ export { loadSkills, renderSkillsSection } from './loader';
4
+ export type { SkillRegistry, LoadSkillsOptions } from './loader';
5
+ export { detectSkillCommand, formatSkillContext } from './invoker';
6
+ export type { SkillInvocation } from './invoker';
7
+ export { watchSkills } from './watcher';
8
+ export type { SkillWatcherOptions } from './watcher';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.watchSkills = exports.formatSkillContext = exports.detectSkillCommand = exports.renderSkillsSection = exports.loadSkills = exports.extractFrontmatter = exports.parseSkill = void 0;
4
+ var parser_1 = require("./parser");
5
+ Object.defineProperty(exports, "parseSkill", { enumerable: true, get: function () { return parser_1.parseSkill; } });
6
+ Object.defineProperty(exports, "extractFrontmatter", { enumerable: true, get: function () { return parser_1.extractFrontmatter; } });
7
+ var loader_1 = require("./loader");
8
+ Object.defineProperty(exports, "loadSkills", { enumerable: true, get: function () { return loader_1.loadSkills; } });
9
+ Object.defineProperty(exports, "renderSkillsSection", { enumerable: true, get: function () { return loader_1.renderSkillsSection; } });
10
+ var invoker_1 = require("./invoker");
11
+ Object.defineProperty(exports, "detectSkillCommand", { enumerable: true, get: function () { return invoker_1.detectSkillCommand; } });
12
+ Object.defineProperty(exports, "formatSkillContext", { enumerable: true, get: function () { return invoker_1.formatSkillContext; } });
13
+ var watcher_1 = require("./watcher");
14
+ Object.defineProperty(exports, "watchSkills", { enumerable: true, get: function () { return watcher_1.watchSkills; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":";;;AAAA,mCAA0D;AAAjD,oGAAA,UAAU,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAEvC,mCAA2D;AAAlD,oGAAA,UAAU,OAAA;AAAE,6GAAA,mBAAmB,OAAA;AAExC,qCAAmE;AAA1D,6GAAA,kBAAkB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAE/C,qCAAwC;AAA/B,sGAAA,WAAW,OAAA"}
@@ -0,0 +1,16 @@
1
+ import type { SkillRegistry } from './loader';
2
+ export interface SkillInvocation {
3
+ skillKey: string;
4
+ args: string;
5
+ content: string;
6
+ }
7
+ /**
8
+ * Detect if a message starts with a /skill-name command and resolve it.
9
+ * Returns the skill invocation details, or null if no skill command detected.
10
+ */
11
+ export declare function detectSkillCommand(text: string, registry: SkillRegistry): SkillInvocation | null;
12
+ /**
13
+ * Format a skill invocation as a context block to append to the session message.
14
+ */
15
+ export declare function formatSkillContext(invocation: SkillInvocation): string;
16
+ //# sourceMappingURL=invoker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoker.d.ts","sourceRoot":"","sources":["../../src/skills/invoker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,eAAe,GAAG,IAAI,CAoBhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,CAMtE"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectSkillCommand = detectSkillCommand;
4
+ exports.formatSkillContext = formatSkillContext;
5
+ /**
6
+ * Detect if a message starts with a /skill-name command and resolve it.
7
+ * Returns the skill invocation details, or null if no skill command detected.
8
+ */
9
+ function detectSkillCommand(text, registry) {
10
+ const trimmed = text.trim();
11
+ if (!trimmed.startsWith('/'))
12
+ return null;
13
+ // Extract command and args: "/github list prs" → command="github", args="list prs"
14
+ const spaceIdx = trimmed.indexOf(' ');
15
+ const command = spaceIdx === -1 ? trimmed.slice(1) : trimmed.slice(1, spaceIdx);
16
+ const args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1).trim();
17
+ if (!command)
18
+ return null;
19
+ const skill = registry.skills.get(command);
20
+ if (!skill)
21
+ return null;
22
+ if (!skill.userInvocable)
23
+ return null;
24
+ // Substitute $ARGUMENTS in content
25
+ const content = skill.content.replace(/\$ARGUMENTS/g, args);
26
+ return { skillKey: command, args, content };
27
+ }
28
+ /**
29
+ * Format a skill invocation as a context block to append to the session message.
30
+ */
31
+ function formatSkillContext(invocation) {
32
+ return (`\n<skill-invocation name="${invocation.skillKey}" args="${invocation.args.replace(/"/g, '&quot;')}">\n` +
33
+ `${invocation.content}\n` +
34
+ `</skill-invocation>`);
35
+ }
36
+ //# sourceMappingURL=invoker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoker.js","sourceRoot":"","sources":["../../src/skills/invoker.ts"],"names":[],"mappings":";;AAYA,gDAoBC;AAKD,gDAMC;AAnCD;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,IAAY,EAAE,QAAuB;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,mFAAmF;IACnF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAEtC,mCAAmC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAE5D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,UAA2B;IAC5D,OAAO,CACL,6BAA6B,UAAU,CAAC,QAAQ,WAAW,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM;QACxG,GAAG,UAAU,CAAC,OAAO,IAAI;QACzB,qBAAqB,CACtB,CAAC;AACJ,CAAC"}