@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,343 @@
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.loadCleanTemplate = loadCleanTemplate;
37
+ exports.stripIgnoredPaths = stripIgnoredPaths;
38
+ exports.detectMigration = detectMigration;
39
+ exports.applyMigration = applyMigration;
40
+ exports.migrateConfig = migrateConfig;
41
+ exports.compareSemver = compareSemver;
42
+ exports.deepMerge = deepMerge;
43
+ exports.migrateModels = migrateModels;
44
+ exports.pruneAgentPaths = pruneAgentPaths;
45
+ const fs = __importStar(require("fs"));
46
+ /**
47
+ * Deep-merge template into target, adding missing keys only.
48
+ * Never overwrites existing values. Returns list of added field paths.
49
+ * Keys whose full path is in ignorePaths are skipped entirely.
50
+ */
51
+ function deepMerge(target, template, prefix, added, ignorePaths) {
52
+ for (const key of Object.keys(template)) {
53
+ const fullPath = prefix ? `${prefix}.${key}` : key;
54
+ // Skip paths that are in the ignorePaths set
55
+ if (ignorePaths && ignorePaths.has(fullPath)) {
56
+ continue;
57
+ }
58
+ if (!(key in target)) {
59
+ target[key] = structuredClone(template[key]);
60
+ added.push(fullPath);
61
+ }
62
+ else if (typeof target[key] === 'object' &&
63
+ target[key] !== null &&
64
+ !Array.isArray(target[key]) &&
65
+ typeof template[key] === 'object' &&
66
+ template[key] !== null &&
67
+ !Array.isArray(template[key])) {
68
+ deepMerge(target[key], template[key], fullPath, added, ignorePaths);
69
+ }
70
+ }
71
+ }
72
+ /**
73
+ * Merge missing fields from template agent into each user agent.
74
+ * Uses the first agent in the template as the schema source.
75
+ */
76
+ function mergeAgentArrays(userAgents, templateAgents, added, ignorePaths) {
77
+ if (templateAgents.length === 0)
78
+ return;
79
+ const schema = templateAgents[0];
80
+ for (let i = 0; i < userAgents.length; i++) {
81
+ deepMerge(userAgents[i], schema, `agents[${i}]`, added, ignorePaths);
82
+ }
83
+ }
84
+ /**
85
+ * Remove dot-path keys from each agent entry. Returns paths actually removed.
86
+ * Paths are relative to each agent object (e.g. "telegram.allowedUsers").
87
+ */
88
+ function pruneAgentPaths(agents, removePaths) {
89
+ const removed = [];
90
+ for (let i = 0; i < agents.length; i++) {
91
+ const agent = agents[i];
92
+ for (const dotPath of removePaths) {
93
+ const parts = dotPath.split('.');
94
+ let obj = agent;
95
+ let valid = true;
96
+ for (let j = 0; j < parts.length - 1; j++) {
97
+ if (typeof obj[parts[j]] !== 'object' || obj[parts[j]] === null) {
98
+ valid = false;
99
+ break;
100
+ }
101
+ obj = obj[parts[j]];
102
+ }
103
+ const leaf = parts[parts.length - 1];
104
+ if (valid && leaf in obj) {
105
+ delete obj[leaf];
106
+ const fullPath = `agents[${i}].${dotPath}`;
107
+ if (!removed.includes(fullPath))
108
+ removed.push(fullPath);
109
+ }
110
+ }
111
+ }
112
+ return removed;
113
+ }
114
+ /**
115
+ * Compare two semver strings. Returns:
116
+ * -1 if a < b, 0 if equal, 1 if a > b
117
+ */
118
+ function compareSemver(a, b) {
119
+ const pa = a.split('.').map(Number);
120
+ const pb = b.split('.').map(Number);
121
+ for (let i = 0; i < 3; i++) {
122
+ const va = pa[i] ?? 0;
123
+ const vb = pb[i] ?? 0;
124
+ if (va < vb)
125
+ return -1;
126
+ if (va > vb)
127
+ return 1;
128
+ }
129
+ return 0;
130
+ }
131
+ /**
132
+ * Load a template file, extract the _migration metadata, strip it,
133
+ * and return the clean template along with the ignorePaths set.
134
+ */
135
+ function loadCleanTemplate(templatePath) {
136
+ if (!fs.existsSync(templatePath)) {
137
+ throw new Error(`Config template not found at "${templatePath}". Cannot load.`);
138
+ }
139
+ const templateRaw = fs.readFileSync(templatePath, 'utf-8');
140
+ const template = JSON.parse(templateRaw);
141
+ // Extract ignorePaths and removePaths from _migration metadata
142
+ let ignorePaths = new Set();
143
+ let removePaths = [];
144
+ if (template._migration &&
145
+ typeof template._migration === 'object' &&
146
+ !Array.isArray(template._migration)) {
147
+ const migration = template._migration;
148
+ if (Array.isArray(migration.ignorePaths)) {
149
+ ignorePaths = new Set(migration.ignorePaths.filter((p) => typeof p === 'string'));
150
+ }
151
+ if (Array.isArray(migration.removePaths)) {
152
+ removePaths = migration.removePaths.filter((p) => typeof p === 'string');
153
+ }
154
+ }
155
+ // Strip _migration from the template
156
+ delete template._migration;
157
+ return { template, ignorePaths, removePaths };
158
+ }
159
+ /**
160
+ * Recursively delete keys from obj whose full dotted path matches any entry
161
+ * in ignorePaths. The prefix parameter tracks the current path during recursion.
162
+ */
163
+ function stripIgnoredPaths(obj, ignorePaths, prefix = '') {
164
+ for (const key of Object.keys(obj)) {
165
+ const fullPath = prefix ? `${prefix}.${key}` : key;
166
+ if (ignorePaths.has(fullPath)) {
167
+ delete obj[key];
168
+ }
169
+ else if (typeof obj[key] === 'object' &&
170
+ obj[key] !== null &&
171
+ !Array.isArray(obj[key])) {
172
+ stripIgnoredPaths(obj[key], ignorePaths, fullPath);
173
+ }
174
+ }
175
+ }
176
+ /**
177
+ * Detect whether a config migration is needed (dry-run, no writes).
178
+ * Returns migration metadata including the fields that would be added.
179
+ */
180
+ function detectMigration(configPath, templatePath, templateVersion) {
181
+ const noMigration = (config, template, fromVersion) => ({
182
+ needed: false,
183
+ fromVersion,
184
+ toVersion: templateVersion,
185
+ addedFields: [],
186
+ removedFields: [],
187
+ config,
188
+ template,
189
+ });
190
+ // Config file missing = first run, create-agent handles it
191
+ if (!fs.existsSync(configPath)) {
192
+ return noMigration({}, {}, '0.0.0');
193
+ }
194
+ // Template must exist — load and strip _migration
195
+ const { template, ignorePaths, removePaths } = loadCleanTemplate(templatePath);
196
+ // Read and parse config
197
+ let configRaw;
198
+ try {
199
+ configRaw = fs.readFileSync(configPath, 'utf-8');
200
+ }
201
+ catch (err) {
202
+ throw new Error(`Cannot read config file: ${err.message}`);
203
+ }
204
+ let config;
205
+ try {
206
+ config = JSON.parse(configRaw);
207
+ }
208
+ catch (err) {
209
+ throw new Error(`Config file is not valid JSON: ${err.message}`);
210
+ }
211
+ // Version check
212
+ const configVersion = config.configVersion ?? '0.0.0';
213
+ if (compareSemver(configVersion, templateVersion) >= 0) {
214
+ return noMigration(config, template, configVersion);
215
+ }
216
+ // Dry-run merge on a clone to detect what would be added/removed
217
+ const configClone = structuredClone(config);
218
+ const added = [];
219
+ // Deep-merge top-level keys (except agents which need special handling)
220
+ const templateWithoutAgents = { ...template };
221
+ delete templateWithoutAgents.agents;
222
+ deepMerge(configClone, templateWithoutAgents, '', added, ignorePaths);
223
+ // Migrate models array by ID
224
+ migrateModels(configClone, template, added);
225
+ // Merge agent arrays
226
+ if (Array.isArray(configClone.agents) && Array.isArray(template.agents)) {
227
+ mergeAgentArrays(configClone.agents, template.agents, added, ignorePaths);
228
+ }
229
+ // Prune removed paths from agent entries
230
+ const removed = [];
231
+ if (removePaths.length > 0 && Array.isArray(configClone.agents)) {
232
+ removed.push(...pruneAgentPaths(configClone.agents, removePaths));
233
+ }
234
+ // configVersion will always be updated
235
+ if (!added.includes('configVersion')) {
236
+ added.push('configVersion');
237
+ }
238
+ return {
239
+ needed: true,
240
+ fromVersion: configVersion,
241
+ toVersion: templateVersion,
242
+ addedFields: added,
243
+ removedFields: removed,
244
+ config,
245
+ template,
246
+ };
247
+ }
248
+ /**
249
+ * Apply a config migration: deep-merge missing fields, update version,
250
+ * create backup, and write the updated config.
251
+ */
252
+ function applyMigration(configPath, config, template, templateVersion, ignorePaths, removePaths) {
253
+ const added = [];
254
+ // Deep-merge top-level keys (except agents)
255
+ const templateWithoutAgents = { ...template };
256
+ delete templateWithoutAgents.agents;
257
+ deepMerge(config, templateWithoutAgents, '', added, ignorePaths);
258
+ // Migrate models array by ID
259
+ migrateModels(config, template, added);
260
+ // Merge agent arrays
261
+ if (Array.isArray(config.agents) && Array.isArray(template.agents)) {
262
+ mergeAgentArrays(config.agents, template.agents, added, ignorePaths);
263
+ }
264
+ // Prune removed paths from agent entries
265
+ const removed = [];
266
+ if (removePaths && removePaths.length > 0 && Array.isArray(config.agents)) {
267
+ removed.push(...pruneAgentPaths(config.agents, removePaths));
268
+ }
269
+ // Update configVersion
270
+ config.configVersion = templateVersion;
271
+ if (!added.includes('configVersion')) {
272
+ added.push('configVersion');
273
+ }
274
+ // Backup before writing
275
+ const backupPath = configPath + '.bak';
276
+ fs.copyFileSync(configPath, backupPath);
277
+ // Write atomically via temp file
278
+ const tmpPath = configPath + '.tmp';
279
+ fs.writeFileSync(tmpPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
280
+ fs.renameSync(tmpPath, configPath);
281
+ return { migrated: true, addedFields: added, removedFields: removed };
282
+ }
283
+ /**
284
+ * Migrate config.json by adding missing fields from the template.
285
+ * - Never overwrites existing values
286
+ * - Creates a .bak backup before writing
287
+ * - Skips migration if config file does not exist (first run)
288
+ */
289
+ function migrateConfig(configPath, templatePath, templateVersion) {
290
+ const detection = detectMigration(configPath, templatePath, templateVersion);
291
+ if (!detection.needed) {
292
+ return { migrated: false, addedFields: [], removedFields: [] };
293
+ }
294
+ // Load ignorePaths and removePaths again for the actual merge
295
+ let ignorePaths;
296
+ let removePaths;
297
+ try {
298
+ const clean = loadCleanTemplate(templatePath);
299
+ ignorePaths = clean.ignorePaths;
300
+ removePaths = clean.removePaths;
301
+ }
302
+ catch {
303
+ // If template can't be loaded again, proceed without ignorePaths/removePaths
304
+ }
305
+ return applyMigration(configPath, detection.config, detection.template, templateVersion, ignorePaths, removePaths);
306
+ }
307
+ /**
308
+ * Merge models from template into user config by ID.
309
+ * Adds new models, updates alias/label/contextWindow of existing ones.
310
+ * Preserves user models not in template.
311
+ */
312
+ function migrateModels(config, template, added) {
313
+ const gw = config.gateway;
314
+ const tgw = template.gateway;
315
+ if (!gw || !tgw)
316
+ return;
317
+ const templateModels = tgw.models;
318
+ if (!templateModels || templateModels.length === 0)
319
+ return;
320
+ const userModels = (gw.models ?? []);
321
+ const userMap = new Map(userModels.map((m) => [m.id, m]));
322
+ const merged = [];
323
+ for (const tm of templateModels) {
324
+ const existing = userMap.get(tm.id);
325
+ if (existing) {
326
+ existing.alias = tm.alias;
327
+ existing.label = tm.label;
328
+ existing.contextWindow = tm.contextWindow;
329
+ merged.push(existing);
330
+ }
331
+ else {
332
+ merged.push(structuredClone(tm));
333
+ added.push(`gateway.models[${tm.id}]`);
334
+ }
335
+ }
336
+ for (const um of userModels) {
337
+ if (!templateModels.some((tm) => tm.id === um.id)) {
338
+ merged.push(um);
339
+ }
340
+ }
341
+ gw.models = merged;
342
+ }
343
+ //# sourceMappingURL=migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../src/config/migrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { EventEmitter } from 'events';
2
+ import { AgentConfig, GatewayConfig, Logger } from '../types';
3
+ declare const HOT_RELOADABLE_AGENT_FIELDS: string[];
4
+ export interface ConfigChange {
5
+ agentId: string;
6
+ field: string;
7
+ oldValue: unknown;
8
+ newValue: unknown;
9
+ hotReloadable: boolean;
10
+ }
11
+ export declare class ConfigWatcher extends EventEmitter {
12
+ private readonly configPath;
13
+ private readonly logger;
14
+ on(event: 'changes', listener: (changes: ConfigChange[], newCfg: GatewayConfig, oldCfg: GatewayConfig) => void): this;
15
+ on(event: 'agent.added', listener: (agent: AgentConfig) => void): this;
16
+ on(event: 'channel.added', listener: (agentId: string, channel: string) => void): this;
17
+ private watchHandle;
18
+ private currentConfig;
19
+ constructor(configPath: string, initialConfig: GatewayConfig, logger: Logger);
20
+ start(): void;
21
+ stop(): void;
22
+ /** Get current config snapshot */
23
+ getConfig(): GatewayConfig;
24
+ reload(): void;
25
+ private diffConfig;
26
+ }
27
+ /** Simple deep equality check for primitives, arrays, and plain objects */
28
+ declare function deepEqual(a: unknown, b: unknown): boolean;
29
+ export { deepEqual as _deepEqual, HOT_RELOADABLE_AGENT_FIELDS };
30
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/config/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAI9D,QAAA,MAAM,2BAA2B,EAAE,MAAM,EAOxC,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB;AAOD,qBAAa,aAAc,SAAQ,YAAY;IAa3C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdzB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IACrH,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI;IACtE,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAMtF,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAAgB;gBAGlB,UAAU,EAAE,MAAM,EACnC,aAAa,EAAE,aAAa,EACX,MAAM,EAAE,MAAM;IAMjC,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAKZ,kCAAkC;IAClC,SAAS,IAAI,aAAa;IAI1B,MAAM,IAAI,IAAI;IA8Dd,OAAO,CAAC,UAAU;CAoDnB;AAED,2EAA2E;AAC3E,iBAAS,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAoBlD;AAGD,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HOT_RELOADABLE_AGENT_FIELDS = exports.ConfigWatcher = void 0;
4
+ exports._deepEqual = deepEqual;
5
+ const events_1 = require("events");
6
+ const loader_1 = require("./loader");
7
+ const factory_1 = require("../watch/factory");
8
+ // Fields that can be hot-reloaded without restarting the gateway
9
+ const HOT_RELOADABLE_AGENT_FIELDS = [
10
+ 'claude.model',
11
+ 'claude.extraFlags',
12
+ 'claude.dangerouslySkipPermissions',
13
+ 'session.idleTimeoutMinutes',
14
+ 'session.maxConcurrent',
15
+ 'heartbeat.rateLimitMinutes',
16
+ ];
17
+ exports.HOT_RELOADABLE_AGENT_FIELDS = HOT_RELOADABLE_AGENT_FIELDS;
18
+ class ConfigWatcher extends events_1.EventEmitter {
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ on(event, listener) {
21
+ return super.on(event, listener);
22
+ }
23
+ constructor(configPath, initialConfig, logger) {
24
+ super();
25
+ this.configPath = configPath;
26
+ this.logger = logger;
27
+ this.watchHandle = null;
28
+ this.currentConfig = structuredClone(initialConfig);
29
+ }
30
+ start() {
31
+ this.watchHandle = (0, factory_1.createWatcher)({
32
+ paths: [this.configPath],
33
+ debounceMs: 500,
34
+ chokidarOpts: { awaitWriteFinish: { stabilityThreshold: 300 } },
35
+ onChange: () => this.reload(),
36
+ });
37
+ }
38
+ stop() {
39
+ void this.watchHandle?.close();
40
+ this.watchHandle = null;
41
+ }
42
+ /** Get current config snapshot */
43
+ getConfig() {
44
+ return this.currentConfig;
45
+ }
46
+ reload() {
47
+ let newConfig;
48
+ try {
49
+ newConfig = (0, loader_1.loadConfig)(this.configPath);
50
+ }
51
+ catch (err) {
52
+ this.logger.error('Config reload failed, keeping current config', {
53
+ error: err.message,
54
+ });
55
+ return;
56
+ }
57
+ const { fieldChanges, addedAgents } = this.diffConfig(this.currentConfig, newConfig);
58
+ if (fieldChanges.length === 0 && addedAgents.length === 0) {
59
+ this.logger.info('Config file changed but no effective differences detected');
60
+ return;
61
+ }
62
+ // Always update currentConfig when there are any changes (including new agents)
63
+ const oldConfig = this.currentConfig;
64
+ this.currentConfig = structuredClone(newConfig);
65
+ // Emit field changes for existing agents
66
+ if (fieldChanges.length > 0) {
67
+ const hotChanges = fieldChanges.filter(c => c.hotReloadable);
68
+ const coldChanges = fieldChanges.filter(c => !c.hotReloadable);
69
+ if (hotChanges.length > 0) {
70
+ this.logger.info('Config hot-reloaded', {
71
+ fields: hotChanges.map(c => `${c.agentId}.${c.field}`),
72
+ });
73
+ }
74
+ if (coldChanges.length > 0) {
75
+ this.logger.warn('Config changes require restart to take effect', {
76
+ fields: coldChanges.map(c => `${c.agentId}.${c.field}`),
77
+ });
78
+ }
79
+ this.emit('changes', fieldChanges, newConfig, oldConfig);
80
+ // Emit channel.added when a new channel token is added to an existing agent
81
+ for (const change of fieldChanges) {
82
+ if (!change.oldValue && change.newValue) {
83
+ if (change.field === 'discord.botToken') {
84
+ this.logger.info('Discord channel added to agent', { agentId: change.agentId });
85
+ this.emit('channel.added', change.agentId, 'discord');
86
+ }
87
+ if (change.field === 'telegram.botToken') {
88
+ this.logger.info('Telegram channel added to agent', { agentId: change.agentId });
89
+ this.emit('channel.added', change.agentId, 'telegram');
90
+ }
91
+ }
92
+ }
93
+ }
94
+ // Emit agent.added for each new agent
95
+ for (const agent of addedAgents) {
96
+ this.logger.info('New agent detected in config', { id: agent.id });
97
+ this.emit('agent.added', agent);
98
+ }
99
+ }
100
+ diffConfig(oldCfg, newCfg) {
101
+ const fieldChanges = [];
102
+ const addedAgents = [];
103
+ // Build agent maps by id for comparison
104
+ const oldAgents = new Map();
105
+ for (const agent of oldCfg.agents) {
106
+ oldAgents.set(agent.id, agent);
107
+ }
108
+ const newAgents = new Map();
109
+ for (const agent of newCfg.agents) {
110
+ newAgents.set(agent.id, agent);
111
+ }
112
+ // Compare agents that exist in both configs; collect new agents separately
113
+ for (const [id, newAgent] of newAgents) {
114
+ const oldAgent = oldAgents.get(id);
115
+ if (!oldAgent) {
116
+ addedAgents.push(newAgent);
117
+ continue;
118
+ }
119
+ // Check each field path
120
+ const fieldPairs = [
121
+ { field: 'claude.model', oldVal: oldAgent.claude.model, newVal: newAgent.claude.model },
122
+ { field: 'claude.extraFlags', oldVal: oldAgent.claude.extraFlags, newVal: newAgent.claude.extraFlags },
123
+ { field: 'claude.dangerouslySkipPermissions', oldVal: oldAgent.claude.dangerouslySkipPermissions, newVal: newAgent.claude.dangerouslySkipPermissions },
124
+ { field: 'session.idleTimeoutMinutes', oldVal: oldAgent.session?.idleTimeoutMinutes, newVal: newAgent.session?.idleTimeoutMinutes },
125
+ { field: 'session.maxConcurrent', oldVal: oldAgent.session?.maxConcurrent, newVal: newAgent.session?.maxConcurrent },
126
+ { field: 'heartbeat.rateLimitMinutes', oldVal: oldAgent.heartbeat?.rateLimitMinutes, newVal: newAgent.heartbeat?.rateLimitMinutes },
127
+ { field: 'workspace', oldVal: oldAgent.workspace, newVal: newAgent.workspace },
128
+ { field: 'telegram.botToken', oldVal: oldAgent.telegram?.botToken, newVal: newAgent.telegram?.botToken },
129
+ { field: 'discord.botToken', oldVal: oldAgent.discord?.botToken, newVal: newAgent.discord?.botToken },
130
+ { field: 'description', oldVal: oldAgent.description, newVal: newAgent.description },
131
+ ];
132
+ for (const { field, oldVal, newVal } of fieldPairs) {
133
+ if (!deepEqual(oldVal, newVal)) {
134
+ fieldChanges.push({
135
+ agentId: id,
136
+ field,
137
+ oldValue: oldVal,
138
+ newValue: newVal,
139
+ hotReloadable: HOT_RELOADABLE_AGENT_FIELDS.includes(field),
140
+ });
141
+ }
142
+ }
143
+ }
144
+ return { fieldChanges, addedAgents };
145
+ }
146
+ }
147
+ exports.ConfigWatcher = ConfigWatcher;
148
+ /** Simple deep equality check for primitives, arrays, and plain objects */
149
+ function deepEqual(a, b) {
150
+ if (a === b)
151
+ return true;
152
+ if (a === null || b === null)
153
+ return false;
154
+ if (typeof a !== typeof b)
155
+ return false;
156
+ if (Array.isArray(a) && Array.isArray(b)) {
157
+ if (a.length !== b.length)
158
+ return false;
159
+ return a.every((val, i) => deepEqual(val, b[i]));
160
+ }
161
+ if (typeof a === 'object' && typeof b === 'object') {
162
+ const aKeys = Object.keys(a);
163
+ const bKeys = Object.keys(b);
164
+ if (aKeys.length !== bKeys.length)
165
+ return false;
166
+ return aKeys.every(key => deepEqual(a[key], b[key]));
167
+ }
168
+ return false;
169
+ }
170
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/config/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { EventEmitter } from 'events';
2
+ import { CronJob, CronJobCreate, CronJobUpdate, CronRunLog, CronManagerConfig, Logger, AgentConfig } from '../types';
3
+ import type { AgentRunner } from '../agent/runner';
4
+ export declare class CronManager extends EventEmitter {
5
+ private readonly storePath;
6
+ private readonly runsDir;
7
+ private readonly logger;
8
+ private readonly agentRunners;
9
+ private readonly agentConfigs;
10
+ private jobs;
11
+ private scheduledTasks;
12
+ constructor(config?: CronManagerConfig, agentRunners?: Map<string, AgentRunner>, agentConfigs?: Map<string, AgentConfig>, logger?: Logger);
13
+ /**
14
+ * Load persisted jobs from disk and schedule them.
15
+ */
16
+ start(): Promise<void>;
17
+ /**
18
+ * Stop all scheduled tasks.
19
+ */
20
+ stop(): void;
21
+ create(input: CronJobCreate): Promise<CronJob>;
22
+ update(id: string, input: CronJobUpdate): Promise<CronJob>;
23
+ remove(id: string): Promise<void>;
24
+ get(id: string): CronJob | undefined;
25
+ list(agentId?: string): CronJob[];
26
+ run(id: string): Promise<CronRunLog>;
27
+ getRuns(id: string, limit?: number): Promise<CronRunLog[]>;
28
+ status(): {
29
+ totalJobs: number;
30
+ enabledJobs: number;
31
+ disabledJobs: number;
32
+ jobs: CronJob[];
33
+ };
34
+ private validateSchedule;
35
+ private validatePayload;
36
+ private scheduleJob;
37
+ private unscheduleJob;
38
+ private disableOrDeleteJob;
39
+ private executeJob;
40
+ private runCommand;
41
+ private runAgentTurn;
42
+ private sendTelegram;
43
+ private sendDiscord;
44
+ private persist;
45
+ private appendRunLog;
46
+ private catchUpMissedJobs;
47
+ }
48
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cron/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAOtC,OAAO,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,MAAM,EACN,WAAW,EACZ,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAyCnD,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,cAAc,CAAmE;gBAGvF,MAAM,CAAC,EAAE,iBAAiB,EAC1B,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACvC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACvC,MAAM,CAAC,EAAE,MAAM;IAUjB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAcN,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IA+C9C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAkD1D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAM3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMpC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkB5D,MAAM,IAAI;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,OAAO,EAAE,CAAC;KACjB;IAYD,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,WAAW;IA0DnB,OAAO,CAAC,aAAa;YAaP,kBAAkB;YAelB,UAAU;IA+DxB,OAAO,CAAC,UAAU;YAiBJ,YAAY;YAYZ,YAAY;YA0BZ,WAAW;YAmCX,OAAO;YAWP,YAAY;YAgBZ,iBAAiB;CAyChC"}