hoolix 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +47 -1
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +8 -0
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +23 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/gateway.d.ts +2 -0
- package/dist/commands/gateway.d.ts.map +1 -0
- package/dist/commands/gateway.js +230 -0
- package/dist/commands/gateway.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +22 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/core/gateways.d.ts +62 -0
- package/dist/core/gateways.d.ts.map +1 -0
- package/dist/core/gateways.js +115 -0
- package/dist/core/gateways.js.map +1 -0
- package/dist/core/paths.d.ts +5 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +15 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/version.d.ts +1 -1
- package/dist/core/version.js +1 -1
- package/dist/index.js +26 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/gateway-host.d.ts +8 -0
- package/dist/mcp/gateway-host.d.ts.map +1 -0
- package/dist/mcp/gateway-host.js +380 -0
- package/dist/mcp/gateway-host.js.map +1 -0
- package/dist/mcp/proxy-host.d.ts.map +1 -1
- package/dist/mcp/proxy-host.js +3 -2
- package/dist/mcp/proxy-host.js.map +1 -1
- package/dist/process/manager.d.ts +17 -1
- package/dist/process/manager.d.ts.map +1 -1
- package/dist/process/manager.js +105 -1
- package/dist/process/manager.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +190 -32
- package/dist/tui/index.js.map +1 -1
- package/dist/ui/help.d.ts.map +1 -1
- package/dist/ui/help.js +5 -0
- package/dist/ui/help.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createGateway, getGateway, listGateways } from '../core/gateways.js';
|
|
4
|
+
import { serverManager } from '../process/manager.js';
|
|
5
|
+
import { logger } from '../core/logger.js';
|
|
6
|
+
import { ALL_CLIENTS, copyToClipboard, detectPreferredClient, getClientSteps, getConfigPath } from './connect.js';
|
|
7
|
+
import { printTitle, printSection, printDetails, printCommand, printJson, printTable, ui } from '../ui/format.js';
|
|
8
|
+
function parseIncludes(args) {
|
|
9
|
+
const includes = [];
|
|
10
|
+
for (let i = 0; i < args.length; i++) {
|
|
11
|
+
if (args[i] === '--include' && args[i + 1])
|
|
12
|
+
includes.push(args[i + 1]);
|
|
13
|
+
}
|
|
14
|
+
return includes;
|
|
15
|
+
}
|
|
16
|
+
function getPortArg(args) {
|
|
17
|
+
const idx = args.indexOf('--port');
|
|
18
|
+
return idx !== -1 ? parseInt(args[idx + 1] || '0', 10) || undefined : undefined;
|
|
19
|
+
}
|
|
20
|
+
function buildHttpEntry(authKey, port) {
|
|
21
|
+
return {
|
|
22
|
+
type: 'streamable-http',
|
|
23
|
+
url: `http://127.0.0.1:${port}/mcp`,
|
|
24
|
+
headers: { Authorization: `Bearer ${authKey}` },
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function buildPayload(client, slug, entry, isProject) {
|
|
28
|
+
if (client === 'vscode' && isProject) {
|
|
29
|
+
return { key: 'servers', payload: { servers: { [slug]: entry } } };
|
|
30
|
+
}
|
|
31
|
+
return { key: 'mcpServers', payload: { mcpServers: { [slug]: entry } } };
|
|
32
|
+
}
|
|
33
|
+
async function writeClientConfig(client, key, payload, isProject) {
|
|
34
|
+
const cfgPath = getConfigPath(client, { projectCwd: isProject ? process.cwd() : undefined });
|
|
35
|
+
if (!cfgPath)
|
|
36
|
+
return null;
|
|
37
|
+
let existing = {};
|
|
38
|
+
if (await fs.pathExists(cfgPath)) {
|
|
39
|
+
try {
|
|
40
|
+
existing = await fs.readJson(cfgPath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
existing = {};
|
|
44
|
+
}
|
|
45
|
+
const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
46
|
+
await fs.copy(cfgPath, `${cfgPath}.${ts}.bak`).catch(() => { });
|
|
47
|
+
}
|
|
48
|
+
if (!existing[key] || typeof existing[key] !== 'object')
|
|
49
|
+
existing[key] = {};
|
|
50
|
+
existing[key] = { ...existing[key], ...(payload[key] ?? {}) };
|
|
51
|
+
await fs.ensureDir(path.dirname(cfgPath));
|
|
52
|
+
await fs.writeJson(cfgPath, existing, { spaces: 2 });
|
|
53
|
+
return cfgPath;
|
|
54
|
+
}
|
|
55
|
+
export async function cmdGateway(args, json) {
|
|
56
|
+
const sub = args[1] || 'list';
|
|
57
|
+
if (sub === 'create') {
|
|
58
|
+
const name = args[2];
|
|
59
|
+
const includes = parseIncludes(args);
|
|
60
|
+
if (!name || includes.length === 0) {
|
|
61
|
+
if (json)
|
|
62
|
+
printJson({ ok: false, error: 'Usage: hoolix gateway create <name> --include <server-slug> ...' });
|
|
63
|
+
else
|
|
64
|
+
logger.error('Usage: hoolix gateway create <name> --include <server-slug> --include <server-slug>');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const gateway = await createGateway(name, includes);
|
|
69
|
+
if (json) {
|
|
70
|
+
printJson({ ok: true, gateway, next: [`hoolix gateway start ${gateway.slug}`, `hoolix gateway connect ${gateway.slug} --client codex`] });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
printTitle('Gateway created', `"${gateway.name}" aggregates ${gateway.backends.length} MCP server(s).`);
|
|
74
|
+
printDetails([
|
|
75
|
+
['Slug', gateway.slug],
|
|
76
|
+
['Backends', gateway.backends.map((backend) => `${backend.namespace}=${backend.slug}`).join(', ')],
|
|
77
|
+
['Auth', 'generated'],
|
|
78
|
+
]);
|
|
79
|
+
console.log('');
|
|
80
|
+
printSection('Next steps');
|
|
81
|
+
printCommand(`hoolix gateway start ${gateway.slug}`);
|
|
82
|
+
printCommand(`hoolix gateway connect ${gateway.slug} --client codex`);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
86
|
+
if (json)
|
|
87
|
+
printJson({ ok: false, error: message });
|
|
88
|
+
else
|
|
89
|
+
logger.error(message);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (sub === 'list') {
|
|
95
|
+
const gateways = await listGateways();
|
|
96
|
+
const rows = await Promise.all(gateways.map(async (gateway) => {
|
|
97
|
+
const status = await serverManager.getGatewayStatus(gateway.slug);
|
|
98
|
+
return {
|
|
99
|
+
Name: gateway.name,
|
|
100
|
+
Slug: gateway.slug,
|
|
101
|
+
Status: status.running && status.port ? `gateway:${status.port}` : 'stopped',
|
|
102
|
+
Backends: gateway.backends.map((backend) => backend.namespace).join(', '),
|
|
103
|
+
Created: gateway.createdAt.slice(0, 10),
|
|
104
|
+
};
|
|
105
|
+
}));
|
|
106
|
+
if (json) {
|
|
107
|
+
printJson(await Promise.all(gateways.map(async (gateway) => ({ ...gateway, status: await serverManager.getGatewayStatus(gateway.slug) }))));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (gateways.length === 0) {
|
|
111
|
+
printTitle('Gateways', 'No unified MCP gateways yet.');
|
|
112
|
+
printCommand('hoolix gateway create my-tools --include github --include filesystem --include brave-search');
|
|
113
|
+
printCommand('hoolix install github-api --name github --yes');
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
printTitle('Gateways', `${gateways.length} unified gateway${gateways.length === 1 ? '' : 's'}`);
|
|
117
|
+
printTable(rows);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (sub === 'start') {
|
|
121
|
+
const slug = args[2];
|
|
122
|
+
if (!slug) {
|
|
123
|
+
if (json)
|
|
124
|
+
printJson({ ok: false, error: 'Missing gateway name. Next: hoolix gateway start <name>.' });
|
|
125
|
+
else
|
|
126
|
+
logger.error('Usage: hoolix gateway start <name> [--port N]');
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
const gateway = await getGateway(slug);
|
|
130
|
+
const port = getPortArg(args);
|
|
131
|
+
const started = await serverManager.startGateway(gateway.slug, { port, authKey: gateway.authKey });
|
|
132
|
+
if (json) {
|
|
133
|
+
printJson({
|
|
134
|
+
ok: true,
|
|
135
|
+
gateway: gateway.slug,
|
|
136
|
+
mode: 'gateway',
|
|
137
|
+
port: started.port,
|
|
138
|
+
pid: started.pid,
|
|
139
|
+
url: `http://127.0.0.1:${started.port}/mcp`,
|
|
140
|
+
mcpServers: { [gateway.slug]: buildHttpEntry(gateway.authKey, started.port) },
|
|
141
|
+
});
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
printTitle('Gateway running', `"${gateway.name}" is one MCP endpoint for ${gateway.backends.length} server(s).`);
|
|
145
|
+
printDetails([
|
|
146
|
+
['URL', `http://127.0.0.1:${started.port}/mcp`],
|
|
147
|
+
['Auth', `Authorization: Bearer ${gateway.authKey}`],
|
|
148
|
+
['Backends', gateway.backends.map((backend) => `${backend.namespace}.${backend.slug}`).join(', ')],
|
|
149
|
+
['PID', started.pid],
|
|
150
|
+
]);
|
|
151
|
+
console.log('');
|
|
152
|
+
printCommand(`hoolix gateway connect ${gateway.slug} --client codex`);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (sub === 'stop') {
|
|
156
|
+
const slug = args[2];
|
|
157
|
+
if (!slug) {
|
|
158
|
+
if (json)
|
|
159
|
+
printJson({ ok: false, error: 'Missing gateway name. Next: hoolix gateway stop <name>.' });
|
|
160
|
+
else
|
|
161
|
+
logger.error('Usage: hoolix gateway stop <name>');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
const stopped = await serverManager.stopGateway(slug);
|
|
165
|
+
if (json)
|
|
166
|
+
printJson({ ok: true, gateway: slug, stopped });
|
|
167
|
+
else if (stopped)
|
|
168
|
+
logger.success(`Stopped gateway ${slug}`);
|
|
169
|
+
else
|
|
170
|
+
logger.info(`Gateway ${slug} was not running.`);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (sub === 'connect') {
|
|
174
|
+
const slug = args[2];
|
|
175
|
+
if (!slug) {
|
|
176
|
+
if (json)
|
|
177
|
+
printJson({ ok: false, error: 'Missing gateway name. Next: hoolix gateway connect <name> --client codex.' });
|
|
178
|
+
else
|
|
179
|
+
logger.error('Usage: hoolix gateway connect <name> --client <client>');
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
const gateway = await getGateway(slug);
|
|
183
|
+
const status = await serverManager.getGatewayStatus(gateway.slug);
|
|
184
|
+
const port = status.port || getPortArg(args);
|
|
185
|
+
if (!port) {
|
|
186
|
+
if (json)
|
|
187
|
+
printJson({ ok: false, error: `Gateway "${gateway.slug}" is not running. Next: hoolix gateway start ${gateway.slug}.` });
|
|
188
|
+
else
|
|
189
|
+
logger.error(`Gateway "${gateway.slug}" is not running. Next: hoolix gateway start ${gateway.slug}.`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
const clientIdx = args.indexOf('--client');
|
|
193
|
+
let client = (clientIdx !== -1 ? args[clientIdx + 1] : undefined);
|
|
194
|
+
if (!client || !ALL_CLIENTS.includes(client))
|
|
195
|
+
client = json ? 'generic' : detectPreferredClient();
|
|
196
|
+
const isProject = args.includes('--project');
|
|
197
|
+
const isDryRun = args.includes('--dry-run');
|
|
198
|
+
const entry = buildHttpEntry(gateway.authKey, port);
|
|
199
|
+
const { key, payload } = buildPayload(client, gateway.slug, entry, isProject);
|
|
200
|
+
if (json) {
|
|
201
|
+
printJson({ ...payload, transport: 'http', gateway: gateway.slug, client });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const cfgPath = isDryRun ? null : await writeClientConfig(client, key, payload, isProject);
|
|
205
|
+
printTitle('Gateway connect ready', `"${gateway.name}" → ${client}`);
|
|
206
|
+
printSection('MCP config snippet');
|
|
207
|
+
const entryStr = JSON.stringify(payload, null, 2);
|
|
208
|
+
console.log(entryStr);
|
|
209
|
+
console.log('');
|
|
210
|
+
if (cfgPath)
|
|
211
|
+
console.log(` ${ui.success('✓')} Merged into ${cfgPath}`);
|
|
212
|
+
else if (isDryRun)
|
|
213
|
+
console.log(` ${ui.warning('○')} Dry run — no files written.`);
|
|
214
|
+
else
|
|
215
|
+
console.log(` ${ui.muted('Manual config for this client; no safe auto-write path.')}`);
|
|
216
|
+
console.log('');
|
|
217
|
+
printSection(`Next steps for ${client}`);
|
|
218
|
+
getClientSteps(client, 'http').forEach((step, i) => console.log(` ${i + 1}. ${step}`));
|
|
219
|
+
console.log('');
|
|
220
|
+
if (copyToClipboard(entryStr))
|
|
221
|
+
console.log(` ${ui.success('✓')} Snippet copied to clipboard.`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (json)
|
|
225
|
+
printJson({ ok: false, error: `Unknown gateway command "${sub}". Next: use create, list, start, stop, or connect.` });
|
|
226
|
+
else
|
|
227
|
+
logger.error(`Unknown gateway command "${sub}". Next: run hoolix gateway list.`);
|
|
228
|
+
process.exit(1);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/commands/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAOA,wBAAsB,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G1D"}
|
package/dist/commands/list.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import { validateServerState } from '../core/registry.js';
|
|
2
2
|
import { getServerSourceLabel, listRegisteredServers } from '../app/services/servers.js';
|
|
3
3
|
import { serverManager } from '../process/manager.js';
|
|
4
|
+
import { listGateways } from '../core/gateways.js';
|
|
4
5
|
import { logger } from '../core/logger.js';
|
|
5
6
|
import { printTitle, printSection, printCommand, printTable, printJson, truncate, getFreshness, formatDate, ui } from '../ui/format.js';
|
|
6
7
|
export async function cmdList(json) {
|
|
7
8
|
const servers = await listRegisteredServers();
|
|
9
|
+
const gateways = await listGateways();
|
|
8
10
|
if (json) {
|
|
9
|
-
printJson(servers);
|
|
11
|
+
printJson({ servers, gateways: await Promise.all(gateways.map(async (gateway) => ({ ...gateway, status: await serverManager.getGatewayStatus(gateway.slug) }))) });
|
|
10
12
|
return;
|
|
11
13
|
}
|
|
12
|
-
if (servers.length === 0) {
|
|
13
|
-
printTitle('Servers', 'No MCP servers registered yet.');
|
|
14
|
+
if (servers.length === 0 && gateways.length === 0) {
|
|
15
|
+
printTitle('Servers + Gateways', 'No MCP servers or unified gateways registered yet.');
|
|
14
16
|
printSection('Create your first server');
|
|
15
17
|
printCommand('hoolix install filesystem /Users/jay/projects --yes');
|
|
16
18
|
printCommand('hoolix install github-api --yes');
|
|
19
|
+
printCommand('hoolix gateway create my-tools --include github --include filesystem');
|
|
17
20
|
printCommand('hoolix create "My Docs" --url https://example.com/docs/llms.txt');
|
|
18
21
|
printCommand('hoolix templates list');
|
|
19
22
|
console.log('');
|
|
@@ -68,6 +71,22 @@ export async function cmdList(json) {
|
|
|
68
71
|
});
|
|
69
72
|
printTable(rows);
|
|
70
73
|
console.log('');
|
|
74
|
+
if (gateways.length > 0) {
|
|
75
|
+
const gatewayRows = await Promise.all(gateways.map(async (gateway) => {
|
|
76
|
+
const st = await serverManager.getGatewayStatus(gateway.slug);
|
|
77
|
+
return {
|
|
78
|
+
Name: gateway.name,
|
|
79
|
+
Slug: gateway.slug,
|
|
80
|
+
Kind: 'gateway',
|
|
81
|
+
Status: st.running && st.port ? `gateway:${st.port}` : 'stopped',
|
|
82
|
+
Backends: gateway.backends.map((backend) => backend.namespace).join(', '),
|
|
83
|
+
Created: formatDate(gateway.createdAt),
|
|
84
|
+
};
|
|
85
|
+
}));
|
|
86
|
+
printSection('Unified gateways');
|
|
87
|
+
printTable(gatewayRows);
|
|
88
|
+
console.log('');
|
|
89
|
+
}
|
|
71
90
|
const proxyRunning = Object.values(statusMap).filter((s) => s.running && s.mode === 'proxy');
|
|
72
91
|
if (proxyRunning.length > 0) {
|
|
73
92
|
console.log(` ${ui.success('●')} ${proxyRunning.length} mcp-server(s) running in proxy mode. Use ${ui.accent('hoolix connect <slug>')} for HTTP config.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAExI,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAa;IACzC,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const GatewayBackingSchema: z.ZodObject<{
|
|
3
|
+
slug: z.ZodString;
|
|
4
|
+
namespace: z.ZodString;
|
|
5
|
+
templateId: z.ZodOptional<z.ZodString>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
slug: string;
|
|
8
|
+
namespace: string;
|
|
9
|
+
templateId?: string | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
slug: string;
|
|
12
|
+
namespace: string;
|
|
13
|
+
templateId?: string | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const GatewayConfigSchema: z.ZodObject<{
|
|
16
|
+
name: z.ZodString;
|
|
17
|
+
slug: z.ZodString;
|
|
18
|
+
authKey: z.ZodString;
|
|
19
|
+
backends: z.ZodArray<z.ZodObject<{
|
|
20
|
+
slug: z.ZodString;
|
|
21
|
+
namespace: z.ZodString;
|
|
22
|
+
templateId: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
slug: string;
|
|
25
|
+
namespace: string;
|
|
26
|
+
templateId?: string | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
slug: string;
|
|
29
|
+
namespace: string;
|
|
30
|
+
templateId?: string | undefined;
|
|
31
|
+
}>, "many">;
|
|
32
|
+
createdAt: z.ZodString;
|
|
33
|
+
lastUpdatedAt: z.ZodString;
|
|
34
|
+
}, "strip", z.ZodTypeAny, {
|
|
35
|
+
name: string;
|
|
36
|
+
slug: string;
|
|
37
|
+
createdAt: string;
|
|
38
|
+
lastUpdatedAt: string;
|
|
39
|
+
authKey: string;
|
|
40
|
+
backends: {
|
|
41
|
+
slug: string;
|
|
42
|
+
namespace: string;
|
|
43
|
+
templateId?: string | undefined;
|
|
44
|
+
}[];
|
|
45
|
+
}, {
|
|
46
|
+
name: string;
|
|
47
|
+
slug: string;
|
|
48
|
+
createdAt: string;
|
|
49
|
+
lastUpdatedAt: string;
|
|
50
|
+
authKey: string;
|
|
51
|
+
backends: {
|
|
52
|
+
slug: string;
|
|
53
|
+
namespace: string;
|
|
54
|
+
templateId?: string | undefined;
|
|
55
|
+
}[];
|
|
56
|
+
}>;
|
|
57
|
+
export type GatewayBacking = z.infer<typeof GatewayBackingSchema>;
|
|
58
|
+
export type GatewayConfig = z.infer<typeof GatewayConfigSchema>;
|
|
59
|
+
export declare function createGateway(name: string, includes: string[]): Promise<GatewayConfig>;
|
|
60
|
+
export declare function listGateways(): Promise<GatewayConfig[]>;
|
|
61
|
+
export declare function getGateway(slug: string): Promise<GatewayConfig>;
|
|
62
|
+
//# sourceMappingURL=gateways.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateways.d.ts","sourceRoot":"","sources":["../../src/core/gateways.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAI/B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO9B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAkDhE,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAwC5F;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAW7D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAMrE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { ensureDirectories, getGatewayConfigPath, getGatewayDataDir, getGatewayDir, getPaths, } from './paths.js';
|
|
5
|
+
import { generateAuthKey } from '../lib/auth.js';
|
|
6
|
+
import { getServerMetadata, slugify } from './registry.js';
|
|
7
|
+
export const GatewayBackingSchema = z.object({
|
|
8
|
+
slug: z.string().regex(/^[a-z0-9-]{1,64}$/),
|
|
9
|
+
namespace: z.string().regex(/^[a-z0-9][a-z0-9-]{0,63}$/),
|
|
10
|
+
templateId: z.string().optional(),
|
|
11
|
+
});
|
|
12
|
+
export const GatewayConfigSchema = z.object({
|
|
13
|
+
name: z.string(),
|
|
14
|
+
slug: z.string().regex(/^[a-z0-9-]{1,64}$/),
|
|
15
|
+
authKey: z.string().min(16),
|
|
16
|
+
backends: z.array(GatewayBackingSchema).min(1),
|
|
17
|
+
createdAt: z.string().datetime(),
|
|
18
|
+
lastUpdatedAt: z.string().datetime(),
|
|
19
|
+
});
|
|
20
|
+
const GATEWAY_INDEX_FILE = 'gateways.json';
|
|
21
|
+
function gatewayIndexPath() {
|
|
22
|
+
return path.join(getPaths().data, GATEWAY_INDEX_FILE);
|
|
23
|
+
}
|
|
24
|
+
async function loadGatewayIndex() {
|
|
25
|
+
await ensureDirectories();
|
|
26
|
+
const indexPath = gatewayIndexPath();
|
|
27
|
+
if (!(await fs.pathExists(indexPath))) {
|
|
28
|
+
const fresh = { version: '1.0.0', gateways: {} };
|
|
29
|
+
await fs.writeJson(indexPath, fresh, { spaces: 2 });
|
|
30
|
+
return fresh;
|
|
31
|
+
}
|
|
32
|
+
return fs.readJson(indexPath);
|
|
33
|
+
}
|
|
34
|
+
async function saveGatewayIndex(index) {
|
|
35
|
+
await fs.writeJson(gatewayIndexPath(), index, { spaces: 2 });
|
|
36
|
+
}
|
|
37
|
+
function namespaceFromTemplate(templateId, slug) {
|
|
38
|
+
const base = templateId || slug;
|
|
39
|
+
return slugify(base.replace(/-api$/, '').replace(/-search$/, ''));
|
|
40
|
+
}
|
|
41
|
+
function dedupeNamespace(namespace, seen, fallback) {
|
|
42
|
+
if (!seen.has(namespace)) {
|
|
43
|
+
seen.add(namespace);
|
|
44
|
+
return namespace;
|
|
45
|
+
}
|
|
46
|
+
const bySlug = slugify(fallback);
|
|
47
|
+
if (!seen.has(bySlug)) {
|
|
48
|
+
seen.add(bySlug);
|
|
49
|
+
return bySlug;
|
|
50
|
+
}
|
|
51
|
+
let i = 2;
|
|
52
|
+
while (seen.has(`${bySlug}-${i}`))
|
|
53
|
+
i++;
|
|
54
|
+
const next = `${bySlug}-${i}`;
|
|
55
|
+
seen.add(next);
|
|
56
|
+
return next;
|
|
57
|
+
}
|
|
58
|
+
export async function createGateway(name, includes) {
|
|
59
|
+
const slug = slugify(name);
|
|
60
|
+
const uniqueIncludes = [...new Set(includes.map((include) => slugify(include)).filter(Boolean))];
|
|
61
|
+
if (uniqueIncludes.length === 0) {
|
|
62
|
+
throw new Error('Gateway needs at least one --include <server-slug>. Next: run hoolix list.');
|
|
63
|
+
}
|
|
64
|
+
const index = await loadGatewayIndex();
|
|
65
|
+
if (index.gateways[slug]) {
|
|
66
|
+
throw new Error(`Gateway "${slug}" already exists. Next: run hoolix gateway list.`);
|
|
67
|
+
}
|
|
68
|
+
const seenNamespaces = new Set();
|
|
69
|
+
const backends = [];
|
|
70
|
+
for (const include of uniqueIncludes) {
|
|
71
|
+
const meta = await getServerMetadata(include);
|
|
72
|
+
if ((meta.serverKind ?? 'docs-rag') !== 'mcp-server') {
|
|
73
|
+
throw new Error(`"${include}" is ${meta.serverKind ?? 'docs-rag'}, not mcp-server. Next: include only installed MCP server templates.`);
|
|
74
|
+
}
|
|
75
|
+
const templateId = meta.definition?.template?.id;
|
|
76
|
+
const namespace = dedupeNamespace(namespaceFromTemplate(templateId, meta.slug), seenNamespaces, meta.slug);
|
|
77
|
+
backends.push({ slug: meta.slug, namespace, templateId });
|
|
78
|
+
}
|
|
79
|
+
const now = new Date().toISOString();
|
|
80
|
+
const config = {
|
|
81
|
+
name,
|
|
82
|
+
slug,
|
|
83
|
+
authKey: generateAuthKey(),
|
|
84
|
+
backends,
|
|
85
|
+
createdAt: now,
|
|
86
|
+
lastUpdatedAt: now,
|
|
87
|
+
};
|
|
88
|
+
await fs.ensureDir(getGatewayDir(slug));
|
|
89
|
+
await fs.ensureDir(getGatewayDataDir(slug));
|
|
90
|
+
await fs.writeJson(getGatewayConfigPath(slug), config, { spaces: 2 });
|
|
91
|
+
index.gateways[slug] = { slug, path: getGatewayDir(slug) };
|
|
92
|
+
await saveGatewayIndex(index);
|
|
93
|
+
return config;
|
|
94
|
+
}
|
|
95
|
+
export async function listGateways() {
|
|
96
|
+
const index = await loadGatewayIndex();
|
|
97
|
+
const gateways = [];
|
|
98
|
+
for (const { slug } of Object.values(index.gateways)) {
|
|
99
|
+
try {
|
|
100
|
+
gateways.push(await getGateway(slug));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Ignore corrupt gateway entries in list output.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return gateways.sort((a, b) => a.name.localeCompare(b.name));
|
|
107
|
+
}
|
|
108
|
+
export async function getGateway(slug) {
|
|
109
|
+
const pathToConfig = getGatewayConfigPath(slugify(slug));
|
|
110
|
+
if (!(await fs.pathExists(pathToConfig))) {
|
|
111
|
+
throw new Error(`Gateway "${slug}" not found. Next: run hoolix gateway list.`);
|
|
112
|
+
}
|
|
113
|
+
return GatewayConfigSchema.parse(await fs.readJson(pathToConfig));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=gateways.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateways.js","sourceRoot":"","sources":["../../src/core/gateways.ts"],"names":[],"mappings":"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"}
|
package/dist/core/paths.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export interface AppPaths {
|
|
|
2
2
|
data: string;
|
|
3
3
|
config: string;
|
|
4
4
|
servers: string;
|
|
5
|
+
gateways: string;
|
|
5
6
|
cache: string;
|
|
6
7
|
}
|
|
7
8
|
export declare function getPaths(): AppPaths;
|
|
@@ -12,4 +13,8 @@ export declare function getServerMetadataPath(slug: string): string;
|
|
|
12
13
|
export declare function getServerDataDir(slug: string): string;
|
|
13
14
|
export declare function getServerRuntimePath(slug: string): string;
|
|
14
15
|
export declare function getServerCredentialsPath(slug: string): string;
|
|
16
|
+
export declare function getGatewayDir(name: string): string;
|
|
17
|
+
export declare function getGatewayConfigPath(name: string): string;
|
|
18
|
+
export declare function getGatewayRuntimePath(name: string): string;
|
|
19
|
+
export declare function getGatewayDataDir(name: string): string;
|
|
15
20
|
//# sourceMappingURL=paths.d.ts.map
|
package/dist/core/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,QAAQ,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,QAAQ,IAAI,QAAQ,CAuBnC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAO3D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
package/dist/core/paths.js
CHANGED
|
@@ -13,12 +13,14 @@ export function getPaths() {
|
|
|
13
13
|
// all share the same isolated filesystem root without test-only branches elsewhere.
|
|
14
14
|
const data = process.env[DATA_DIR_ENV] || paths.data;
|
|
15
15
|
const servers = path.join(data, 'servers');
|
|
16
|
+
const gateways = path.join(data, 'gateways');
|
|
16
17
|
const config = path.join(data, 'config.json');
|
|
17
18
|
const cache = path.join(data, 'cache');
|
|
18
19
|
cachedPaths = {
|
|
19
20
|
data,
|
|
20
21
|
config,
|
|
21
22
|
servers,
|
|
23
|
+
gateways,
|
|
22
24
|
cache,
|
|
23
25
|
};
|
|
24
26
|
return cachedPaths;
|
|
@@ -30,6 +32,7 @@ export async function ensureDirectories() {
|
|
|
30
32
|
const p = getPaths();
|
|
31
33
|
await fs.ensureDir(p.data);
|
|
32
34
|
await fs.ensureDir(p.servers);
|
|
35
|
+
await fs.ensureDir(p.gateways);
|
|
33
36
|
await fs.ensureDir(p.cache);
|
|
34
37
|
return p;
|
|
35
38
|
}
|
|
@@ -48,4 +51,16 @@ export function getServerRuntimePath(slug) {
|
|
|
48
51
|
export function getServerCredentialsPath(slug) {
|
|
49
52
|
return path.join(getServerDir(slug), 'credentials.json');
|
|
50
53
|
}
|
|
54
|
+
export function getGatewayDir(name) {
|
|
55
|
+
return path.join(getPaths().gateways, name);
|
|
56
|
+
}
|
|
57
|
+
export function getGatewayConfigPath(name) {
|
|
58
|
+
return path.join(getGatewayDir(name), 'gateway.json');
|
|
59
|
+
}
|
|
60
|
+
export function getGatewayRuntimePath(name) {
|
|
61
|
+
return path.join(getGatewayDir(name), '.runtime.json');
|
|
62
|
+
}
|
|
63
|
+
export function getGatewayDataDir(name) {
|
|
64
|
+
return path.join(getGatewayDir(name), 'data');
|
|
65
|
+
}
|
|
51
66
|
//# sourceMappingURL=paths.js.map
|
package/dist/core/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAC1B,MAAM,YAAY,GAAG,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
|
package/dist/core/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.0.
|
|
1
|
+
export declare const VERSION = "0.0.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/core/version.js
CHANGED