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.
Files changed (67) hide show
  1. package/README.md +31 -1
  2. package/dist/commands/approvals.d.ts +2 -0
  3. package/dist/commands/approvals.d.ts.map +1 -0
  4. package/dist/commands/approvals.js +65 -0
  5. package/dist/commands/approvals.js.map +1 -0
  6. package/dist/commands/completion.d.ts.map +1 -1
  7. package/dist/commands/completion.js +123 -2
  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 +8 -0
  11. package/dist/commands/connect.js.map +1 -1
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +44 -1
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/gateway.d.ts +2 -0
  16. package/dist/commands/gateway.d.ts.map +1 -0
  17. package/dist/commands/gateway.js +237 -0
  18. package/dist/commands/gateway.js.map +1 -0
  19. package/dist/commands/list.d.ts.map +1 -1
  20. package/dist/commands/list.js +22 -3
  21. package/dist/commands/list.js.map +1 -1
  22. package/dist/commands/profile.d.ts +2 -0
  23. package/dist/commands/profile.d.ts.map +1 -0
  24. package/dist/commands/profile.js +169 -0
  25. package/dist/commands/profile.js.map +1 -0
  26. package/dist/core/approvals.d.ts +67 -0
  27. package/dist/core/approvals.d.ts.map +1 -0
  28. package/dist/core/approvals.js +104 -0
  29. package/dist/core/approvals.js.map +1 -0
  30. package/dist/core/gateways.d.ts +62 -0
  31. package/dist/core/gateways.d.ts.map +1 -0
  32. package/dist/core/gateways.js +115 -0
  33. package/dist/core/gateways.js.map +1 -0
  34. package/dist/core/paths.d.ts +9 -0
  35. package/dist/core/paths.d.ts.map +1 -1
  36. package/dist/core/paths.js +27 -0
  37. package/dist/core/paths.js.map +1 -1
  38. package/dist/core/policy.d.ts +20 -0
  39. package/dist/core/policy.d.ts.map +1 -0
  40. package/dist/core/policy.js +95 -0
  41. package/dist/core/policy.js.map +1 -0
  42. package/dist/core/profiles.d.ts +141 -0
  43. package/dist/core/profiles.d.ts.map +1 -0
  44. package/dist/core/profiles.js +159 -0
  45. package/dist/core/profiles.js.map +1 -0
  46. package/dist/core/version.d.ts +1 -1
  47. package/dist/core/version.js +1 -1
  48. package/dist/index.js +38 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/mcp/gateway-host.d.ts +8 -0
  51. package/dist/mcp/gateway-host.d.ts.map +1 -0
  52. package/dist/mcp/gateway-host.js +447 -0
  53. package/dist/mcp/gateway-host.js.map +1 -0
  54. package/dist/mcp/proxy-host.d.ts.map +1 -1
  55. package/dist/mcp/proxy-host.js +3 -2
  56. package/dist/mcp/proxy-host.js.map +1 -1
  57. package/dist/process/manager.d.ts +17 -1
  58. package/dist/process/manager.d.ts.map +1 -1
  59. package/dist/process/manager.js +105 -1
  60. package/dist/process/manager.js.map +1 -1
  61. package/dist/tui/index.d.ts.map +1 -1
  62. package/dist/tui/index.js +223 -32
  63. package/dist/tui/index.js.map +1 -1
  64. package/dist/ui/help.d.ts.map +1 -1
  65. package/dist/ui/help.js +10 -0
  66. package/dist/ui/help.js.map +1 -1
  67. 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;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 statsStr = `${state.servers.length} server${state.servers.length !== 1 ? 's' : ''} · ${runningCount} running`;
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 (state.servers.length === 0) {
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} t copy trial command`, leftW);
162
- const r4 = pad(` ${B.dot} n copy create command`, leftW);
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 - 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)));
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
- 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 };
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 slug = clip(s.slug, leftW - 16).padEnd(Math.min(18, leftW - 16));
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
- let colored = ` ${selArrow} ${A.dim}${numStr}${A.reset} ${dotColor} ${slug} ${portColor}`;
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 sel = state.servers[state.selectedIndex];
204
- if (sel) {
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 (state.servers.length === 0) {
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 connect my-files --client claude`,
304
- ` 6. hoolix client status`,
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 t for templates · n for create command.`,
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 logTitle = sel ? ` Log: ${sel.slug} ` : ' Log ';
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 · v verify · c connect · x reindex/secrets · n new · t templates · r refresh · q quit';
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.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) : [];
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 noServers = servers.length === 0;
391
- const slug = servers[state.selectedIndex]?.slug;
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 < servers.length) {
493
+ if (idx < totalItems) {
396
494
  state.selectedIndex = idx;
397
- state.logTail = await readLastLogLines(servers[idx].slug);
495
+ await readSelectedLog();
398
496
  }
399
497
  return;
400
498
  }
401
499
  if (key === '' && !noServers) { // ↑
402
500
  state.selectedIndex = Math.max(0, state.selectedIndex - 1);
403
- state.logTail = await readLastLogLines(servers[state.selectedIndex].slug);
501
+ await readSelectedLog();
404
502
  return;
405
503
  }
406
504
  if (key === '' && !noServers) { // ↓
407
- state.selectedIndex = Math.min(servers.length - 1, state.selectedIndex + 1);
408
- state.logTail = await readLastLogLines(servers[state.selectedIndex].slug);
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,