hoolix 0.0.1 → 0.0.3
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 +31 -1
- package/dist/commands/approvals.d.ts +2 -0
- package/dist/commands/approvals.d.ts.map +1 -0
- package/dist/commands/approvals.js +65 -0
- package/dist/commands/approvals.js.map +1 -0
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +123 -2
- 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 +44 -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 +237 -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/commands/profile.d.ts +2 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +169 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/core/approvals.d.ts +67 -0
- package/dist/core/approvals.d.ts.map +1 -0
- package/dist/core/approvals.js +104 -0
- package/dist/core/approvals.js.map +1 -0
- 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 +9 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +27 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/policy.d.ts +20 -0
- package/dist/core/policy.d.ts.map +1 -0
- package/dist/core/policy.js +95 -0
- package/dist/core/policy.js.map +1 -0
- package/dist/core/profiles.d.ts +141 -0
- package/dist/core/profiles.d.ts.map +1 -0
- package/dist/core/profiles.js +159 -0
- package/dist/core/profiles.js.map +1 -0
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/index.js +38 -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 +447 -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 +223 -32
- package/dist/tui/index.js.map +1 -1
- package/dist/ui/help.d.ts.map +1 -1
- package/dist/ui/help.js +10 -0
- package/dist/ui/help.js.map +1 -1
- package/package.json +1 -1
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;AA20BH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA8F/C"}
|
package/dist/tui/index.js
CHANGED
|
@@ -23,7 +23,10 @@ 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';
|
|
28
|
+
import { decideApproval, listPendingApprovals } from '../core/approvals.js';
|
|
29
|
+
import { listProfiles } from '../core/profiles.js';
|
|
27
30
|
import { logger } from '../core/logger.js';
|
|
28
31
|
import { VERSION } from '../core/version.js';
|
|
29
32
|
import { getServerSourceLabel, reindexServer, verifyServer } from '../app/services/servers.js';
|
|
@@ -94,6 +97,16 @@ async function readLastLogLines(slug, n = 6) {
|
|
|
94
97
|
return ['(no host.log yet — start the server to see logs)'];
|
|
95
98
|
}
|
|
96
99
|
}
|
|
100
|
+
async function readLastGatewayLogLines(slug, n = 6) {
|
|
101
|
+
try {
|
|
102
|
+
const content = await fs.readFile(path.join(getGatewayDir(slug), 'gateway.log'), 'utf8');
|
|
103
|
+
const lines = content.trim().split(/\r?\n/);
|
|
104
|
+
return lines.slice(-n).filter(Boolean);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return ['(no gateway.log yet — start the gateway to see logs)'];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
97
110
|
async function copyToClipboard(text) {
|
|
98
111
|
try {
|
|
99
112
|
if (process.platform === 'win32') {
|
|
@@ -129,8 +142,9 @@ function buildFrame(state) {
|
|
|
129
142
|
const rightW = innerW - leftW - 1; // −1 for the column divider │
|
|
130
143
|
const out = [];
|
|
131
144
|
// ── Header ────────────────────────────────────────────────────────────────
|
|
132
|
-
const runningCount = Object.values(state.statuses).filter((s) => s.running).length;
|
|
133
|
-
const
|
|
145
|
+
const runningCount = Object.values(state.statuses).filter((s) => s.running).length + Object.values(state.gatewayStatuses).filter((s) => s.running).length;
|
|
146
|
+
const totalItems = state.servers.length + state.gateways.length;
|
|
147
|
+
const statsStr = `${state.servers.length} servers · ${state.gateways.length} gateways · ${state.profiles.length} profiles · ${state.pendingApprovals.length} approvals · ${runningCount} running`;
|
|
134
148
|
const verStr = `v${VERSION}`;
|
|
135
149
|
const brandStr = `◆ hoolix`;
|
|
136
150
|
// Visible header content: ' brandStr statsStr '
|
|
@@ -155,33 +169,41 @@ function buildFrame(state) {
|
|
|
155
169
|
// ── Build left-column lines (visible text + colored text tracked separately)
|
|
156
170
|
const leftRaw = [];
|
|
157
171
|
const leftColored = [];
|
|
158
|
-
if (
|
|
159
|
-
const r1 = pad(' No servers yet.', leftW);
|
|
172
|
+
if (totalItems === 0) {
|
|
173
|
+
const r1 = pad(' No servers or gateways yet.', leftW);
|
|
160
174
|
const r2 = pad('', leftW);
|
|
161
|
-
const r3 = pad(` ${B.dot}
|
|
162
|
-
const r4 = pad(` ${B.dot}
|
|
175
|
+
const r3 = pad(` ${B.dot} g copy gateway command`, leftW);
|
|
176
|
+
const r4 = pad(` ${B.dot} t browse/install templates`, leftW);
|
|
163
177
|
leftRaw.push(r1, r2, r3, r4);
|
|
164
|
-
leftColored.push(` ${A.dim}No servers yet.${A.reset}` + ' '.repeat(Math.max(0, leftW -
|
|
178
|
+
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
179
|
}
|
|
166
180
|
else {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
181
|
+
const items = [
|
|
182
|
+
...state.servers.map((server) => ({ kind: 'server', slug: server.slug, label: server.slug })),
|
|
183
|
+
...state.gateways.map((gateway) => ({ kind: 'gateway', slug: gateway.slug, label: gateway.slug })),
|
|
184
|
+
];
|
|
185
|
+
for (let i = 0; i < items.length && leftRaw.length < mainRows; i++) {
|
|
186
|
+
const item = items[i];
|
|
187
|
+
const st = item.kind === 'gateway'
|
|
188
|
+
? state.gatewayStatuses[item.slug] || { running: false }
|
|
189
|
+
: state.statuses[item.slug] || { running: false };
|
|
170
190
|
const isSel = i === state.selectedIndex;
|
|
171
191
|
const numStr = `${i + 1}`.padStart(2);
|
|
172
192
|
const dotChar = st.running ? B.run : B.stop;
|
|
173
|
-
const
|
|
193
|
+
const marker = item.kind === 'gateway' ? 'G' : 'S';
|
|
194
|
+
const slug = clip(item.label, leftW - 18).padEnd(Math.min(18, leftW - 18));
|
|
174
195
|
const portStr = st.running && st.port ? `:${st.port}` : '';
|
|
175
196
|
const portPad = portStr.padEnd(7);
|
|
176
197
|
// Raw visible line (for width measurement)
|
|
177
|
-
const rawLine = ` ${isSel ? B.sel : ' '} ${numStr} ${dotChar} ${slug} ${portPad}`;
|
|
198
|
+
const rawLine = ` ${isSel ? B.sel : ' '} ${numStr} ${marker} ${dotChar} ${slug} ${portPad}`;
|
|
178
199
|
const rawPadded = pad(rawLine, leftW);
|
|
179
200
|
leftRaw.push(rawPadded);
|
|
180
201
|
// Colored version
|
|
181
202
|
const selArrow = isSel ? `${A.brand}${B.sel}${A.reset}` : ' ';
|
|
182
203
|
const dotColor = st.running ? `${A.green}${dotChar}${A.reset}` : `${A.gray}${dotChar}${A.reset}`;
|
|
183
204
|
const portColor = st.running && portStr ? `${A.green}${portPad}${A.reset}` : `${A.dim}${portPad}${A.reset}`;
|
|
184
|
-
|
|
205
|
+
const markerColor = item.kind === 'gateway' ? `${A.cyan}${marker}${A.reset}` : `${A.dim}${marker}${A.reset}`;
|
|
206
|
+
let colored = ` ${selArrow} ${A.dim}${numStr}${A.reset} ${markerColor} ${dotColor} ${slug} ${portColor}`;
|
|
185
207
|
if (isSel) {
|
|
186
208
|
// bg-highlight the entire row
|
|
187
209
|
colored = `${A.bgSelected}${colored}${' '.repeat(Math.max(0, leftW - rawLine.length))}${A.reset}`;
|
|
@@ -200,8 +222,51 @@ function buildFrame(state) {
|
|
|
200
222
|
// ── Build right-column lines ───────────────────────────────────────────────
|
|
201
223
|
const rightRaw = [];
|
|
202
224
|
const rightColored = [];
|
|
203
|
-
const
|
|
204
|
-
|
|
225
|
+
const selectedGateway = state.selectedIndex >= state.servers.length
|
|
226
|
+
? state.gateways[state.selectedIndex - state.servers.length]
|
|
227
|
+
: undefined;
|
|
228
|
+
const sel = selectedGateway ? undefined : state.servers[state.selectedIndex];
|
|
229
|
+
if (selectedGateway) {
|
|
230
|
+
const st = state.gatewayStatuses[selectedGateway.slug] || { running: false };
|
|
231
|
+
const addRow = (label, value, valueColor = (v) => v) => {
|
|
232
|
+
const l = pad(label, 12);
|
|
233
|
+
const v = clip(value, rightW - 14);
|
|
234
|
+
const vPad = pad(v, rightW - 14);
|
|
235
|
+
rightRaw.push(` ${l} ${vPad}`);
|
|
236
|
+
rightColored.push(` ${A.dim}${l}${A.reset} ${valueColor(vPad)}`);
|
|
237
|
+
};
|
|
238
|
+
const blank = () => {
|
|
239
|
+
rightRaw.push('');
|
|
240
|
+
rightColored.push('');
|
|
241
|
+
};
|
|
242
|
+
addRow('Name', selectedGateway.name);
|
|
243
|
+
addRow('Slug', selectedGateway.slug);
|
|
244
|
+
addRow('Kind', 'gateway');
|
|
245
|
+
addRow('Status', st.running && st.port ? `running on :${st.port}` : 'stopped', (v) => st.running ? `${A.green}${v}${A.reset}` : `${A.gray}${v}${A.reset}`);
|
|
246
|
+
addRow('Backends', `${selectedGateway.backends.length} aggregated`);
|
|
247
|
+
addRow('Profiles', state.profiles.length ? state.profiles.map((profile) => profile.slug).slice(0, 3).join(', ') : 'none');
|
|
248
|
+
addRow('Approvals', state.pendingApprovals.length ? `${state.pendingApprovals.length} pending` : 'none');
|
|
249
|
+
if (st.running && st.port)
|
|
250
|
+
addRow('URL', `http://127.0.0.1:${st.port}/mcp`, (v) => `${A.cyan}${v}${A.reset}`);
|
|
251
|
+
blank();
|
|
252
|
+
for (const backend of selectedGateway.backends.slice(0, Math.max(1, mainRows - 9))) {
|
|
253
|
+
addRow(backend.namespace, backend.slug);
|
|
254
|
+
}
|
|
255
|
+
blank();
|
|
256
|
+
if (state.pendingApprovals[0]) {
|
|
257
|
+
const pending = state.pendingApprovals[0];
|
|
258
|
+
blank();
|
|
259
|
+
addRow('Pending', `${pending.profile}: ${pending.toolName}`);
|
|
260
|
+
addRow('Approval ID', pending.id);
|
|
261
|
+
}
|
|
262
|
+
const hintLine = pad(` ${B.dot} c copy config · s start/stop gateway · a approve`, rightW);
|
|
263
|
+
rightRaw.push(hintLine);
|
|
264
|
+
rightColored.push(` ${A.dim}${B.dot} Press ${A.reset}${A.cyan}c${A.reset}${A.dim} config` +
|
|
265
|
+
` · ${A.reset}${A.cyan}s${A.reset}${A.dim} start/stop` +
|
|
266
|
+
` · ${A.reset}${A.cyan}a${A.reset}${A.dim} approve${A.reset}` +
|
|
267
|
+
' '.repeat(Math.max(0, rightW - 52)));
|
|
268
|
+
}
|
|
269
|
+
else if (sel) {
|
|
205
270
|
const st = state.statuses[sel.slug] || { running: false };
|
|
206
271
|
const isMcpServer = sel.serverKind === 'mcp-server';
|
|
207
272
|
const addRow = (label, value, valueColor = (v) => v) => {
|
|
@@ -292,7 +357,7 @@ function buildFrame(state) {
|
|
|
292
357
|
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
358
|
}
|
|
294
359
|
}
|
|
295
|
-
else if (
|
|
360
|
+
else if (totalItems === 0) {
|
|
296
361
|
const lines = [
|
|
297
362
|
' Start here:',
|
|
298
363
|
'',
|
|
@@ -300,10 +365,11 @@ function buildFrame(state) {
|
|
|
300
365
|
` 2. hoolix install github-api --yes (token prompted)`,
|
|
301
366
|
` 3. hoolix install brave-search --yes`,
|
|
302
367
|
` 4. hoolix create "Docs" --url https://.../llms.txt --yes`,
|
|
303
|
-
` 5. hoolix
|
|
304
|
-
` 6. hoolix
|
|
368
|
+
` 5. hoolix gateway create my-tools --include github --include filesystem`,
|
|
369
|
+
` 6. hoolix gateway start my-tools`,
|
|
370
|
+
` 7. hoolix gateway connect my-tools --client codex`,
|
|
305
371
|
'',
|
|
306
|
-
` ${B.dot} Press
|
|
372
|
+
` ${B.dot} Press g for gateway command · t for templates.`,
|
|
307
373
|
];
|
|
308
374
|
for (const l of lines) {
|
|
309
375
|
rightRaw.push(pad(l, rightW));
|
|
@@ -327,7 +393,8 @@ function buildFrame(state) {
|
|
|
327
393
|
out.push(`${B.v}${lPad}${B.v}${rPad}${B.v}`);
|
|
328
394
|
}
|
|
329
395
|
// ── Log divider + tail ────────────────────────────────────────────────────
|
|
330
|
-
const
|
|
396
|
+
const selectedLogSlug = sel?.slug ?? selectedGateway?.slug;
|
|
397
|
+
const logTitle = selectedLogSlug ? ` Log: ${selectedLogSlug} ` : ' Log ';
|
|
331
398
|
const logLeft = B.h.repeat(3) + logTitle;
|
|
332
399
|
const logRight = B.h.repeat(Math.max(0, innerW - logLeft.length));
|
|
333
400
|
out.push(`${B.ml}${logLeft}${logRight}${B.mr}`);
|
|
@@ -341,7 +408,7 @@ function buildFrame(state) {
|
|
|
341
408
|
}
|
|
342
409
|
// ── Key help bar ──────────────────────────────────────────────────────────
|
|
343
410
|
out.push(`${B.ml}${B.h.repeat(innerW)}${B.mr}`);
|
|
344
|
-
const keyHelp = '↑↓/1-9 select · s start/stop ·
|
|
411
|
+
const keyHelp = '↑↓/1-9 select · g gateway · s start/stop · c connect · a approve · A deny · x secrets · r refresh · q quit';
|
|
345
412
|
const helpLine = pad(` ${keyHelp}`, innerW);
|
|
346
413
|
out.push(`${B.v}${A.dim}${helpLine}${A.reset}${B.v}`);
|
|
347
414
|
// ── Action status line ────────────────────────────────────────────────────
|
|
@@ -360,6 +427,9 @@ function buildFrame(state) {
|
|
|
360
427
|
async function refresh(state) {
|
|
361
428
|
try {
|
|
362
429
|
state.servers = await listServers();
|
|
430
|
+
state.gateways = await listGateways();
|
|
431
|
+
state.profiles = await listProfiles();
|
|
432
|
+
state.pendingApprovals = await listPendingApprovals();
|
|
363
433
|
state.statuses = {};
|
|
364
434
|
for (const s of state.servers) {
|
|
365
435
|
try {
|
|
@@ -369,9 +439,25 @@ async function refresh(state) {
|
|
|
369
439
|
state.statuses[s.slug] = { running: false };
|
|
370
440
|
}
|
|
371
441
|
}
|
|
372
|
-
state.
|
|
373
|
-
const
|
|
374
|
-
|
|
442
|
+
state.gatewayStatuses = {};
|
|
443
|
+
for (const gateway of state.gateways) {
|
|
444
|
+
try {
|
|
445
|
+
state.gatewayStatuses[gateway.slug] = await serverManager.getGatewayStatus(gateway.slug);
|
|
446
|
+
}
|
|
447
|
+
catch {
|
|
448
|
+
state.gatewayStatuses[gateway.slug] = { running: false };
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const totalItems = state.servers.length + state.gateways.length;
|
|
452
|
+
state.selectedIndex = Math.min(state.selectedIndex, Math.max(0, totalItems - 1));
|
|
453
|
+
if (state.selectedIndex >= state.servers.length) {
|
|
454
|
+
const gateway = state.gateways[state.selectedIndex - state.servers.length];
|
|
455
|
+
state.logTail = gateway ? await readLastGatewayLogLines(gateway.slug) : [];
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
const sel = state.servers[state.selectedIndex];
|
|
459
|
+
state.logTail = sel ? await readLastLogLines(sel.slug) : [];
|
|
460
|
+
}
|
|
375
461
|
}
|
|
376
462
|
catch (e) {
|
|
377
463
|
logger.debug('TUI refresh error', e?.message);
|
|
@@ -387,25 +473,37 @@ function setAction(state, msg, isError = false) {
|
|
|
387
473
|
// ── Key handlers ──────────────────────────────────────────────────────────────
|
|
388
474
|
async function handleKey(key, state) {
|
|
389
475
|
const { servers, statuses } = state;
|
|
390
|
-
const
|
|
391
|
-
const
|
|
476
|
+
const totalItems = servers.length + state.gateways.length;
|
|
477
|
+
const noServers = totalItems === 0;
|
|
478
|
+
const selectedGateway = state.selectedIndex >= servers.length ? state.gateways[state.selectedIndex - servers.length] : undefined;
|
|
479
|
+
const slug = selectedGateway?.slug ?? servers[state.selectedIndex]?.slug;
|
|
480
|
+
const readSelectedLog = async () => {
|
|
481
|
+
if (state.selectedIndex >= state.servers.length) {
|
|
482
|
+
const gateway = state.gateways[state.selectedIndex - state.servers.length];
|
|
483
|
+
state.logTail = gateway ? await readLastGatewayLogLines(gateway.slug) : [];
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
const server = state.servers[state.selectedIndex];
|
|
487
|
+
state.logTail = server ? await readLastLogLines(server.slug) : [];
|
|
488
|
+
}
|
|
489
|
+
};
|
|
392
490
|
// ── Navigation ────────────────────────────────────────────────────────────
|
|
393
491
|
if (/^[1-9]$/.test(key)) {
|
|
394
492
|
const idx = parseInt(key, 10) - 1;
|
|
395
|
-
if (idx <
|
|
493
|
+
if (idx < totalItems) {
|
|
396
494
|
state.selectedIndex = idx;
|
|
397
|
-
|
|
495
|
+
await readSelectedLog();
|
|
398
496
|
}
|
|
399
497
|
return;
|
|
400
498
|
}
|
|
401
499
|
if (key === '[A' && !noServers) { // ↑
|
|
402
500
|
state.selectedIndex = Math.max(0, state.selectedIndex - 1);
|
|
403
|
-
|
|
501
|
+
await readSelectedLog();
|
|
404
502
|
return;
|
|
405
503
|
}
|
|
406
504
|
if (key === '[B' && !noServers) { // ↓
|
|
407
|
-
state.selectedIndex = Math.min(
|
|
408
|
-
|
|
505
|
+
state.selectedIndex = Math.min(totalItems - 1, state.selectedIndex + 1);
|
|
506
|
+
await readSelectedLog();
|
|
409
507
|
return;
|
|
410
508
|
}
|
|
411
509
|
// ── Global actions ────────────────────────────────────────────────────────
|
|
@@ -429,10 +527,64 @@ async function handleKey(key, state) {
|
|
|
429
527
|
setTimeout(() => { setAction(state, null); render(state); }, 3000);
|
|
430
528
|
return;
|
|
431
529
|
}
|
|
530
|
+
if (key.toLowerCase() === 'g') {
|
|
531
|
+
const cmd = 'hoolix gateway create my-tools --include github --include filesystem --include brave-search';
|
|
532
|
+
const copied = await copyToClipboard(cmd);
|
|
533
|
+
setAction(state, copied ? `Copied: ${cmd}` : `Run: ${cmd}`);
|
|
534
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
if (key === 'a' || key === 'A') {
|
|
538
|
+
const pending = state.pendingApprovals[0];
|
|
539
|
+
if (!pending) {
|
|
540
|
+
setAction(state, 'No pending approvals.');
|
|
541
|
+
setTimeout(() => { setAction(state, null); render(state); }, 2500);
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
try {
|
|
545
|
+
const nextStatus = key === 'a' ? 'approved' : 'denied';
|
|
546
|
+
await decideApproval(pending.id, nextStatus);
|
|
547
|
+
setAction(state, `${nextStatus === 'approved' ? 'Approved' : 'Denied'} ${pending.id} (${pending.toolName})`);
|
|
548
|
+
await refresh(state);
|
|
549
|
+
}
|
|
550
|
+
catch (e) {
|
|
551
|
+
setAction(state, `Approval update failed: ${e?.message || e}`, true);
|
|
552
|
+
}
|
|
553
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3000);
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
432
556
|
// ── Server actions (require a selected server) ────────────────────────────
|
|
433
557
|
if (!slug)
|
|
434
558
|
return;
|
|
435
559
|
if (key.toLowerCase() === 's') {
|
|
560
|
+
if (selectedGateway) {
|
|
561
|
+
const st = state.gatewayStatuses[selectedGateway.slug] || { running: false };
|
|
562
|
+
if (st.running) {
|
|
563
|
+
setAction(state, `Stopping gateway ${selectedGateway.slug}…`);
|
|
564
|
+
render(state);
|
|
565
|
+
try {
|
|
566
|
+
await serverManager.stopGateway(selectedGateway.slug);
|
|
567
|
+
setAction(state, `Stopped gateway ${selectedGateway.slug}`);
|
|
568
|
+
}
|
|
569
|
+
catch (e) {
|
|
570
|
+
setAction(state, `Stop failed: ${e?.message || e}`, true);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
else {
|
|
574
|
+
setAction(state, `Starting gateway ${selectedGateway.slug}…`);
|
|
575
|
+
render(state);
|
|
576
|
+
try {
|
|
577
|
+
const result = await serverManager.startGateway(selectedGateway.slug);
|
|
578
|
+
setAction(state, `Started gateway ${selectedGateway.slug} on :${result.port}`);
|
|
579
|
+
}
|
|
580
|
+
catch (e) {
|
|
581
|
+
setAction(state, `Gateway start failed: ${e?.message || e}`, true);
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
await refresh(state);
|
|
585
|
+
setTimeout(() => { setAction(state, null); render(state); }, 2500);
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
436
588
|
// mcp-server kind: stop proxy if running, otherwise hint
|
|
437
589
|
if (servers[state.selectedIndex]?.serverKind === 'mcp-server') {
|
|
438
590
|
const mcpSt = statuses[slug] || { running: false };
|
|
@@ -484,6 +636,11 @@ async function handleKey(key, state) {
|
|
|
484
636
|
return;
|
|
485
637
|
}
|
|
486
638
|
if (key.toLowerCase() === 'v') {
|
|
639
|
+
if (selectedGateway) {
|
|
640
|
+
setAction(state, `${selectedGateway.slug}: ${selectedGateway.backends.length} backend(s), tools aggregate at runtime. Run: hoolix gateway list`);
|
|
641
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
487
644
|
// mcp-server kind: quick credential count check instead of RAG verify
|
|
488
645
|
if (servers[state.selectedIndex]?.serverKind === 'mcp-server') {
|
|
489
646
|
try {
|
|
@@ -517,6 +674,29 @@ async function handleKey(key, state) {
|
|
|
517
674
|
}
|
|
518
675
|
if (key.toLowerCase() === 'c') {
|
|
519
676
|
try {
|
|
677
|
+
if (selectedGateway) {
|
|
678
|
+
const st = state.gatewayStatuses[selectedGateway.slug] || {};
|
|
679
|
+
if (!st.running || !st.port) {
|
|
680
|
+
setAction(state, `Start gateway first: hoolix gateway start ${selectedGateway.slug}`);
|
|
681
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
682
|
+
return;
|
|
683
|
+
}
|
|
684
|
+
const payload = {
|
|
685
|
+
mcpServers: {
|
|
686
|
+
[selectedGateway.slug]: {
|
|
687
|
+
type: 'streamable-http',
|
|
688
|
+
url: `http://127.0.0.1:${st.port}/mcp`,
|
|
689
|
+
headers: { Authorization: `Bearer ${selectedGateway.authKey}` },
|
|
690
|
+
},
|
|
691
|
+
},
|
|
692
|
+
};
|
|
693
|
+
const copied = await copyToClipboard(JSON.stringify(payload, null, 2));
|
|
694
|
+
setAction(state, copied
|
|
695
|
+
? `✓ Copied gateway config for ${selectedGateway.slug}`
|
|
696
|
+
: `Run: hoolix gateway connect ${selectedGateway.slug} --json`);
|
|
697
|
+
setTimeout(() => { setAction(state, null); render(state); }, 3500);
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
520
700
|
const meta = await getServerMetadata(slug);
|
|
521
701
|
if (meta.serverKind === 'mcp-server') {
|
|
522
702
|
// If proxy is running, emit HTTP config; otherwise stdio config
|
|
@@ -587,6 +767,13 @@ async function handleKey(key, state) {
|
|
|
587
767
|
return;
|
|
588
768
|
}
|
|
589
769
|
if (key.toLowerCase() === 'x') {
|
|
770
|
+
if (selectedGateway) {
|
|
771
|
+
const cmd = `hoolix gateway connect ${selectedGateway.slug} --client codex`;
|
|
772
|
+
await copyToClipboard(cmd);
|
|
773
|
+
setAction(state, state.pendingApprovals.length ? `Pending approvals: ${state.pendingApprovals.length}. Press a to approve, A to deny.` : `No pending approvals. Secrets stay on backing servers.`);
|
|
774
|
+
setTimeout(() => { setAction(state, null); render(state); }, 4000);
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
590
777
|
// mcp-server kind: redirect to secrets instead of reindex
|
|
591
778
|
if (servers[state.selectedIndex]?.serverKind === 'mcp-server') {
|
|
592
779
|
const cmd = `hoolix secrets set ${slug} <key> <value>`;
|
|
@@ -645,7 +832,11 @@ export async function launchTUI() {
|
|
|
645
832
|
}
|
|
646
833
|
const state = {
|
|
647
834
|
servers: [],
|
|
835
|
+
gateways: [],
|
|
648
836
|
statuses: {},
|
|
837
|
+
gatewayStatuses: {},
|
|
838
|
+
profiles: [],
|
|
839
|
+
pendingApprovals: [],
|
|
649
840
|
selectedIndex: 0,
|
|
650
841
|
logTail: [],
|
|
651
842
|
actionMsg: null,
|