hoolix 0.0.1 → 0.0.2
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 +17 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +47 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +8 -0
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +23 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/gateway.d.ts +2 -0
- package/dist/commands/gateway.d.ts.map +1 -0
- package/dist/commands/gateway.js +230 -0
- package/dist/commands/gateway.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +22 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/core/gateways.d.ts +62 -0
- package/dist/core/gateways.d.ts.map +1 -0
- package/dist/core/gateways.js +115 -0
- package/dist/core/gateways.js.map +1 -0
- package/dist/core/paths.d.ts +5 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +15 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/index.js +26 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/gateway-host.d.ts +8 -0
- package/dist/mcp/gateway-host.d.ts.map +1 -0
- package/dist/mcp/gateway-host.js +380 -0
- package/dist/mcp/gateway-host.js.map +1 -0
- package/dist/mcp/proxy-host.d.ts.map +1 -1
- package/dist/mcp/proxy-host.js +3 -2
- package/dist/mcp/proxy-host.js.map +1 -1
- package/dist/process/manager.d.ts +17 -1
- package/dist/process/manager.d.ts.map +1 -1
- package/dist/process/manager.js +105 -1
- package/dist/process/manager.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +190 -32
- package/dist/tui/index.js.map +1 -1
- package/dist/ui/help.d.ts.map +1 -1
- package/dist/ui/help.js +5 -0
- package/dist/ui/help.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@ export interface ServerStatus {
|
|
|
8
8
|
pid?: number;
|
|
9
9
|
port?: number;
|
|
10
10
|
startedAt?: string;
|
|
11
|
-
mode?: 'http' | 'proxy';
|
|
11
|
+
mode?: 'http' | 'proxy' | 'gateway';
|
|
12
12
|
}
|
|
13
13
|
export interface HostSpawnPlanInput {
|
|
14
14
|
slug: string;
|
|
@@ -40,6 +40,15 @@ export declare function buildProxySpawnPlan(input: {
|
|
|
40
40
|
cwd?: string;
|
|
41
41
|
tsxExists?: boolean;
|
|
42
42
|
}): ProxySpawnPlan;
|
|
43
|
+
export declare function buildGatewaySpawnPlan(input: {
|
|
44
|
+
slug: string;
|
|
45
|
+
port: number;
|
|
46
|
+
authKey: string;
|
|
47
|
+
execPath?: string;
|
|
48
|
+
platform?: NodeJS.Platform;
|
|
49
|
+
cwd?: string;
|
|
50
|
+
tsxExists?: boolean;
|
|
51
|
+
}): ProxySpawnPlan;
|
|
43
52
|
export declare class ServerManager {
|
|
44
53
|
/**
|
|
45
54
|
* Start a server by spawning the MCP host (binary or dev tsx path).
|
|
@@ -60,7 +69,14 @@ export declare class ServerManager {
|
|
|
60
69
|
pid: number;
|
|
61
70
|
}>;
|
|
62
71
|
stop(slug: string, force?: boolean): Promise<boolean>;
|
|
72
|
+
startGateway(slug: string, opts?: StartOptions): Promise<{
|
|
73
|
+
port: number;
|
|
74
|
+
authKey: string;
|
|
75
|
+
pid: number;
|
|
76
|
+
}>;
|
|
77
|
+
stopGateway(slug: string, force?: boolean): Promise<boolean>;
|
|
63
78
|
getStatus(slug: string): Promise<ServerStatus>;
|
|
79
|
+
getGatewayStatus(slug: string): Promise<ServerStatus>;
|
|
64
80
|
private getMetadata;
|
|
65
81
|
private readLogTail;
|
|
66
82
|
/** Wait for HTTP /health to respond (authoritative liveness after spawn). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/process/manager.js
CHANGED
|
@@ -2,10 +2,11 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import fs from 'fs-extra';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import net from 'node:net';
|
|
5
|
-
import { getServerRuntimePath, getServerDir, getServerMetadataPath } from '../core/paths.js';
|
|
5
|
+
import { getGatewayRuntimePath, getGatewayDir, getServerRuntimePath, getServerDir, getServerMetadataPath } from '../core/paths.js';
|
|
6
6
|
import { logger } from '../core/logger.js';
|
|
7
7
|
import treeKill from 'tree-kill';
|
|
8
8
|
import psList from 'ps-list';
|
|
9
|
+
import { getGateway } from '../core/gateways.js';
|
|
9
10
|
const BASE_PORT = 3456;
|
|
10
11
|
export function buildHostSpawnPlan(input) {
|
|
11
12
|
const currentBin = input.execPath || process.execPath;
|
|
@@ -92,6 +93,26 @@ export function buildProxySpawnPlan(input) {
|
|
|
92
93
|
}
|
|
93
94
|
return { command: currentBin, args: ['--import', 'tsx', proxyScript, ...proxyArgs], mode: 'dev-node-import' };
|
|
94
95
|
}
|
|
96
|
+
export function buildGatewaySpawnPlan(input) {
|
|
97
|
+
const currentBin = input.execPath || process.execPath;
|
|
98
|
+
const isNodeOrBun = currentBin.includes('node') || currentBin.includes('bun');
|
|
99
|
+
const root = input.cwd || process.cwd();
|
|
100
|
+
const gatewayScript = path.resolve(root, 'src/mcp/gateway-host.ts');
|
|
101
|
+
const gatewayArgs = ['--slug', input.slug, '--port', String(input.port), '--auth-key', input.authKey];
|
|
102
|
+
if (!isNodeOrBun) {
|
|
103
|
+
return { command: currentBin, args: ['__internal-gateway', ...gatewayArgs], mode: 'binary' };
|
|
104
|
+
}
|
|
105
|
+
const platform = input.platform || process.platform;
|
|
106
|
+
if (platform === 'win32') {
|
|
107
|
+
return { command: currentBin, args: ['--import', 'tsx', gatewayScript, ...gatewayArgs], mode: 'dev-node-import' };
|
|
108
|
+
}
|
|
109
|
+
const tsxBin = path.resolve(root, 'node_modules', '.bin', 'tsx');
|
|
110
|
+
const tsxExists = input.tsxExists ?? fs.pathExistsSync(tsxBin);
|
|
111
|
+
if (tsxExists) {
|
|
112
|
+
return { command: tsxBin, args: [gatewayScript, ...gatewayArgs], mode: 'dev-tsx-bin' };
|
|
113
|
+
}
|
|
114
|
+
return { command: currentBin, args: ['--import', 'tsx', gatewayScript, ...gatewayArgs], mode: 'dev-node-import' };
|
|
115
|
+
}
|
|
95
116
|
export class ServerManager {
|
|
96
117
|
/**
|
|
97
118
|
* Start a server by spawning the MCP host (binary or dev tsx path).
|
|
@@ -219,6 +240,64 @@ export class ServerManager {
|
|
|
219
240
|
});
|
|
220
241
|
});
|
|
221
242
|
}
|
|
243
|
+
async startGateway(slug, opts = {}) {
|
|
244
|
+
const runtimePath = getGatewayRuntimePath(slug);
|
|
245
|
+
const existing = await this.getGatewayStatus(slug);
|
|
246
|
+
if (existing.running && existing.port && existing.pid) {
|
|
247
|
+
const gateway = await getGateway(slug);
|
|
248
|
+
return { port: existing.port, authKey: gateway.authKey, pid: existing.pid };
|
|
249
|
+
}
|
|
250
|
+
const gateway = await getGateway(slug);
|
|
251
|
+
const port = opts.port || await this.findFreePort(BASE_PORT + 600 + Math.floor(Math.random() * 400));
|
|
252
|
+
const authKey = opts.authKey || gateway.authKey;
|
|
253
|
+
const hostLogPath = path.join(getGatewayDir(slug), 'gateway.log');
|
|
254
|
+
logger.info(`Spawning gateway host for "${slug}" on port ${port}...`);
|
|
255
|
+
await fs.writeJson(runtimePath, { pid: -1, port, startedAt: new Date().toISOString(), status: 'starting', mode: 'gateway' }, { spaces: 2 });
|
|
256
|
+
const spawnPlan = buildGatewaySpawnPlan({ slug, port, authKey });
|
|
257
|
+
await fs.ensureFile(hostLogPath);
|
|
258
|
+
await fs.appendFile(hostLogPath, `\n--- ${new Date().toISOString()} gateway-spawn ${slug} on :${port} ---\n`);
|
|
259
|
+
const logFd = fs.openSync(hostLogPath, 'a');
|
|
260
|
+
const child = spawn(spawnPlan.command, spawnPlan.args, {
|
|
261
|
+
stdio: ['ignore', logFd, logFd],
|
|
262
|
+
detached: opts.detach ?? true,
|
|
263
|
+
env: { ...process.env, MCP_PORTAL_LOG_LEVEL: process.env.MCP_PORTAL_LOG_LEVEL || 'info' },
|
|
264
|
+
});
|
|
265
|
+
fs.closeSync(logFd);
|
|
266
|
+
child.on('exit', (code, signal) => {
|
|
267
|
+
if (code !== 0)
|
|
268
|
+
logger.error(`Gateway host for ${slug} exited (code=${code}, signal=${signal})`);
|
|
269
|
+
});
|
|
270
|
+
const probeOk = await this.waitForHttpHealth(port, 20000);
|
|
271
|
+
if (!probeOk) {
|
|
272
|
+
try {
|
|
273
|
+
treeKill(child.pid, 'SIGKILL');
|
|
274
|
+
}
|
|
275
|
+
catch { }
|
|
276
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
277
|
+
const tail = await this.readLogTail(hostLogPath);
|
|
278
|
+
throw new Error(`Failed to start gateway "${slug}" — health check on :${port} timed out.\nRecent logs:\n${tail}`);
|
|
279
|
+
}
|
|
280
|
+
const pid = child.pid;
|
|
281
|
+
await fs.writeJson(runtimePath, { pid, port, startedAt: new Date().toISOString(), status: 'running', mode: 'gateway' }, { spaces: 2 });
|
|
282
|
+
child.unref();
|
|
283
|
+
return { port, authKey, pid };
|
|
284
|
+
}
|
|
285
|
+
async stopGateway(slug, force = false) {
|
|
286
|
+
const runtimePath = getGatewayRuntimePath(slug);
|
|
287
|
+
const status = await this.getGatewayStatus(slug);
|
|
288
|
+
if (!status.running || !status.pid) {
|
|
289
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
return new Promise((resolve) => {
|
|
293
|
+
treeKill(status.pid, force ? 'SIGKILL' : 'SIGTERM', async (err) => {
|
|
294
|
+
if (err)
|
|
295
|
+
logger.warn(`tree-kill error for gateway ${slug}: ${err.message}`);
|
|
296
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
297
|
+
resolve(true);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
}
|
|
222
301
|
async getStatus(slug) {
|
|
223
302
|
const runtimePath = getServerRuntimePath(slug);
|
|
224
303
|
if (!(await fs.pathExists(runtimePath))) {
|
|
@@ -245,6 +324,31 @@ export class ServerManager {
|
|
|
245
324
|
return { running: false };
|
|
246
325
|
}
|
|
247
326
|
}
|
|
327
|
+
async getGatewayStatus(slug) {
|
|
328
|
+
const runtimePath = getGatewayRuntimePath(slug);
|
|
329
|
+
if (!(await fs.pathExists(runtimePath))) {
|
|
330
|
+
return { running: false };
|
|
331
|
+
}
|
|
332
|
+
try {
|
|
333
|
+
const data = await fs.readJson(runtimePath);
|
|
334
|
+
const alive = await this.isProcessAlive(data.pid);
|
|
335
|
+
if (!alive) {
|
|
336
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
337
|
+
return { running: false };
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
running: true,
|
|
341
|
+
pid: data.pid,
|
|
342
|
+
port: data.port,
|
|
343
|
+
startedAt: data.startedAt,
|
|
344
|
+
mode: 'gateway',
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
await fs.remove(runtimePath).catch(() => { });
|
|
349
|
+
return { running: false };
|
|
350
|
+
}
|
|
351
|
+
}
|
|
248
352
|
async getMetadata(slug) {
|
|
249
353
|
const metaPath = getServerMetadataPath(slug);
|
|
250
354
|
return fs.readJson(metaPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/process/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0yBH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA4F/C"}
|
package/dist/tui/index.js
CHANGED
|
@@ -23,7 +23,8 @@ import path from 'node:path';
|
|
|
23
23
|
import { execSync } from 'node:child_process';
|
|
24
24
|
import { listServers, getServerMetadata } from '../core/registry.js';
|
|
25
25
|
import { serverManager } from '../process/manager.js';
|
|
26
|
-
import { getServerDir } from '../core/paths.js';
|
|
26
|
+
import { getGatewayDir, getServerDir } from '../core/paths.js';
|
|
27
|
+
import { listGateways } from '../core/gateways.js';
|
|
27
28
|
import { logger } from '../core/logger.js';
|
|
28
29
|
import { VERSION } from '../core/version.js';
|
|
29
30
|
import { getServerSourceLabel, reindexServer, verifyServer } from '../app/services/servers.js';
|
|
@@ -94,6 +95,16 @@ async function readLastLogLines(slug, n = 6) {
|
|
|
94
95
|
return ['(no host.log yet — start the server to see logs)'];
|
|
95
96
|
}
|
|
96
97
|
}
|
|
98
|
+
async function readLastGatewayLogLines(slug, n = 6) {
|
|
99
|
+
try {
|
|
100
|
+
const content = await fs.readFile(path.join(getGatewayDir(slug), 'gateway.log'), 'utf8');
|
|
101
|
+
const lines = content.trim().split(/\r?\n/);
|
|
102
|
+
return lines.slice(-n).filter(Boolean);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return ['(no gateway.log yet — start the gateway to see logs)'];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
97
108
|
async function copyToClipboard(text) {
|
|
98
109
|
try {
|
|
99
110
|
if (process.platform === 'win32') {
|
|
@@ -129,8 +140,9 @@ function buildFrame(state) {
|
|
|
129
140
|
const rightW = innerW - leftW - 1; // −1 for the column divider │
|
|
130
141
|
const out = [];
|
|
131
142
|
// ── Header ────────────────────────────────────────────────────────────────
|
|
132
|
-
const runningCount = Object.values(state.statuses).filter((s) => s.running).length;
|
|
133
|
-
const
|
|
143
|
+
const runningCount = Object.values(state.statuses).filter((s) => s.running).length + Object.values(state.gatewayStatuses).filter((s) => s.running).length;
|
|
144
|
+
const totalItems = state.servers.length + state.gateways.length;
|
|
145
|
+
const statsStr = `${state.servers.length} servers · ${state.gateways.length} gateways · ${runningCount} running`;
|
|
134
146
|
const verStr = `v${VERSION}`;
|
|
135
147
|
const brandStr = `◆ hoolix`;
|
|
136
148
|
// Visible header content: ' brandStr statsStr '
|
|
@@ -155,33 +167,41 @@ function buildFrame(state) {
|
|
|
155
167
|
// ── Build left-column lines (visible text + colored text tracked separately)
|
|
156
168
|
const leftRaw = [];
|
|
157
169
|
const leftColored = [];
|
|
158
|
-
if (
|
|
159
|
-
const r1 = pad(' No servers yet.', leftW);
|
|
170
|
+
if (totalItems === 0) {
|
|
171
|
+
const r1 = pad(' No servers or gateways yet.', leftW);
|
|
160
172
|
const r2 = pad('', leftW);
|
|
161
|
-
const r3 = pad(` ${B.dot}
|
|
162
|
-
const r4 = pad(` ${B.dot}
|
|
173
|
+
const r3 = pad(` ${B.dot} g copy gateway command`, leftW);
|
|
174
|
+
const r4 = pad(` ${B.dot} t browse/install templates`, leftW);
|
|
163
175
|
leftRaw.push(r1, r2, r3, r4);
|
|
164
|
-
leftColored.push(` ${A.dim}No servers yet.${A.reset}` + ' '.repeat(Math.max(0, leftW -
|
|
176
|
+
leftColored.push(` ${A.dim}No servers or gateways yet.${A.reset}` + ' '.repeat(Math.max(0, leftW - 28)), r2, ` ${A.cyan}${B.dot}${A.reset} ${A.dim}g${A.reset} copy gateway command` + ' '.repeat(Math.max(0, leftW - 24)), ` ${A.cyan}${B.dot}${A.reset} ${A.dim}t${A.reset} browse/install templates` + ' '.repeat(Math.max(0, leftW - 29)));
|
|
165
177
|
}
|
|
166
178
|
else {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
179
|
+
const items = [
|
|
180
|
+
...state.servers.map((server) => ({ kind: 'server', slug: server.slug, label: server.slug })),
|
|
181
|
+
...state.gateways.map((gateway) => ({ kind: 'gateway', slug: gateway.slug, label: gateway.slug })),
|
|
182
|
+
];
|
|
183
|
+
for (let i = 0; i < items.length && leftRaw.length < mainRows; i++) {
|
|
184
|
+
const item = items[i];
|
|
185
|
+
const st = item.kind === 'gateway'
|
|
186
|
+
? state.gatewayStatuses[item.slug] || { running: false }
|
|
187
|
+
: state.statuses[item.slug] || { running: false };
|
|
170
188
|
const isSel = i === state.selectedIndex;
|
|
171
189
|
const numStr = `${i + 1}`.padStart(2);
|
|
172
190
|
const dotChar = st.running ? B.run : B.stop;
|
|
173
|
-
const
|
|
191
|
+
const marker = item.kind === 'gateway' ? 'G' : 'S';
|
|
192
|
+
const slug = clip(item.label, leftW - 18).padEnd(Math.min(18, leftW - 18));
|
|
174
193
|
const portStr = st.running && st.port ? `:${st.port}` : '';
|
|
175
194
|
const portPad = portStr.padEnd(7);
|
|
176
195
|
// Raw visible line (for width measurement)
|
|
177
|
-
const rawLine = ` ${isSel ? B.sel : ' '} ${numStr} ${dotChar} ${slug} ${portPad}`;
|
|
196
|
+
const rawLine = ` ${isSel ? B.sel : ' '} ${numStr} ${marker} ${dotChar} ${slug} ${portPad}`;
|
|
178
197
|
const rawPadded = pad(rawLine, leftW);
|
|
179
198
|
leftRaw.push(rawPadded);
|
|
180
199
|
// Colored version
|
|
181
200
|
const selArrow = isSel ? `${A.brand}${B.sel}${A.reset}` : ' ';
|
|
182
201
|
const dotColor = st.running ? `${A.green}${dotChar}${A.reset}` : `${A.gray}${dotChar}${A.reset}`;
|
|
183
202
|
const portColor = st.running && portStr ? `${A.green}${portPad}${A.reset}` : `${A.dim}${portPad}${A.reset}`;
|
|
184
|
-
|
|
203
|
+
const markerColor = item.kind === 'gateway' ? `${A.cyan}${marker}${A.reset}` : `${A.dim}${marker}${A.reset}`;
|
|
204
|
+
let colored = ` ${selArrow} ${A.dim}${numStr}${A.reset} ${markerColor} ${dotColor} ${slug} ${portColor}`;
|
|
185
205
|
if (isSel) {
|
|
186
206
|
// bg-highlight the entire row
|
|
187
207
|
colored = `${A.bgSelected}${colored}${' '.repeat(Math.max(0, leftW - rawLine.length))}${A.reset}`;
|
|
@@ -200,8 +220,43 @@ function buildFrame(state) {
|
|
|
200
220
|
// ── Build right-column lines ───────────────────────────────────────────────
|
|
201
221
|
const rightRaw = [];
|
|
202
222
|
const rightColored = [];
|
|
203
|
-
const
|
|
204
|
-
|
|
223
|
+
const selectedGateway = state.selectedIndex >= state.servers.length
|
|
224
|
+
? state.gateways[state.selectedIndex - state.servers.length]
|
|
225
|
+
: undefined;
|
|
226
|
+
const sel = selectedGateway ? undefined : state.servers[state.selectedIndex];
|
|
227
|
+
if (selectedGateway) {
|
|
228
|
+
const st = state.gatewayStatuses[selectedGateway.slug] || { running: false };
|
|
229
|
+
const addRow = (label, value, valueColor = (v) => v) => {
|
|
230
|
+
const l = pad(label, 12);
|
|
231
|
+
const v = clip(value, rightW - 14);
|
|
232
|
+
const vPad = pad(v, rightW - 14);
|
|
233
|
+
rightRaw.push(` ${l} ${vPad}`);
|
|
234
|
+
rightColored.push(` ${A.dim}${l}${A.reset} ${valueColor(vPad)}`);
|
|
235
|
+
};
|
|
236
|
+
const blank = () => {
|
|
237
|
+
rightRaw.push('');
|
|
238
|
+
rightColored.push('');
|
|
239
|
+
};
|
|
240
|
+
addRow('Name', selectedGateway.name);
|
|
241
|
+
addRow('Slug', selectedGateway.slug);
|
|
242
|
+
addRow('Kind', 'gateway');
|
|
243
|
+
addRow('Status', st.running && st.port ? `running on :${st.port}` : 'stopped', (v) => st.running ? `${A.green}${v}${A.reset}` : `${A.gray}${v}${A.reset}`);
|
|
244
|
+
addRow('Backends', `${selectedGateway.backends.length} aggregated`);
|
|
245
|
+
if (st.running && st.port)
|
|
246
|
+
addRow('URL', `http://127.0.0.1:${st.port}/mcp`, (v) => `${A.cyan}${v}${A.reset}`);
|
|
247
|
+
blank();
|
|
248
|
+
for (const backend of selectedGateway.backends.slice(0, Math.max(1, mainRows - 9))) {
|
|
249
|
+
addRow(backend.namespace, backend.slug);
|
|
250
|
+
}
|
|
251
|
+
blank();
|
|
252
|
+
const hintLine = pad(` ${B.dot} c copy config · s start/stop gateway · g new gateway`, rightW);
|
|
253
|
+
rightRaw.push(hintLine);
|
|
254
|
+
rightColored.push(` ${A.dim}${B.dot} Press ${A.reset}${A.cyan}c${A.reset}${A.dim} config` +
|
|
255
|
+
` · ${A.reset}${A.cyan}s${A.reset}${A.dim} start/stop` +
|
|
256
|
+
` · ${A.reset}${A.cyan}g${A.reset}${A.dim} new gateway${A.reset}` +
|
|
257
|
+
' '.repeat(Math.max(0, rightW - 52)));
|
|
258
|
+
}
|
|
259
|
+
else if (sel) {
|
|
205
260
|
const st = state.statuses[sel.slug] || { running: false };
|
|
206
261
|
const isMcpServer = sel.serverKind === 'mcp-server';
|
|
207
262
|
const addRow = (label, value, valueColor = (v) => v) => {
|
|
@@ -292,7 +347,7 @@ function buildFrame(state) {
|
|
|
292
347
|
rightColored.push(` ${A.dim}${B.dot} Press ${A.reset}${A.cyan}c${A.reset}${A.dim} to copy MCP config to clipboard${A.reset}` + ' '.repeat(Math.max(0, rightW - 42)));
|
|
293
348
|
}
|
|
294
349
|
}
|
|
295
|
-
else if (
|
|
350
|
+
else if (totalItems === 0) {
|
|
296
351
|
const lines = [
|
|
297
352
|
' Start here:',
|
|
298
353
|
'',
|
|
@@ -300,10 +355,11 @@ function buildFrame(state) {
|
|
|
300
355
|
` 2. hoolix install github-api --yes (token prompted)`,
|
|
301
356
|
` 3. hoolix install brave-search --yes`,
|
|
302
357
|
` 4. hoolix create "Docs" --url https://.../llms.txt --yes`,
|
|
303
|
-
` 5. hoolix
|
|
304
|
-
` 6. hoolix
|
|
358
|
+
` 5. hoolix gateway create my-tools --include github --include filesystem`,
|
|
359
|
+
` 6. hoolix gateway start my-tools`,
|
|
360
|
+
` 7. hoolix gateway connect my-tools --client codex`,
|
|
305
361
|
'',
|
|
306
|
-
` ${B.dot} Press
|
|
362
|
+
` ${B.dot} Press g for gateway command · t for templates.`,
|
|
307
363
|
];
|
|
308
364
|
for (const l of lines) {
|
|
309
365
|
rightRaw.push(pad(l, rightW));
|
|
@@ -327,7 +383,8 @@ function buildFrame(state) {
|
|
|
327
383
|
out.push(`${B.v}${lPad}${B.v}${rPad}${B.v}`);
|
|
328
384
|
}
|
|
329
385
|
// ── Log divider + tail ────────────────────────────────────────────────────
|
|
330
|
-
const
|
|
386
|
+
const selectedLogSlug = sel?.slug ?? selectedGateway?.slug;
|
|
387
|
+
const logTitle = selectedLogSlug ? ` Log: ${selectedLogSlug} ` : ' Log ';
|
|
331
388
|
const logLeft = B.h.repeat(3) + logTitle;
|
|
332
389
|
const logRight = B.h.repeat(Math.max(0, innerW - logLeft.length));
|
|
333
390
|
out.push(`${B.ml}${logLeft}${logRight}${B.mr}`);
|
|
@@ -341,7 +398,7 @@ function buildFrame(state) {
|
|
|
341
398
|
}
|
|
342
399
|
// ── Key help bar ──────────────────────────────────────────────────────────
|
|
343
400
|
out.push(`${B.ml}${B.h.repeat(innerW)}${B.mr}`);
|
|
344
|
-
const keyHelp = '↑↓/1-9 select · s start/stop ·
|
|
401
|
+
const keyHelp = '↑↓/1-9 select · g gateway · s start/stop · c connect · x secrets/approvals · n new · t templates · r refresh · q quit';
|
|
345
402
|
const helpLine = pad(` ${keyHelp}`, innerW);
|
|
346
403
|
out.push(`${B.v}${A.dim}${helpLine}${A.reset}${B.v}`);
|
|
347
404
|
// ── Action status line ────────────────────────────────────────────────────
|
|
@@ -360,6 +417,7 @@ function buildFrame(state) {
|
|
|
360
417
|
async function refresh(state) {
|
|
361
418
|
try {
|
|
362
419
|
state.servers = await listServers();
|
|
420
|
+
state.gateways = await listGateways();
|
|
363
421
|
state.statuses = {};
|
|
364
422
|
for (const s of state.servers) {
|
|
365
423
|
try {
|
|
@@ -369,9 +427,25 @@ async function refresh(state) {
|
|
|
369
427
|
state.statuses[s.slug] = { running: false };
|
|
370
428
|
}
|
|
371
429
|
}
|
|
372
|
-
state.
|
|
373
|
-
const
|
|
374
|
-
|
|
430
|
+
state.gatewayStatuses = {};
|
|
431
|
+
for (const gateway of state.gateways) {
|
|
432
|
+
try {
|
|
433
|
+
state.gatewayStatuses[gateway.slug] = await serverManager.getGatewayStatus(gateway.slug);
|
|
434
|
+
}
|
|
435
|
+
catch {
|
|
436
|
+
state.gatewayStatuses[gateway.slug] = { running: false };
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const totalItems = state.servers.length + state.gateways.length;
|
|
440
|
+
state.selectedIndex = Math.min(state.selectedIndex, Math.max(0, totalItems - 1));
|
|
441
|
+
if (state.selectedIndex >= state.servers.length) {
|
|
442
|
+
const gateway = state.gateways[state.selectedIndex - state.servers.length];
|
|
443
|
+
state.logTail = gateway ? await readLastGatewayLogLines(gateway.slug) : [];
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
const sel = state.servers[state.selectedIndex];
|
|
447
|
+
state.logTail = sel ? await readLastLogLines(sel.slug) : [];
|
|
448
|
+
}
|
|
375
449
|
}
|
|
376
450
|
catch (e) {
|
|
377
451
|
logger.debug('TUI refresh error', e?.message);
|
|
@@ -387,25 +461,37 @@ function setAction(state, msg, isError = false) {
|
|
|
387
461
|
// ── Key handlers ──────────────────────────────────────────────────────────────
|
|
388
462
|
async function handleKey(key, state) {
|
|
389
463
|
const { servers, statuses } = state;
|
|
390
|
-
const
|
|
391
|
-
const
|
|
464
|
+
const totalItems = servers.length + state.gateways.length;
|
|
465
|
+
const noServers = totalItems === 0;
|
|
466
|
+
const selectedGateway = state.selectedIndex >= servers.length ? state.gateways[state.selectedIndex - servers.length] : undefined;
|
|
467
|
+
const slug = selectedGateway?.slug ?? servers[state.selectedIndex]?.slug;
|
|
468
|
+
const readSelectedLog = async () => {
|
|
469
|
+
if (state.selectedIndex >= state.servers.length) {
|
|
470
|
+
const gateway = state.gateways[state.selectedIndex - state.servers.length];
|
|
471
|
+
state.logTail = gateway ? await readLastGatewayLogLines(gateway.slug) : [];
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
const server = state.servers[state.selectedIndex];
|
|
475
|
+
state.logTail = server ? await readLastLogLines(server.slug) : [];
|
|
476
|
+
}
|
|
477
|
+
};
|
|
392
478
|
// ── Navigation ────────────────────────────────────────────────────────────
|
|
393
479
|
if (/^[1-9]$/.test(key)) {
|
|
394
480
|
const idx = parseInt(key, 10) - 1;
|
|
395
|
-
if (idx <
|
|
481
|
+
if (idx < totalItems) {
|
|
396
482
|
state.selectedIndex = idx;
|
|
397
|
-
|
|
483
|
+
await readSelectedLog();
|
|
398
484
|
}
|
|
399
485
|
return;
|
|
400
486
|
}
|
|
401
487
|
if (key === '[A' && !noServers) { // ↑
|
|
402
488
|
state.selectedIndex = Math.max(0, state.selectedIndex - 1);
|
|
403
|
-
|
|
489
|
+
await readSelectedLog();
|
|
404
490
|
return;
|
|
405
491
|
}
|
|
406
492
|
if (key === '[B' && !noServers) { // ↓
|
|
407
|
-
state.selectedIndex = Math.min(
|
|
408
|
-
|
|
493
|
+
state.selectedIndex = Math.min(totalItems - 1, state.selectedIndex + 1);
|
|
494
|
+
await readSelectedLog();
|
|
409
495
|
return;
|
|
410
496
|
}
|
|
411
497
|
// ── Global actions ────────────────────────────────────────────────────────
|
|
@@ -429,10 +515,45 @@ async function handleKey(key, state) {
|
|
|
429
515
|
setTimeout(() => { setAction(state, null); render(state); }, 3000);
|
|
430
516
|
return;
|
|
431
517
|
}
|
|
518
|
+
if (key.toLowerCase() === 'g') {
|
|
519
|
+
const cmd = 'hoolix gateway create my-tools --include github --include filesystem --include brave-search';
|
|
520
|
+
const copied = await copyToClipboard(cmd);
|
|
521
|
+
setAction(state, copied ? `Copied: ${cmd}` : `Run: ${cmd}`);
|
|
522
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
432
525
|
// ── Server actions (require a selected server) ────────────────────────────
|
|
433
526
|
if (!slug)
|
|
434
527
|
return;
|
|
435
528
|
if (key.toLowerCase() === 's') {
|
|
529
|
+
if (selectedGateway) {
|
|
530
|
+
const st = state.gatewayStatuses[selectedGateway.slug] || { running: false };
|
|
531
|
+
if (st.running) {
|
|
532
|
+
setAction(state, `Stopping gateway ${selectedGateway.slug}…`);
|
|
533
|
+
render(state);
|
|
534
|
+
try {
|
|
535
|
+
await serverManager.stopGateway(selectedGateway.slug);
|
|
536
|
+
setAction(state, `Stopped gateway ${selectedGateway.slug}`);
|
|
537
|
+
}
|
|
538
|
+
catch (e) {
|
|
539
|
+
setAction(state, `Stop failed: ${e?.message || e}`, true);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
else {
|
|
543
|
+
setAction(state, `Starting gateway ${selectedGateway.slug}…`);
|
|
544
|
+
render(state);
|
|
545
|
+
try {
|
|
546
|
+
const result = await serverManager.startGateway(selectedGateway.slug);
|
|
547
|
+
setAction(state, `Started gateway ${selectedGateway.slug} on :${result.port}`);
|
|
548
|
+
}
|
|
549
|
+
catch (e) {
|
|
550
|
+
setAction(state, `Gateway start failed: ${e?.message || e}`, true);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
await refresh(state);
|
|
554
|
+
setTimeout(() => { setAction(state, null); render(state); }, 2500);
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
436
557
|
// mcp-server kind: stop proxy if running, otherwise hint
|
|
437
558
|
if (servers[state.selectedIndex]?.serverKind === 'mcp-server') {
|
|
438
559
|
const mcpSt = statuses[slug] || { running: false };
|
|
@@ -484,6 +605,11 @@ async function handleKey(key, state) {
|
|
|
484
605
|
return;
|
|
485
606
|
}
|
|
486
607
|
if (key.toLowerCase() === 'v') {
|
|
608
|
+
if (selectedGateway) {
|
|
609
|
+
setAction(state, `${selectedGateway.slug}: ${selectedGateway.backends.length} backend(s), tools aggregate at runtime. Run: hoolix gateway list`);
|
|
610
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
487
613
|
// mcp-server kind: quick credential count check instead of RAG verify
|
|
488
614
|
if (servers[state.selectedIndex]?.serverKind === 'mcp-server') {
|
|
489
615
|
try {
|
|
@@ -517,6 +643,29 @@ async function handleKey(key, state) {
|
|
|
517
643
|
}
|
|
518
644
|
if (key.toLowerCase() === 'c') {
|
|
519
645
|
try {
|
|
646
|
+
if (selectedGateway) {
|
|
647
|
+
const st = state.gatewayStatuses[selectedGateway.slug] || {};
|
|
648
|
+
if (!st.running || !st.port) {
|
|
649
|
+
setAction(state, `Start gateway first: hoolix gateway start ${selectedGateway.slug}`);
|
|
650
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
const payload = {
|
|
654
|
+
mcpServers: {
|
|
655
|
+
[selectedGateway.slug]: {
|
|
656
|
+
type: 'streamable-http',
|
|
657
|
+
url: `http://127.0.0.1:${st.port}/mcp`,
|
|
658
|
+
headers: { Authorization: `Bearer ${selectedGateway.authKey}` },
|
|
659
|
+
},
|
|
660
|
+
},
|
|
661
|
+
};
|
|
662
|
+
const copied = await copyToClipboard(JSON.stringify(payload, null, 2));
|
|
663
|
+
setAction(state, copied
|
|
664
|
+
? `✓ Copied gateway config for ${selectedGateway.slug}`
|
|
665
|
+
: `Run: hoolix gateway connect ${selectedGateway.slug} --json`);
|
|
666
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
520
669
|
const meta = await getServerMetadata(slug);
|
|
521
670
|
if (meta.serverKind === 'mcp-server') {
|
|
522
671
|
// If proxy is running, emit HTTP config; otherwise stdio config
|
|
@@ -587,6 +736,13 @@ async function handleKey(key, state) {
|
|
|
587
736
|
return;
|
|
588
737
|
}
|
|
589
738
|
if (key.toLowerCase() === 'x') {
|
|
739
|
+
if (selectedGateway) {
|
|
740
|
+
const cmd = `hoolix gateway connect ${selectedGateway.slug} --client codex`;
|
|
741
|
+
await copyToClipboard(cmd);
|
|
742
|
+
setAction(state, `Approvals are next-round; copied gateway connect command. Secrets stay on backing servers.`);
|
|
743
|
+
setTimeout(() => { setAction(state, null); render(state); }, 4000);
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
590
746
|
// mcp-server kind: redirect to secrets instead of reindex
|
|
591
747
|
if (servers[state.selectedIndex]?.serverKind === 'mcp-server') {
|
|
592
748
|
const cmd = `hoolix secrets set ${slug} <key> <value>`;
|
|
@@ -645,7 +801,9 @@ export async function launchTUI() {
|
|
|
645
801
|
}
|
|
646
802
|
const state = {
|
|
647
803
|
servers: [],
|
|
804
|
+
gateways: [],
|
|
648
805
|
statuses: {},
|
|
806
|
+
gatewayStatuses: {},
|
|
649
807
|
selectedIndex: 0,
|
|
650
808
|
logTail: [],
|
|
651
809
|
actionMsg: null,
|