@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.
- package/README.md +791 -0
- package/config.template.json +87 -0
- package/dist/agent/context-isolation.d.ts +28 -0
- package/dist/agent/context-isolation.d.ts.map +1 -0
- package/dist/agent/context-isolation.js +80 -0
- package/dist/agent/context-isolation.js.map +1 -0
- package/dist/agent/runner.d.ts +211 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +1802 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +31 -0
- package/dist/agent/workspace-loader.d.ts.map +1 -0
- package/dist/agent/workspace-loader.js +207 -0
- package/dist/agent/workspace-loader.js.map +1 -0
- package/dist/api/auth.d.ts +25 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +77 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/cron-router.d.ts +22 -0
- package/dist/api/cron-router.d.ts.map +1 -0
- package/dist/api/cron-router.js +197 -0
- package/dist/api/cron-router.js.map +1 -0
- package/dist/api/gateway-router.d.ts +52 -0
- package/dist/api/gateway-router.d.ts.map +1 -0
- package/dist/api/gateway-router.js +215 -0
- package/dist/api/gateway-router.js.map +1 -0
- package/dist/api/router.d.ts +5 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +1098 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/skills-router.d.ts +5 -0
- package/dist/api/skills-router.d.ts.map +1 -0
- package/dist/api/skills-router.js +424 -0
- package/dist/api/skills-router.js.map +1 -0
- package/dist/api/workspace-router.d.ts +4 -0
- package/dist/api/workspace-router.d.ts.map +1 -0
- package/dist/api/workspace-router.js +149 -0
- package/dist/api/workspace-router.js.map +1 -0
- package/dist/config/loader.d.ts +16 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +235 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/migrator.d.ts +70 -0
- package/dist/config/migrator.d.ts.map +1 -0
- package/dist/config/migrator.js +343 -0
- package/dist/config/migrator.js.map +1 -0
- package/dist/config/watcher.d.ts +30 -0
- package/dist/config/watcher.d.ts.map +1 -0
- package/dist/config/watcher.js +170 -0
- package/dist/config/watcher.js.map +1 -0
- package/dist/cron/manager.d.ts +48 -0
- package/dist/cron/manager.d.ts.map +1 -0
- package/dist/cron/manager.js +580 -0
- package/dist/cron/manager.js.map +1 -0
- package/dist/cron/scheduler.d.ts +50 -0
- package/dist/cron/scheduler.d.ts.map +1 -0
- package/dist/cron/scheduler.js +231 -0
- package/dist/cron/scheduler.js.map +1 -0
- package/dist/discord/receiver.d.ts +17 -0
- package/dist/discord/receiver.d.ts.map +1 -0
- package/dist/discord/receiver.js +108 -0
- package/dist/discord/receiver.js.map +1 -0
- package/dist/heartbeat/history.d.ts +24 -0
- package/dist/heartbeat/history.d.ts.map +1 -0
- package/dist/heartbeat/history.js +50 -0
- package/dist/heartbeat/history.js.map +1 -0
- package/dist/heartbeat/parser.d.ts +26 -0
- package/dist/heartbeat/parser.d.ts.map +1 -0
- package/dist/heartbeat/parser.js +283 -0
- package/dist/heartbeat/parser.js.map +1 -0
- package/dist/history/cleanup.d.ts +21 -0
- package/dist/history/cleanup.d.ts.map +1 -0
- package/dist/history/cleanup.js +171 -0
- package/dist/history/cleanup.js.map +1 -0
- package/dist/history/db.d.ts +27 -0
- package/dist/history/db.d.ts.map +1 -0
- package/dist/history/db.js +323 -0
- package/dist/history/db.js.map +1 -0
- package/dist/history/media-store.d.ts +27 -0
- package/dist/history/media-store.d.ts.map +1 -0
- package/dist/history/media-store.js +158 -0
- package/dist/history/media-store.js.map +1 -0
- package/dist/history/types.d.ts +62 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +3 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +483 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +81 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/manager.d.ts +45 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +178 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/session/compactor.d.ts +22 -0
- package/dist/session/compactor.d.ts.map +1 -0
- package/dist/session/compactor.js +151 -0
- package/dist/session/compactor.js.map +1 -0
- package/dist/session/process.d.ts +76 -0
- package/dist/session/process.d.ts.map +1 -0
- package/dist/session/process.js +729 -0
- package/dist/session/process.js.map +1 -0
- package/dist/session/store.d.ts +102 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +533 -0
- package/dist/session/store.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +15 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/invoker.d.ts +16 -0
- package/dist/skills/invoker.d.ts.map +1 -0
- package/dist/skills/invoker.js +36 -0
- package/dist/skills/invoker.js.map +1 -0
- package/dist/skills/loader.d.ts +23 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +183 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/parser.d.ts +55 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +178 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/sync.d.ts +10 -0
- package/dist/skills/sync.d.ts.map +1 -0
- package/dist/skills/sync.js +130 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/skills/watcher.d.ts +16 -0
- package/dist/skills/watcher.d.ts.map +1 -0
- package/dist/skills/watcher.js +25 -0
- package/dist/skills/watcher.js.map +1 -0
- package/dist/telegram/markdown.d.ts +25 -0
- package/dist/telegram/markdown.d.ts.map +1 -0
- package/dist/telegram/markdown.js +237 -0
- package/dist/telegram/markdown.js.map +1 -0
- package/dist/telegram/receiver.d.ts +17 -0
- package/dist/telegram/receiver.d.ts.map +1 -0
- package/dist/telegram/receiver.js +104 -0
- package/dist/telegram/receiver.js.map +1 -0
- package/dist/types.d.ts +224 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/web-ui.d.ts +6 -0
- package/dist/ui/web-ui.d.ts.map +1 -0
- package/dist/ui/web-ui.js +227 -0
- package/dist/ui/web-ui.js.map +1 -0
- package/dist/watch/factory.d.ts +26 -0
- package/dist/watch/factory.d.ts.map +1 -0
- package/dist/watch/factory.js +43 -0
- package/dist/watch/factory.js.map +1 -0
- package/dist/webhook/manager.d.ts +34 -0
- package/dist/webhook/manager.d.ts.map +1 -0
- package/dist/webhook/manager.js +120 -0
- package/dist/webhook/manager.js.map +1 -0
- package/mcp/bun.lock +264 -0
- package/mcp/channel-manager.ts +115 -0
- package/mcp/package.json +15 -0
- package/mcp/router.ts +69 -0
- package/mcp/server.ts +129 -0
- package/mcp/tools/agent/handlers.ts +578 -0
- package/mcp/tools/agent/module.ts +163 -0
- package/mcp/tools/browser/module.ts +321 -0
- package/mcp/tools/browser/skills/open-browser/SKILL.md +89 -0
- package/mcp/tools/cron/client.ts +65 -0
- package/mcp/tools/cron/module.ts +158 -0
- package/mcp/tools/cron/skills/cron/SKILL.md +46 -0
- package/mcp/tools/discord/access.ts +197 -0
- package/mcp/tools/discord/client.ts +31 -0
- package/mcp/tools/discord/commands.ts +48 -0
- package/mcp/tools/discord/inbound.ts +53 -0
- package/mcp/tools/discord/module.ts +442 -0
- package/mcp/tools/discord/outbound.ts +90 -0
- package/mcp/tools/discord/receiver-server.ts +58 -0
- package/mcp/tools/discord/skills/access/SKILL.md +86 -0
- package/mcp/tools/discord/skills/configure/SKILL.md +53 -0
- package/mcp/tools/discord/threading.ts +37 -0
- package/mcp/tools/discord/types.ts +106 -0
- package/mcp/tools/skills/handlers.ts +196 -0
- package/mcp/tools/skills/module.ts +163 -0
- package/mcp/tools/telegram/module.ts +454 -0
- package/mcp/tools/telegram/pure.ts +224 -0
- package/mcp/tools/telegram/receiver-server.ts +1656 -0
- package/mcp/tools/telegram/skills/access/SKILL.md +169 -0
- package/mcp/tools/telegram/skills/configure/SKILL.md +118 -0
- package/mcp/tools/telegram/typing.ts +327 -0
- package/mcp/types.ts +128 -0
- package/package.json +62 -0
- 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":";;;AAgNsB,+BAAU;AAhNhC,mCAAsC;AACtC,qCAAsC;AAEtC,8CAA8D;AAE9D,iEAAiE;AACjE,MAAM,2BAA2B,GAAa;IAC5C,cAAc;IACd,mBAAmB;IACnB,mCAAmC;IACnC,4BAA4B;IAC5B,uBAAuB;IACvB,4BAA4B;CAC7B,CAAC;AAmMgC,kEAA2B;AApL7D,MAAa,aAAc,SAAQ,qBAAY;IAI7C,8DAA8D;IAC9D,EAAE,CAAC,KAAa,EAAE,QAAkC;QAClD,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAKD,YACmB,UAAkB,EACnC,aAA4B,EACX,MAAc;QAE/B,KAAK,EAAE,CAAC;QAJS,eAAU,GAAV,UAAU,CAAQ;QAElB,WAAM,GAAN,MAAM,CAAQ;QANzB,gBAAW,GAAuB,IAAI,CAAC;QAS7C,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,IAAA,uBAAa,EAAC;YAC/B,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC;YACxB,UAAU,EAAE,GAAG;YACf,YAAY,EAAE,EAAE,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE,EAAE;YAC/D,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,KAAK,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,kCAAkC;IAClC,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,IAAI,SAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,SAAS,GAAG,IAAA,mBAAU,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE;gBAChE,KAAK,EAAG,GAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAErF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,gFAAgF;QAChF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,yCAAyC;QACzC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YAE/D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBACtC,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;iBACvD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE;oBAChE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAEzD,4EAA4E;YAC5E,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACxC,IAAI,MAAM,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;wBACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;wBAChF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACxD,CAAC;oBACD,IAAI,MAAM,CAAC,KAAK,KAAK,mBAAmB,EAAE,CAAC;wBACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;wBACjF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,MAAqB,EAAE,MAAqB;QAC7D,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,MAAM,WAAW,GAAkB,EAAE,CAAC;QAEtC,wCAAwC;QACxC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,2EAA2E;QAC3E,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,wBAAwB;YACxB,MAAM,UAAU,GAA+D;gBAC7E,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE;gBACvF,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;gBACtG,EAAE,KAAK,EAAE,mCAAmC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,0BAA0B,EAAE;gBACtJ,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,kBAAkB,EAAE;gBACnI,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE;gBACpH,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE;gBACnI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,EAAE;gBAC9E,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBACxG,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE;gBACrG,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE;aACrF,CAAC;YAEF,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBACnD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;oBAC/B,YAAY,CAAC,IAAI,CAAC;wBAChB,OAAO,EAAE,EAAE;wBACX,KAAK;wBACL,QAAQ,EAAE,MAAM;wBAChB,QAAQ,EAAE,MAAM;wBAChB,aAAa,EAAE,2BAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC;qBAC3D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;IACvC,CAAC;CACF;AA1JD,sCA0JC;AAED,2EAA2E;AAC3E,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,KAAK,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAC,CAAC;QACxD,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAChD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CACvB,SAAS,CACN,CAA6B,CAAC,GAAG,CAAC,EAClC,CAA6B,CAAC,GAAG,CAAC,CACpC,CACF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -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"}
|