hoolix 0.0.1-beta.20 → 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.
Files changed (60) hide show
  1. package/README.md +24 -6
  2. package/bin/postinstall.js +1 -1
  3. package/dist/catalog/templates.d.ts.map +1 -1
  4. package/dist/catalog/templates.js +21 -1
  5. package/dist/catalog/templates.js.map +1 -1
  6. package/dist/commands/completion.d.ts.map +1 -1
  7. package/dist/commands/completion.js +47 -1
  8. package/dist/commands/completion.js.map +1 -1
  9. package/dist/commands/connect.d.ts.map +1 -1
  10. package/dist/commands/connect.js +22 -1
  11. package/dist/commands/connect.js.map +1 -1
  12. package/dist/commands/create.js +6 -2
  13. package/dist/commands/create.js.map +1 -1
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +23 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/gateway.d.ts +2 -0
  18. package/dist/commands/gateway.d.ts.map +1 -0
  19. package/dist/commands/gateway.js +230 -0
  20. package/dist/commands/gateway.js.map +1 -0
  21. package/dist/commands/list.d.ts.map +1 -1
  22. package/dist/commands/list.js +22 -3
  23. package/dist/commands/list.js.map +1 -1
  24. package/dist/commands/templates.d.ts.map +1 -1
  25. package/dist/commands/templates.js +10 -0
  26. package/dist/commands/templates.js.map +1 -1
  27. package/dist/commands/verify.js +87 -6
  28. package/dist/commands/verify.js.map +1 -1
  29. package/dist/core/gateways.d.ts +62 -0
  30. package/dist/core/gateways.d.ts.map +1 -0
  31. package/dist/core/gateways.js +115 -0
  32. package/dist/core/gateways.js.map +1 -0
  33. package/dist/core/paths.d.ts +5 -0
  34. package/dist/core/paths.d.ts.map +1 -1
  35. package/dist/core/paths.js +15 -0
  36. package/dist/core/paths.js.map +1 -1
  37. package/dist/core/version.d.ts +1 -1
  38. package/dist/core/version.d.ts.map +1 -1
  39. package/dist/core/version.js +1 -1
  40. package/dist/core/version.js.map +1 -1
  41. package/dist/index.js +26 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/mcp/gateway-host.d.ts +8 -0
  44. package/dist/mcp/gateway-host.d.ts.map +1 -0
  45. package/dist/mcp/gateway-host.js +380 -0
  46. package/dist/mcp/gateway-host.js.map +1 -0
  47. package/dist/mcp/proxy-host.d.ts.map +1 -1
  48. package/dist/mcp/proxy-host.js +3 -2
  49. package/dist/mcp/proxy-host.js.map +1 -1
  50. package/dist/process/manager.d.ts +17 -1
  51. package/dist/process/manager.d.ts.map +1 -1
  52. package/dist/process/manager.js +105 -1
  53. package/dist/process/manager.js.map +1 -1
  54. package/dist/tui/index.d.ts.map +1 -1
  55. package/dist/tui/index.js +190 -32
  56. package/dist/tui/index.js.map +1 -1
  57. package/dist/ui/help.d.ts.map +1 -1
  58. package/dist/ui/help.js +6 -1
  59. package/dist/ui/help.js.map +1 -1
  60. package/package.json +1 -1
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAipBH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA0F/C"}
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 statsStr = `${state.servers.length} server${state.servers.length !== 1 ? 's' : ''} · ${runningCount} running`;
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 (state.servers.length === 0) {
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} t copy trial command`, leftW);
162
- const r4 = pad(` ${B.dot} n copy create command`, leftW);
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 - 16)), r2, ` ${A.cyan}${B.dot}${A.reset} ${A.dim}t${A.reset} copy trial command` + ' '.repeat(Math.max(0, leftW - 21)), ` ${A.cyan}${B.dot}${A.reset} ${A.dim}n${A.reset} copy create command` + ' '.repeat(Math.max(0, leftW - 22)));
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
- for (let i = 0; i < state.servers.length && leftRaw.length < mainRows; i++) {
168
- const s = state.servers[i];
169
- const st = state.statuses[s.slug] || { running: false };
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 slug = clip(s.slug, leftW - 16).padEnd(Math.min(18, leftW - 16));
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
- let colored = ` ${selArrow} ${A.dim}${numStr}${A.reset} ${dotColor} ${slug} ${portColor}`;
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 sel = state.servers[state.selectedIndex];
204
- if (sel) {
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 (state.servers.length === 0) {
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 connect my-files --client claude`,
304
- ` 6. hoolix client status`,
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 t for templates · n for create command.`,
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 logTitle = sel ? ` Log: ${sel.slug} ` : ' Log ';
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 · v verify · c connect · x reindex/secrets · n new · t templates · r refresh · q quit';
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.selectedIndex = Math.min(state.selectedIndex, Math.max(0, state.servers.length - 1));
373
- const sel = state.servers[state.selectedIndex];
374
- state.logTail = sel ? await readLastLogLines(sel.slug) : [];
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 noServers = servers.length === 0;
391
- const slug = servers[state.selectedIndex]?.slug;
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 < servers.length) {
481
+ if (idx < totalItems) {
396
482
  state.selectedIndex = idx;
397
- state.logTail = await readLastLogLines(servers[idx].slug);
483
+ await readSelectedLog();
398
484
  }
399
485
  return;
400
486
  }
401
487
  if (key === '' && !noServers) { // ↑
402
488
  state.selectedIndex = Math.max(0, state.selectedIndex - 1);
403
- state.logTail = await readLastLogLines(servers[state.selectedIndex].slug);
489
+ await readSelectedLog();
404
490
  return;
405
491
  }
406
492
  if (key === '' && !noServers) { // ↓
407
- state.selectedIndex = Math.min(servers.length - 1, state.selectedIndex + 1);
408
- state.logTail = await readLastLogLines(servers[state.selectedIndex].slug);
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,