@0xmaxma/claude-gateway 1.1.10 → 1.2.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 +61 -1
- package/dist/agent/builtin-commands.d.ts +10 -0
- package/dist/agent/builtin-commands.d.ts.map +1 -0
- package/dist/agent/builtin-commands.js +38 -0
- package/dist/agent/builtin-commands.js.map +1 -0
- package/dist/agent/runner.d.ts +1 -4
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +25 -30
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +9 -4
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/apps-router.d.ts +7 -0
- package/dist/api/apps-router.d.ts.map +1 -0
- package/dist/api/apps-router.js +242 -0
- package/dist/api/apps-router.js.map +1 -0
- package/dist/api/gateway-router.d.ts +17 -1
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +171 -2
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/router.js +2 -2
- package/dist/api/router.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +76 -0
- package/dist/apps/agent-manager.d.ts.map +1 -0
- package/dist/apps/agent-manager.js +311 -0
- package/dist/apps/agent-manager.js.map +1 -0
- package/dist/apps/compose-generator.d.ts +108 -0
- package/dist/apps/compose-generator.d.ts.map +1 -0
- package/dist/apps/compose-generator.js +687 -0
- package/dist/apps/compose-generator.js.map +1 -0
- package/dist/apps/installer.d.ts +101 -0
- package/dist/apps/installer.d.ts.map +1 -0
- package/dist/apps/installer.js +898 -0
- package/dist/apps/installer.js.map +1 -0
- package/dist/apps/registry-client.d.ts +37 -0
- package/dist/apps/registry-client.d.ts.map +1 -0
- package/dist/apps/registry-client.js +106 -0
- package/dist/apps/registry-client.js.map +1 -0
- package/dist/apps/registry.d.ts +54 -0
- package/dist/apps/registry.d.ts.map +1 -0
- package/dist/apps/registry.js +182 -0
- package/dist/apps/registry.js.map +1 -0
- package/dist/apps/socket-server.d.ts +46 -0
- package/dist/apps/socket-server.d.ts.map +1 -0
- package/dist/apps/socket-server.js +297 -0
- package/dist/apps/socket-server.js.map +1 -0
- package/dist/config/watcher.d.ts.map +1 -1
- package/dist/config/watcher.js +35 -0
- package/dist/config/watcher.js.map +1 -1
- package/dist/index.js +145 -1
- package/dist/index.js.map +1 -1
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +47 -6
- package/dist/session/process.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/mcp/server.ts +2 -0
- package/mcp/tools/apps/client.ts +78 -0
- package/mcp/tools/apps/module.ts +211 -0
- package/mcp/tools/apps/skills/app-status/SKILL.md +48 -0
- package/mcp/tools/apps/skills/create-app-yaml/SKILL.md +94 -0
- package/mcp/tools/apps/skills/install-app/SKILL.md +102 -0
- package/mcp/tools/apps/skills/list-apps/SKILL.md +34 -0
- package/package.json +1 -1
|
@@ -0,0 +1,297 @@
|
|
|
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.SocketServer = void 0;
|
|
37
|
+
exports.parseTimeoutMs = parseTimeoutMs;
|
|
38
|
+
const fs = __importStar(require("node:fs"));
|
|
39
|
+
const http = __importStar(require("node:http"));
|
|
40
|
+
const node_child_process_1 = require("node:child_process");
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
// ─── Server ───────────────────────────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Manages per-app Unix socket servers.
|
|
45
|
+
* Each socket is a separate HTTP server listening on a Unix domain socket file.
|
|
46
|
+
* Containers with the socket volume-mounted send HTTP requests here to execute
|
|
47
|
+
* declared scripts on the VM host.
|
|
48
|
+
*/
|
|
49
|
+
class SocketServer {
|
|
50
|
+
constructor() {
|
|
51
|
+
this.servers = new Map();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a Unix socket server at socketPath.
|
|
55
|
+
* The socket is created with the caller's umask; chmod 600 is applied after bind.
|
|
56
|
+
*/
|
|
57
|
+
start(socketPath, config) {
|
|
58
|
+
if (this.servers.has(socketPath)) {
|
|
59
|
+
return Promise.resolve();
|
|
60
|
+
}
|
|
61
|
+
// Pre-compile arg patterns at startup to avoid per-request ReDoS risk
|
|
62
|
+
for (const scriptDef of Object.values(config.scripts)) {
|
|
63
|
+
for (const argDef of scriptDef.args ?? []) {
|
|
64
|
+
if (argDef.pattern && !argDef._compiledPattern) {
|
|
65
|
+
try {
|
|
66
|
+
argDef._compiledPattern = new RegExp(argDef.pattern);
|
|
67
|
+
}
|
|
68
|
+
catch { /* invalid pattern */ }
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
// Ensure parent directory exists (socket lives inside a per-app subdirectory)
|
|
74
|
+
try {
|
|
75
|
+
fs.mkdirSync(path.dirname(socketPath), { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
catch { /* exists */ }
|
|
78
|
+
// Clean up any stale socket or leftover directory before binding
|
|
79
|
+
if (fs.existsSync(socketPath)) {
|
|
80
|
+
try {
|
|
81
|
+
fs.rmSync(socketPath, { recursive: true, force: true });
|
|
82
|
+
}
|
|
83
|
+
catch { /* already gone */ }
|
|
84
|
+
}
|
|
85
|
+
const server = http.createServer((req, res) => {
|
|
86
|
+
void this.handleRequest(req, res, socketPath, config);
|
|
87
|
+
});
|
|
88
|
+
const netServer = server.listen(socketPath, () => {
|
|
89
|
+
try {
|
|
90
|
+
// 0o666: containers with cap_drop:ALL lack CAP_DAC_OVERRIDE so they cannot
|
|
91
|
+
// bypass file permissions even as root — world-writable is required here.
|
|
92
|
+
// Exposure is bounded to containers that have this socket explicitly bind-mounted
|
|
93
|
+
// in their compose file. On multi-tenant hosts, any host process can also reach
|
|
94
|
+
// this socket — ensure the host is not shared with untrusted processes.
|
|
95
|
+
fs.chmodSync(socketPath, 0o666);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// chmod may fail in test environments — not fatal
|
|
99
|
+
}
|
|
100
|
+
resolve();
|
|
101
|
+
});
|
|
102
|
+
netServer.on('error', (err) => {
|
|
103
|
+
this.servers.delete(socketPath);
|
|
104
|
+
reject(new Error(`Socket server failed: ${err.message}`));
|
|
105
|
+
});
|
|
106
|
+
this.servers.set(socketPath, netServer);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
stop(socketPath) {
|
|
110
|
+
const server = this.servers.get(socketPath);
|
|
111
|
+
if (!server)
|
|
112
|
+
return;
|
|
113
|
+
server.close();
|
|
114
|
+
this.servers.delete(socketPath);
|
|
115
|
+
try {
|
|
116
|
+
fs.rmSync(socketPath, { recursive: true, force: true });
|
|
117
|
+
// Clean up the parent socket directory if empty (created per-app at install time)
|
|
118
|
+
const parentDir = path.dirname(socketPath);
|
|
119
|
+
try {
|
|
120
|
+
fs.rmdirSync(parentDir);
|
|
121
|
+
}
|
|
122
|
+
catch { /* non-empty or already gone — OK */ }
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Already removed
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
stopAll() {
|
|
129
|
+
for (const socketPath of this.servers.keys()) {
|
|
130
|
+
this.stop(socketPath);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Stop all sockets whose path is under the app's socket directory (e.g. "my-app-svc/"). */
|
|
134
|
+
stopApp(appName) {
|
|
135
|
+
const prefix = `${appName}-`;
|
|
136
|
+
for (const socketPath of [...this.servers.keys()]) {
|
|
137
|
+
const parts = socketPath.split('/');
|
|
138
|
+
// New layout: .../sockets/appName-svcName/gateway.sock — check parent dir
|
|
139
|
+
const parentDir = parts[parts.length - 2] ?? '';
|
|
140
|
+
// Legacy layout: .../sockets/appName-svcName.sock — check basename
|
|
141
|
+
const basename = parts[parts.length - 1] ?? '';
|
|
142
|
+
if (parentDir.startsWith(prefix) || basename.startsWith(prefix)) {
|
|
143
|
+
this.stop(socketPath);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ─── Request handler ────────────────────────────────────────────────────
|
|
148
|
+
async handleRequest(req, res, _socketPath, config) {
|
|
149
|
+
// Only POST /tool/script/:name is supported
|
|
150
|
+
const match = req.url?.match(/^\/tool\/script\/([a-z0-9_-]+)$/i);
|
|
151
|
+
if (req.method !== 'POST' || !match) {
|
|
152
|
+
this.send(res, 404, { error: 'Not found' });
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const scriptName = match[1];
|
|
156
|
+
const scriptDef = config.scripts[scriptName];
|
|
157
|
+
if (!scriptDef) {
|
|
158
|
+
this.send(res, 403, {
|
|
159
|
+
error: `Script "${scriptName}" is not declared for this app`,
|
|
160
|
+
});
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Parse request body
|
|
164
|
+
let body;
|
|
165
|
+
try {
|
|
166
|
+
body = await this.readBody(req);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
this.send(res, 400, { error: 'Invalid JSON body' });
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const providedArgs = (body['args'] ?? {});
|
|
173
|
+
// Validate args against declared patterns
|
|
174
|
+
const validationError = this.validateArgs(providedArgs, scriptDef);
|
|
175
|
+
if (validationError) {
|
|
176
|
+
this.send(res, 400, { error: validationError });
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Build positional args array (in declaration order)
|
|
180
|
+
const positional = [];
|
|
181
|
+
for (const argDef of scriptDef.args ?? []) {
|
|
182
|
+
const val = providedArgs[argDef.name];
|
|
183
|
+
if (val !== undefined) {
|
|
184
|
+
positional.push(String(val));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Execute script via bash — re-resolve realpath at execute time to guard against symlink swaps
|
|
188
|
+
const scriptAbsPath = path.resolve(config.appDir, scriptDef.path);
|
|
189
|
+
let realScriptPath;
|
|
190
|
+
let realAppDir;
|
|
191
|
+
try {
|
|
192
|
+
realScriptPath = fs.realpathSync(scriptAbsPath);
|
|
193
|
+
realAppDir = fs.realpathSync(config.appDir);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
this.send(res, 403, { error: 'Script not accessible' });
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (!realScriptPath.startsWith(realAppDir + path.sep) && realScriptPath !== realAppDir) {
|
|
200
|
+
this.send(res, 403, { error: 'Script path escapes app directory' });
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// Minimal env — never expose host secrets to scripts
|
|
204
|
+
const scriptEnv = {
|
|
205
|
+
PATH: process.env['PATH'] ?? '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
|
|
206
|
+
HOME: process.env['HOME'] ?? '/root',
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
const result = (0, node_child_process_1.spawnSync)('bash', [realScriptPath, ...positional], {
|
|
210
|
+
encoding: 'utf-8',
|
|
211
|
+
timeout: scriptDef.timeoutMs,
|
|
212
|
+
env: scriptEnv,
|
|
213
|
+
});
|
|
214
|
+
this.send(res, 200, {
|
|
215
|
+
stdout: result.stdout ?? '',
|
|
216
|
+
stderr: result.stderr ?? '',
|
|
217
|
+
exitCode: result.status ?? 1,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
this.send(res, 500, {
|
|
222
|
+
error: `Script execution failed: ${err.message}`,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
validateArgs(provided, scriptDef) {
|
|
227
|
+
const MAX_ARG_LEN = 256;
|
|
228
|
+
for (const argDef of scriptDef.args ?? []) {
|
|
229
|
+
const val = provided[argDef.name];
|
|
230
|
+
if (val === undefined)
|
|
231
|
+
continue; // Optional args are OK
|
|
232
|
+
if (typeof val !== 'string') {
|
|
233
|
+
return `Argument "${argDef.name}" must be a string`;
|
|
234
|
+
}
|
|
235
|
+
// Cap value length before regex test to prevent ReDoS from catastrophic backtracking
|
|
236
|
+
if (val.length > MAX_ARG_LEN) {
|
|
237
|
+
return `Argument "${argDef.name}" exceeds maximum length of ${MAX_ARG_LEN}`;
|
|
238
|
+
}
|
|
239
|
+
if (argDef.pattern) {
|
|
240
|
+
const re = argDef._compiledPattern;
|
|
241
|
+
if (!re) {
|
|
242
|
+
return `Internal error: invalid pattern for argument "${argDef.name}"`;
|
|
243
|
+
}
|
|
244
|
+
if (!re.test(val)) {
|
|
245
|
+
return `Argument "${argDef.name}" does not match required pattern`;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
readBody(req) {
|
|
252
|
+
const MAX_BODY = 1 * 1024 * 1024; // 1 MB
|
|
253
|
+
return new Promise((resolve, reject) => {
|
|
254
|
+
const chunks = [];
|
|
255
|
+
let size = 0;
|
|
256
|
+
req.on('data', (chunk) => {
|
|
257
|
+
size += chunk.length;
|
|
258
|
+
if (size > MAX_BODY) {
|
|
259
|
+
reject(new Error('Request body too large'));
|
|
260
|
+
req.destroy();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
chunks.push(chunk);
|
|
264
|
+
});
|
|
265
|
+
req.on('end', () => {
|
|
266
|
+
try {
|
|
267
|
+
const raw = Buffer.concat(chunks).toString('utf-8');
|
|
268
|
+
resolve(raw ? JSON.parse(raw) : {});
|
|
269
|
+
}
|
|
270
|
+
catch (e) {
|
|
271
|
+
reject(e);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
req.on('error', reject);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
send(res, status, body) {
|
|
278
|
+
const json = JSON.stringify(body);
|
|
279
|
+
res.writeHead(status, {
|
|
280
|
+
'Content-Type': 'application/json',
|
|
281
|
+
'Content-Length': Buffer.byteLength(json),
|
|
282
|
+
});
|
|
283
|
+
res.end(json);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
exports.SocketServer = SocketServer;
|
|
287
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
288
|
+
/** Parse "60s", "10s", "5s" → milliseconds. Defaults to 30000. */
|
|
289
|
+
function parseTimeoutMs(timeout) {
|
|
290
|
+
if (!timeout)
|
|
291
|
+
return 30000;
|
|
292
|
+
const m = timeout.match(/^(\d+)s$/);
|
|
293
|
+
if (!m)
|
|
294
|
+
return 30000;
|
|
295
|
+
return parseInt(m[1], 10) * 1000;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=socket-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-server.js","sourceRoot":"","sources":["../../src/apps/socket-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/config/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/config/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,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;IAc3C,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAfzB,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;IACtF,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAMxF,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;IAgFd,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"}
|
package/dist/config/watcher.js
CHANGED
|
@@ -1,8 +1,42 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.HOT_RELOADABLE_AGENT_FIELDS = exports.ConfigWatcher = void 0;
|
|
4
37
|
exports._deepEqual = deepEqual;
|
|
5
38
|
const events_1 = require("events");
|
|
39
|
+
const os = __importStar(require("os"));
|
|
6
40
|
const loader_1 = require("./loader");
|
|
7
41
|
const factory_1 = require("../watch/factory");
|
|
8
42
|
// Fields that can be hot-reloaded without restarting the gateway
|
|
@@ -47,6 +81,7 @@ class ConfigWatcher extends events_1.EventEmitter {
|
|
|
47
81
|
let newConfig;
|
|
48
82
|
try {
|
|
49
83
|
newConfig = (0, loader_1.loadConfig)(this.configPath);
|
|
84
|
+
newConfig.gateway.logDir = newConfig.gateway.logDir.replace(/^~(?=\/|$)/, os.homedir());
|
|
50
85
|
}
|
|
51
86
|
catch (err) {
|
|
52
87
|
this.logger.error('Config reload failed, keeping current config', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/config/watcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/config/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -71,6 +71,12 @@ const gateway_router_1 = require("./api/gateway-router");
|
|
|
71
71
|
const context_isolation_1 = require("./agent/context-isolation");
|
|
72
72
|
const logger_1 = require("./logger");
|
|
73
73
|
const watcher_1 = require("./config/watcher");
|
|
74
|
+
const registry_1 = require("./apps/registry");
|
|
75
|
+
const registry_client_1 = require("./apps/registry-client");
|
|
76
|
+
const installer_1 = require("./apps/installer");
|
|
77
|
+
const agent_manager_1 = require("./apps/agent-manager");
|
|
78
|
+
const socket_server_1 = require("./apps/socket-server");
|
|
79
|
+
const compose_generator_1 = require("./apps/compose-generator");
|
|
74
80
|
function expandTilde(p) {
|
|
75
81
|
if (p === '~' || p.startsWith('~/')) {
|
|
76
82
|
return path.join(os.homedir(), p.slice(1));
|
|
@@ -190,6 +196,24 @@ async function startAgent(agentConfig, gatewayConfig, ctx) {
|
|
|
190
196
|
logger.warn('Workspace migration failed', { error: err.message });
|
|
191
197
|
}
|
|
192
198
|
}
|
|
199
|
+
// ── Create stub workspace files if missing (e.g. freshly-installed app-agents) ──
|
|
200
|
+
const WORKSPACE_STUBS = {
|
|
201
|
+
'AGENTS.md': `# Agent: ${agentConfig.id}\n`,
|
|
202
|
+
'SOUL.md': '',
|
|
203
|
+
'MEMORY.md': '',
|
|
204
|
+
};
|
|
205
|
+
for (const [filename, content] of Object.entries(WORKSPACE_STUBS)) {
|
|
206
|
+
const filePath = path.join(agentConfig.workspace, filename);
|
|
207
|
+
if (!fs.existsSync(filePath)) {
|
|
208
|
+
try {
|
|
209
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
210
|
+
logger.info(`Created stub ${filename}`);
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
logger.warn(`Failed to create stub ${filename}`, { error: err.message });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
193
217
|
// ── Per-agent workspace validation (fail fast per-agent, not whole gateway) ──
|
|
194
218
|
const validation = validateWorkspaceFast(agentConfig.workspace);
|
|
195
219
|
if (!validation.ok) {
|
|
@@ -310,6 +334,44 @@ async function startAgent(agentConfig, gatewayConfig, ctx) {
|
|
|
310
334
|
});
|
|
311
335
|
startupResults.push({ id: agentConfig.id, status: 'started', workspace: agentConfig.workspace });
|
|
312
336
|
}
|
|
337
|
+
async function restoreSockets(registry, socketServer) {
|
|
338
|
+
const apps = await registry.list();
|
|
339
|
+
for (const app of apps) {
|
|
340
|
+
if (app.status !== 'running')
|
|
341
|
+
continue;
|
|
342
|
+
if (Object.keys(app.sockets).length === 0)
|
|
343
|
+
continue;
|
|
344
|
+
const yamlPath = path.join(app.installPath, 'app.yaml');
|
|
345
|
+
if (!fs.existsSync(yamlPath))
|
|
346
|
+
continue;
|
|
347
|
+
let appYaml;
|
|
348
|
+
try {
|
|
349
|
+
appYaml = (0, compose_generator_1.parseAppYaml)(fs.readFileSync(yamlPath, 'utf-8'), app.installPath);
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
for (const [svcName, sockPath] of Object.entries(app.sockets)) {
|
|
355
|
+
const svc = appYaml.services[svcName];
|
|
356
|
+
if (!svc?.gateway_api)
|
|
357
|
+
continue;
|
|
358
|
+
try {
|
|
359
|
+
fs.unlinkSync(sockPath);
|
|
360
|
+
}
|
|
361
|
+
catch { /* stale or absent */ }
|
|
362
|
+
fs.mkdirSync(path.dirname(sockPath), { recursive: true });
|
|
363
|
+
socketServer.start(sockPath, {
|
|
364
|
+
appName: app.name,
|
|
365
|
+
serviceName: svcName,
|
|
366
|
+
appDir: app.installPath,
|
|
367
|
+
scripts: Object.fromEntries(Object.entries(svc.gateway_api.scripts ?? {}).map(([name, s]) => [
|
|
368
|
+
name,
|
|
369
|
+
{ path: s.path, timeoutMs: (0, socket_server_1.parseTimeoutMs)(s.timeout), args: s.args },
|
|
370
|
+
])),
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
313
375
|
async function main() {
|
|
314
376
|
// Load agent .env files before config interpolation so ${TOKEN} vars resolve
|
|
315
377
|
const gatewayAgentsDir = path.join(path.dirname(CONFIG_PATH), 'agents');
|
|
@@ -384,10 +446,91 @@ async function main() {
|
|
|
384
446
|
}
|
|
385
447
|
// Print startup summary table
|
|
386
448
|
printStartupTable(startupResults);
|
|
449
|
+
// ── App store components ─────────────────────────────────────────────────
|
|
450
|
+
const appsConfigPath = path.join(path.dirname(CONFIG_PATH), 'apps.json');
|
|
451
|
+
const appsRegistry = new registry_1.AppsRegistry(appsConfigPath);
|
|
452
|
+
const registryClient = new registry_client_1.RegistryClient();
|
|
453
|
+
const agentManager = new agent_manager_1.AgentManager(CONFIG_PATH, path.join(path.dirname(CONFIG_PATH), 'agents'));
|
|
454
|
+
const socketServer = new socket_server_1.SocketServer();
|
|
455
|
+
// Callbacks that bridge installer events to the router (filled in after router is created)
|
|
456
|
+
const installerCallbacks = {
|
|
457
|
+
registerRoutes: (_appName, _ports) => {
|
|
458
|
+
// No-op until router is ready; router.loadProxyRoutes() handles startup restore
|
|
459
|
+
},
|
|
460
|
+
deregisterRoutes: (_appName) => { },
|
|
461
|
+
startSocket: (_socketPath, _socket, _scripts, _appDir) => Promise.resolve(),
|
|
462
|
+
stopSockets: (_appName) => { },
|
|
463
|
+
reinitializeAgent: async (agentName) => {
|
|
464
|
+
const runner = ctx.agentRunners.get(agentName);
|
|
465
|
+
const agentConfig = ctx.agentConfigs.get(agentName);
|
|
466
|
+
if (!runner || !agentConfig)
|
|
467
|
+
return; // first install — agent.added will call startAgent
|
|
468
|
+
const logger = (0, logger_1.createLogger)(agentName, ctx.logDir);
|
|
469
|
+
try {
|
|
470
|
+
const updated = await (0, workspace_loader_1.loadWorkspace)(agentConfig.workspace, {
|
|
471
|
+
mcpToolsDir: ctx.mcpToolsDir,
|
|
472
|
+
sharedSkillsDir: ctx.sharedSkillsDir,
|
|
473
|
+
logger,
|
|
474
|
+
});
|
|
475
|
+
const claudeMdPath = path.join(agentConfig.workspace, 'CLAUDE.md');
|
|
476
|
+
await fs.promises.writeFile(claudeMdPath, updated.systemPrompt, 'utf8');
|
|
477
|
+
logger.info('Rewrote CLAUDE.md after reinstall', { chars: updated.systemPrompt.length });
|
|
478
|
+
if (updated.skillRegistry) {
|
|
479
|
+
runner.setSkillRegistry(updated.skillRegistry);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
logger.error('Failed to reinitialize agent workspace after reinstall', { error: err.message });
|
|
484
|
+
}
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
const appInstaller = new installer_1.AppInstaller(appsRegistry, registryClient, installerCallbacks, undefined, undefined, agentManager);
|
|
387
488
|
// Start gateway router
|
|
388
|
-
const router = new gateway_router_1.GatewayRouter(agentRunners, agentConfigs, undefined, config, cronManager, CONFIG_PATH);
|
|
489
|
+
const router = new gateway_router_1.GatewayRouter(agentRunners, agentConfigs, undefined, config, cronManager, CONFIG_PATH, appsRegistry, appInstaller, registryClient);
|
|
389
490
|
await router.start(PORT);
|
|
390
491
|
console.log(`[gateway] Listening on port ${PORT}`);
|
|
492
|
+
// Wire installer callbacks now that the router is available
|
|
493
|
+
installerCallbacks.registerRoutes = (appName, ports) => {
|
|
494
|
+
for (const port of ports) {
|
|
495
|
+
router.registerProxyRoute(appName, port.name, port.hostPort, port.type, port.rateLimit);
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
installerCallbacks.deregisterRoutes = (appName) => {
|
|
499
|
+
router.deregisterProxyRoutes(appName);
|
|
500
|
+
};
|
|
501
|
+
installerCallbacks.startSocket = (socketPath, socket, scripts, appDir) => {
|
|
502
|
+
return socketServer.start(socketPath, {
|
|
503
|
+
appName: socket.service.split('-')[0] ?? 'unknown',
|
|
504
|
+
serviceName: socket.service,
|
|
505
|
+
appDir,
|
|
506
|
+
scripts: Object.fromEntries(Object.entries(scripts).map(([name, s]) => [
|
|
507
|
+
name,
|
|
508
|
+
{
|
|
509
|
+
path: s.path,
|
|
510
|
+
timeoutMs: (0, socket_server_1.parseTimeoutMs)(s.timeout),
|
|
511
|
+
args: s.args,
|
|
512
|
+
},
|
|
513
|
+
])),
|
|
514
|
+
});
|
|
515
|
+
};
|
|
516
|
+
installerCallbacks.stopSockets = (appName) => {
|
|
517
|
+
socketServer.stopApp(appName);
|
|
518
|
+
};
|
|
519
|
+
// Restore proxy routes, sockets, and agent entries for apps that were running before restart
|
|
520
|
+
try {
|
|
521
|
+
await router.loadProxyRoutes(appsRegistry);
|
|
522
|
+
await restoreSockets(appsRegistry, socketServer);
|
|
523
|
+
const reconcileErrors = await agentManager.reconcileAgents(appsRegistry);
|
|
524
|
+
if (reconcileErrors.length > 0) {
|
|
525
|
+
for (const e of reconcileErrors) {
|
|
526
|
+
globalLogger.warn(`App store: reconcile failed for "${e.app}": ${e.error}`);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
globalLogger.info('App store: proxy routes, sockets, and agent entries restored');
|
|
530
|
+
}
|
|
531
|
+
catch (err) {
|
|
532
|
+
globalLogger.warn('App store: startup restore failed (non-fatal)', { error: err.message });
|
|
533
|
+
}
|
|
391
534
|
// ── Config hot-reload watcher ──────────────────────────────────────────────
|
|
392
535
|
const configWatcher = new watcher_1.ConfigWatcher(CONFIG_PATH, config, globalLogger);
|
|
393
536
|
configWatcher.on('changes', (changes, newConfig) => {
|
|
@@ -487,6 +630,7 @@ async function main() {
|
|
|
487
630
|
}
|
|
488
631
|
cronManager.stop();
|
|
489
632
|
configWatcher.stop();
|
|
633
|
+
socketServer.stopAll();
|
|
490
634
|
await router.stop();
|
|
491
635
|
for (const runner of agentRunners.values()) {
|
|
492
636
|
await runner.stop();
|